При связывании объектного файла сборки с GCC возникает ошибка перемещения из-за настройки errno.Linux

Ответить
Anonymous
 При связывании объектного файла сборки с GCC возникает ошибка перемещения из-за настройки errno.

Сообщение Anonymous »

В рамках школьного проекта меня попросили переписать функцию записи на ассемблере x86-64. В этом проекте есть некоторые правила. Например, точно так же, как запись устанавливает errno в случае ошибки, моя функция записи должна устанавливать errno таким же образом. Также запрещено использовать опцию gcc -no-pie для компиляции и компоновки. В Linux нам нужно установить переменную errno с помощью функции __errno_location в библиотеке errno.h. Поэтому я вызываю эту функцию в исходном файле сборки и устанавливаю ее в соответствии с требуемыми правилами. Затем я объявляю это в исходном файле main.c, чтобы использовать свою функцию записи, и использую ее для ее тестирования. Затем я ввожу команды операций компиляции и компоновки, чтобы выполнить процесс компоновки, но сталкиваюсь с проблемой при компоновке;

Код: Выделить всё

/usr/bin/ld: my_write.o: warning: relocation against `__errno_location@@GLIBC_2.2.5' in read-only section `.text'
/usr/bin/ld: my_write.o: relocation R_X86_64_PC32 against symbol `__errno_location@@GLIBC_2.2.5' can not be used when making a PIE object; recompile with -fPIE
/usr/bin/ld: final link failed: bad value
collect2: error: ld returned 1 exit status
компилятор говорит мне перекомпилировать, используя опцию -fPIE. Но когда я делаю это снова, он выдает то же сообщение об ошибке.
Если я компилирую с опцией -no-pie, он компилируется на этот раз, но это также противоречит правила
Есть идеи?

ниже я делюсь содержимым файлов и этапами компиляции;
my_write.s;

Код: Выделить всё

section .text
global my_write
extern __errno_location

my_write:
mov rax, 1
syscall
cmp rax, -1
je err
ret

err:
neg rax
mov rdi, rax
call __errno_location
mov [rax], rdi
mov rax, -1
ret
main.c

Код: Выделить всё

#include 
#include 
#include 
#include 
#include 
#include 

extern ssize_t my_write(int fd, const void *buf, size_t count);

int main(void)
{
char *str = "Hello";
my_write(1, str, 5);
}
компиляция и компоновка
1.

Код: Выделить всё

nasm -felf64 -o my_write.o my_write.s

Код: Выделить всё

gcc -o test main.c my_write.o

Код: Выделить всё

/usr/bin/ld: my_write.o: warning: relocation against `__errno_location@@GLIBC_2.2.5' in read-only section `.text'
/usr/bin/ld: my_write.o: relocation R_X86_64_PC32 against symbol `__errno_location@@GLIBC_2.2.5' can not be used when making a PIE object; recompile with -fPIE
/usr/bin/ld: final link failed: bad value
collect2: error: ld returned 1 exit status
дайте мне эту ошибку.

Подробнее здесь: https://stackoverflow.com/questions/791 ... urs-due-to
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»