Ошибка компиляции с "перемещением 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
Вот мой 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
Кто-нибудь знает, что случилось?
Ответы
Ответ 1
Сделайте то, что говорит вам компилятор, т.е. перекомпилируйте с помощью -fPIC
. Чтобы узнать, что делает этот флаг и почему он нужен в этом случае, см. Параметры генерации кода руководства GCC.
Вкратце, термин независимый по позиции код (PIC) относится к сгенерированному машинного кода, который является агностическим адресом памяти, то есть не делает никаких предположений о том, где он был загружен в ОЗУ. Предполагается, что только один независимый от положения код должен быть включен в общие объекты (SO), поскольку они должны иметь возможность динамически изменять свое местоположение в ОЗУ.
Наконец, вы можете прочитать об этом на Wikipedia тоже.
Ответ 2
В моем случае эта ошибка возникла из-за того, что команда make
ожидала выборку общих библиотек (*.so
файлов) из удаленного каталога, обозначенного переменной среды LDFLAGS
. В ошибке были доступны только статические библиотеки (*.la
или *.a
файлы).
Следовательно, моя проблема не была связана с программой, которую я компилировал, но с удаленными библиотеками, которые она пыталась извлечь.
Таким образом, мне не нужно было добавлять какой-либо флаг (скажем, -fPIC
) к компиляции, прерванной ошибкой перемещения.
Скорее, я перекомпилировал удаленную библиотеку, чтобы были доступны общие объекты.
В основном, это была ошибка, не найденная в файле.
В моем случае мне пришлось удалить неулокальный переключатель --disable-shared
в вызове configure
для требуемой программы, поскольку общие и статические библиотеки были построены по умолчанию.
Я заметил, что большинство программ одновременно создают оба типа библиотек, поэтому мой, вероятно, является краеугольным. В общем случае, возможно, вам нужно включить разрешенные библиотеки в зависимости от настроек по умолчанию.
Чтобы проверить вашу ситуацию с помощью компиляционных переключателей и значений по умолчанию, я бы зачитал сводку, которая отображается с помощью ./configure --help | less
, как правило, в разделе Дополнительные функции. Я часто обнаружил, что это чтение является более надежным, чем руководства по установке, которые не обновляются, когда программы зависимостей развиваются.
Ответ 3
Это не всегда касается флагов компиляции, у меня такая же ошибка при gentoo при использовании distcc.
Причина заключается в том, что на сервере distcc используется не закаленный профиль, а на клиенте профиль закаливается. Проверьте это обсуждение:
https://forums.gentoo.org/viewtopic-p-7463994.html
Ответ 4
"Чистый" решил это за меня.
Мой проект - приложение C++ (не общая библиотека). Я случайно получил эту ошибку после многих успешных сборок.
Ответ 5
У меня такая же проблема. Попробуйте перекомпилировать, используя флаг -fPIC
.
Ответ 6
Исправлено с опцией -no-pie
на этапе компоновщика:
g++-8 -L"/home/pedro/workspace/project/lib" -no-pie ...