У меня есть простая программа на ассемблере, которая печатает привет мир.Он использует функции printf и выхода из glibc путем динамической ссылки на него.
Если я использую эту версию компоновщика:
ld -dynamic-linker /lib64/ld-linux.so.2 -o helloworld-lib helloworld-lib.o -lc
Тогда я получаю эту ошибку, когда выполняю исполняемый файл: bash: ./helloworld-lib: Доступ к поврежденной общей библиотеке
Если я вместо этого использую:
ld -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o helloworld-lib helloworld-lib.o -lc
Тогда я получаю ошибку сегментации в строке, где я вызываю printf.
Вот как выглядит мой .s файл:
.section .data
helloworld:
.ascii "hello world\n\0"
.section .text
.globl _start
_start:
pushq $helloworld
call printf
pushq $0
call exit
Я использую 64-битную систему Ubuntu.Пожалуйста, уточните, что я здесь делаю не так.Спасибо.
Редактировать:
Если я заменю две строки:
pushq $helloworld
call printf
на:
movl $helloworld, %eax
movq %rax, %rdi
movl $0, %eax
call printf
movl $0, %eax
Тогда все будет работать нормально.