Компиляция завершается с ошибкой " перемещение R X86 64 32 против `.rodata.str1. 8 ' не может быть использован при создании общего объекта"


Я пытаюсь скомпилировать этот исходный код из файла Makefile в VPS, но он не работает. ВПС-это 64 цента ОС

вот полная ошибка

# 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

вот мой makefile:

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

кто-нибудь знает что случилось?

5 58

5 ответов:

делать то, что компилятор говорит вам делать, т. е. перекомпилировать с -fPIC. Чтобы узнать, что делает этот флаг и зачем он вам нужен в этом случае, см. Параметры Генерации Кода руководства GCC.

короче говоря, термин позиционно-независимый код (PIC) относится к сгенерированному машинному коду, который является агностическим адресом памяти, т. е. не делает никаких предположений о том, где он был загружен в ОЗУ. Только позиционно-независимый код должен быть включены в общие объекты (SO), так как они должны иметь возможность динамически изменять свое местоположение в ОЗУ.

наконец, вы можете прочитать об этом на Википедия тоже.

в моем случае эта ошибка произошла, потому что make команда ожидала получить общие библиотеки (*.so файлы) из удаленного каталога обозначается LDFLAGS переменные среды. По ошибке там были доступны только статические библиотеки (*.la или *.a файлы).

следовательно, моя проблема заключалась не в программе, которую я компилировал, а в удаленных библиотеках, которые он пытался извлечь. Итак, мне не нужно было добавлять какой-либо флаг (скажем,-fPIC) для составления прервано из-за ошибки перемещения. Вместо этого я перекомпилировал удаленную библиотеку так, чтобы общие объекты были доступны.

в основном, это была замаскированная ошибка "файл не найден".

в моем случае мне пришлось удалить неправильно --disable-shared переключатель configure ссылка для необходимых программ, так как общие и статические библиотеки были построены по умолчанию.


я заметил, что большинство программ строят оба типа библиотек в же время, так что у меня, наверное, случай. В общем, это может быть так, что вы скорее должны включить общие библиотеки, в зависимости от значений по умолчанию.

чтобы проверить вашу конкретную ситуацию с компиляцией коммутаторов и значений по умолчанию, я бы зачитал резюме, которое появляется с ./configure --help | less, как правило, в разделе дополнительных функций. Я часто обнаруживал, что это чтение более надежно, чем руководства по установке, которые не обновляются во время развития программ зависимостей.

Это не всегда о флагах компиляции, у меня есть такая же ошибка на gentoo при использовании distcc.

причина в том, что на сервере distcc используется незатвердевший профиль, а на клиенте профиль затвердевает. Проверьте это обсуждение: https://forums.gentoo.org/viewtopic-p-7463994.html

"чистый" решил это для меня.

мой проект-это приложение C++ (не общая библиотека), и я получил эту ошибку случайно один раз, когда пытался его скомпилировать.

У меня была та же проблема. Попробуйте перекомпилировать с помощью -fPIC флаг.