Сбой компиляции: "перемещение R_X86_64_32 против`.rodata.str1.8'не может быть использовано при создании общего объекта "
Я пытаюсь скомпилировать этот исходный код из make-файла в VPS, но он не работает. VPS - это операционная система 64 Cent
Вот полная ошибка
# make
gcc -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/amx/*.c
g++ -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/*.cpp
g++ -c -O3 -w -DLINUX -I../SDK/amx/ *.cpp
g++ -O2 -fshort-wchar -shared -o "TCP_V1.so" *.o
/usr/bin/ld: TCP-LINUX_V1.o: relocation R_X86_64_32 against `.rodata.str1.8' can not be used when making a shared object; recompile with -fPIC
TCP-LINUX_V1.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
make: *** [all] Error 1
Вот мой make-файл:
GPP=g++
GCC=gcc
OUTFILE="TCP_V1.so"
COMPILE_FLAGS=-c -O3 -w -DLINUX -I../SDK/amx/
all:
$(GCC) $(COMPILE_FLAGS) ../SDK/amx/*.c
$(GPP) $(COMPILE_FLAGS) ../SDK/*.cpp
$(GPP) $(COMPILE_FLAGS) *.cpp
$(GPP) -O2 -fshort-wchar -shared -o $(OUTFILE) *.o
Кто-нибудь знает, что не так?
9 ответов
Делайте то, что говорит вам компилятор, т.е. перекомпилируйте с -fPIC
, Чтобы узнать, что делает этот флаг и зачем он нужен в этом случае, см. Параметры генерации кода в руководстве GCC.
Вкратце, термин независимый от позиции код (PIC) относится к сгенерированному машинному коду, который не зависит от адреса памяти, то есть не делает никаких предположений о том, где он был загружен в ОЗУ. Предполагается, что в разделяемые объекты (SO) должен быть включен только независимый от позиции код, поскольку они должны иметь возможность динамически изменять свое местоположение в ОЗУ.
Наконец, вы также можете прочитать об этом в Википедии.
В моем случае эта ошибка произошла из-за make
команда ожидала получить разделяемые библиотеки (*.so
файлы) из удаленного каталога, обозначенного LDFLAGS
переменная окружения. По ошибке там были доступны только статические библиотеки (*.la
или же *.a
файлы).
Следовательно, моя проблема не в программе, которую я компилировал, а в удаленных библиотеках, которые она пыталась получить. Таким образом, мне не нужно было добавлять какие-либо флажки (скажем, -fPIC
) к компиляции, прерванной ошибкой перемещения. Скорее я перекомпилировал удаленную библиотеку, чтобы общие объекты были доступны.
По сути, это была скрытая ошибка не найденного файла.
В моем случае мне пришлось убрать неуместный --disable-shared
включить в configure
вызов необходимой программы, так как разделяемые и статические библиотеки были созданы по умолчанию.
Я заметил, что большинство программ собирают оба типа библиотек одновременно, так что моя, вероятно, угловая ситуация. В общем, это может быть случай, когда вам лучше включить общие библиотеки, в зависимости от настроек по умолчанию.
Чтобы проверить вашу конкретную ситуацию с параметрами компиляции и значениями по умолчанию, я бы зачитал сводку, которая отображается с ./configure --help | less
, как правило, в разделе Дополнительные функции. Я часто обнаруживал, что это чтение более надежно, чем руководства по установке, которые не обновляются в процессе развития зависимых программ.
Исправлено с -no-pie
опция в стадии компоновщика:
g++-8 -L"/home/pedro/workspace/project/lib" -no-pie ...
Это не всегда касается флагов компиляции, у меня та же ошибка на gentoo при использовании distcc.
Причина в том, что на сервере distcc используется незащищенный профиль, а на клиентском - защищенный. Проверьте это обсуждение: https://forums.gentoo.org/viewtopic-p-7463994.html
"Чистый" решил это за меня.
Мой проект - приложение C++ (не разделяемая библиотека), и я однажды получил эту ошибку случайно, когда попытался скомпилировать ее.
У меня такая же проблема. Попробуйте перекомпилировать с помощью -fPIC
флаг.
У нас была такая же проблема. Оказалось, что это путаница в Makefile. Ошибка произошла, когда компоновщик был
gcc
, но компилятор С++. Изменение линкера на
clang++
починил это.
Я получаю то же решение, что и комментарий @camino к ответу /questions/21532176/sboj-kompilyatsii-peremeschenie-rx866432-protivrodatastr18ne-mozhet-byit-ispolzovano-pri-sozdanii-obschego-obekta/21532203#21532203 и XavierStuvw.
Я заставил его работать (для установки ffmpeg), просто переустановив все это с самого начала со всеми экземплярами $ ./configure
заменен на $ ./configure --enable-shared
(сначала обязательно удалите все папки и файлы, включая файлы.so из предыдущей попытки).
По-видимому, это работает, потому что /questions/9582937/kak-perekompilirovat-s-fpic/9582946#9582946.
Я знаю, что этот вопрос был задан год назад. Я попробовал данную ошибку в своей системе. Я попытался смоделировать данную ошибку, используя файл Make, содержащий эту ошибку. Ошибка создания файла (каждая строка начинается с табуляции вместо нескольких пробелов):
all:
@echo "/usr/bin/gcc -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/amx/*.c";\
/usr/bin/gcc -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/amx/*.c;\
echo "/usr/bin/g++ -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/*.cpp";\
/usr/bin/g++ -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/*.cpp;\
echo "/usr/bin/g++ -c -O3 -w -DLINUX -I../SDK/amx/ *.cpp";\
/usr/bin/g++ -c -O3 -w -DLINUX -I../SDK/amx/ *.cpp;\
echo "/usr/bin/g++ -O2 -shared -o "TCP_V1.so" *.o";\
/usr/bin/g++ -O2 -shared -o "TCP_V1.so" *.o
Ошибка:
/usr/bin/gcc -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/amx/*.c
/usr/bin/g++ -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/*.cpp
/usr/bin/g++ -c -O3 -w -DLINUX -I../SDK/amx/ *.cpp
/usr/bin/g++ -O2 -shared -o TCP_V1.so *.o
/usr/bin/ld: one.o: relocation R_X86_64_32 against `.rodata.str1.1'
can not be used when making a shared object; recompile with -fPIC
one.o: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
Обновлен файл Make:
all:
@echo "/usr/bin/gcc -fPIC -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/amx/*.c";\
/usr/bin/gcc -fPIC -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/amx/*.c;\
echo "/usr/bin/g++ -fPIC -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/*.cpp";\
/usr/bin/g++ -fPIC -c -O3 -w -DLINUX -I../SDK/amx/ ../SDK/*.cpp;\
echo "/usr/bin/g++ -fPIC -c -O3 -w -DLINUX -I../SDK/amx/ *.cpp";\
/usr/bin/g++ -fPIC -c -O3 -w -DLINUX -I../SDK/amx/ *.cpp;\
echo "/usr/bin/g++ -O2 -shared -o "TCP_V1.so" *.o";\
/usr/bin/g++ -O2 -shared -o "TCP_V1.so" *.o