Какой динамический компоновщик использовать на 64-битной Ubuntu - PullRequest
1 голос
/ 05 января 2012

У меня есть простая программа на ассемблере, которая печатает привет мир.Он использует функции 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

Тогда все будет работать нормально.

1 Ответ

0 голосов
/ 06 мая 2013

Я заменил код после _start на (используя соглашение о вызовах x86-64):

mov $helloworld, %rdi
call printf

mov $0, %rdi    
call exit

Далее я использовал:

as helloworld.s -o helloworld.o
ld -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o helloworld helloworld.o -lc

И он работает хорошо.

...