Как вызвать библиотеку c из ассемблерного кода в Linux? - PullRequest
6 голосов
/ 20 июля 2011

Я пытаюсь собрать небольшую программу в сборке Linux на архитектуре Intel.Я хочу использовать некоторые функции библиотеки C, но она не связана.

Вот моя программа сборки:

.text
.globl main

main:
    pushl $512
    call malloc
    addl $4, %esp

    mov $1, %eax
    mov $0, %ebx
    int $0x80

Я компилирую здесь

as --32 -o output.o output.asm

, все идет хорошо.И затем, когда я связываюсь с

ld -static -m elf_i386 -o a.out output.o -lc

, я получаю следующие ошибки:

(. Text + 0x1b8): неопределенная ссылка на _Unwind_Resume' /usr/lib32/libc.a(iofclose.o):(.eh_frame+0x167): undefined reference to __ gcc_personality_v0 '/ usr /lib32 / libc.a (iofflush.o): в функции fflush': (.text+0xd7): undefined reference to _Unwind_Resume '/usr/lib32/libc.a(iofflush.o):(.eh_frame+0xdf): неопределенная ссылка на __gcc_personality_v0' /usr/lib32/libc.a(iofputs.o): In function fputs': (.text + 0x108): неопределенная ссылка на _Unwind_Resume' /usr/lib32/libc.a(iofputs.o):(.eh_frame+0xdf): undefined reference to __ gcc_personality_v0 '/usr/lib32/libc.a(iofwrite.o): в функции `fwrite':

(есть другие ошибки, номне кажется, достаточно увидеть проблему)

Я видел некоторые решения, указывающие на то, что я должен связываться с -lgcc, но на моем компьютере библиотека не найдена ...

У кого-то естьидея ?

Ответы [ 3 ]

4 голосов
/ 20 июля 2011

glibc требует, чтобы определенный код инициализации был статически связан с исполняемым файлом.Самый простой способ сделать это - связать с помощью gcc:

gcc -static -o a.out output.o

. Вы можете точно увидеть, что именно связано, передав также -v в gcc.

3 голосов
/ 30 августа 2013

У меня была такая же проблема, поэтому я сделал

# gcc -static -o a.out hello.o -v

, который дал мне информацию о том, что включить, тогда я мог бы связать, используя ld:

# ld -static -o hello -L`gcc -print-file-name=` /usr/lib/gcc/x86_64-linux-gnu/4.4.7/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.4.7/../../../x86_64-linux-gnu/crti.o hello.o /usr/lib/gcc/x86_64-linux-gnu/4.4.7/../../../x86_64-linux-gnu/crtn.o /usr/lib/gcc/x86_64-linux-gnu/4.4.7/crtbeginT.o /usr/lib/gcc/x86_64-linux-gnu/4.4.7/crtend.o --start-group -lc -lgcc -lgcc_eh --end-group
1 голос
/ 20 июля 2011

Я обычно позволяю gcc делать то же самое, а не напрямую использовать ld.Если у вас есть объект, просто gcc object.o -o executable

...