Получение ошибки релокации R_x86_64_32 при компиляции файла сборки. Работает на одной виртуальной машине, а не на другой

Полная ошибка, которую консоль возвращает мне, приведена ниже. Я использую Lubuntu на VirtualBox и VMware (пробовал оба). По какой-то причине он работает на моем ноутбуке, но не на моем рабочем столе. После того, как я попытался узнать больше через множество форумов сообщений, мне кажется, что что-то не так с самой ld в моей системе, но я недостаточно опытен, чтобы понять, что происходит не так. Я знаю, что «1 статус выхода» означает сбой, но это все. Я не знаю, почему это терпит неудачу. Не имеет ничего общего с моим кодом, если он будет работать на одной машине, а не на другой.

Я программирую на ассемблере с использованием компилятора YASM. Скрипт для компиляции находится под кодом ошибки

Код ошибки:

/usr/bin/ld: funcs.o: relocation R_X86_64_32 against `.data' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: error: ld returned 1 exit status

Компиляция скрипта:

g++ -g -c $1.cpp -lglut -lGLU -lGL -lm
yasm -g dwarf2 -f elf64 $2.asm -l $2.lst
g++ -g -o $1 $1.o $2.o -lglut -lGLU -lGL -lm

Обратите внимание, что хотя приведенный выше сценарий немного сложнее, простой сценарий, такой как приведенный ниже, также не будет работать.

yasm -g dwarf2 -f elf64 $1.asm
yasm -g dwarf2 -f elf64 $2.asm
gcc -g -o $1 $1.o $2.o

person Nick Graeff    schedule 07.03.2017    source источник
comment
Что такое funcs.o, это из вашего источника? Похоже, вы используете абсолютный адрес в режиме 64b какого-то символа, это невозможно сделать с общей библиотекой, поэтому вы можете либо переписать функции для использования относительной rip адресации в стиле PIC, либо в качестве быстрого грязного исправления МОЖЕТ быть достаточно поместить -static в компоновщик, поэтому все эти библиотеки перейдут в исполняемый файл (это не нравится в мире Linux, так как это делает ваш бинарный файл навсегда привязанным к версии libs, с которой он был связан, поэтому такой двоичный файл будет трудно зайти в любой официальный репозиторий).   -  person Ped7g    schedule 07.03.2017
comment
Некоторый намек на стиль asm PIC (но для NASM): stackoverflow.com/a/12061900/4271923   -  person Ped7g    schedule 07.03.2017
comment
Мне просто нужно, чтобы эта штука работала. Куда ставить статические, в каком порядке аргументы? Я почти не понимаю, что я здесь делаю, поэтому то, что вы говорили о рип-адресации, я вообще не понимаю. Означает ли что-нибудь тот факт, что это будет нормально связываться и загружаться на моем ноутбуке?   -  person Nick Graeff    schedule 07.03.2017
comment
@ Ped7g Я исправил это. Моя версия Linux была 16.04, поэтому я откатился на 14.04. Не уверен, в чем проблема, и на самом деле это не волнует на данный момент.   -  person Nick Graeff    schedule 07.03.2017
comment
Означает ли что-нибудь тот факт, что это будет прекрасно скомпоновано и загружено на моем ноутбуке? зависит... для вашего личного использования? Отлично, наслаждайтесь, пока это длится. Для распространения среди других пользователей ... возможно, уже недостаточно хорошо, но не беспокойтесь об этом, любое ПО, распространяемое в бинарном виде, мертво/зомби с первого дня. Только ПО, распространяемое как исходный код, может жить немного дольше. Хотя, учитывая прогресс человечества и вовлеченные временные масштабы, потребуется по крайней мере еще одно тысячелетие, чтобы оценить это должным образом, возможно, весь SW, созданный людьми, представляет собой небольшой 200-300-летний эпизод.   -  person Ped7g    schedule 07.03.2017
comment
Есть ли шанс, что вы используете 16.10 на одном и 16.04 на другом?   -  person Michael Petch    schedule 07.03.2017


Ответы (1)


Решением этой проблемы был переход с Lubuntu 16.10 на Lubuntu 14.04. В этой версии программа отлично работала в моей системе. Не уверен, что источник ошибки был помимо этого.

person Nick Graeff    schedule 10.03.2017
comment
Не могли бы вы сделать нам одолжение и показать нам свой код funcs.asm. - person Michael Petch; 10.03.2017
comment
Я установил свежий дистрибутив Lubuntu 16.04 (обновил все пакеты), клонировал ваш репозиторий git и использовал ваш скрипт sh для создания исполняемого файла. Это сработало. - person Michael Petch; 11.03.2017
comment
Чтобы обойти это в 16.10, вам нужно сделать позицию сборки независимой или, может быть, проще в строке linker создать исполняемый файл с параметром -no-pie. Так что попробуй g++ -g -o $1 $1.o $2.o -lglut -lGLU -lGL -lm -no-pie - person Michael Petch; 12.03.2017