Сбой компиляции: "перемещение 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
Другие вопросы по тегам