如何从Linux上的汇编代码调用c库?

时间:2011-07-19 21:16:07

标签: c linux assembly linker

我正在尝试在英特尔架构上的Linux程序集中编译一个小程序。我想使用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 个答案:

答案 0 :(得分:4)

glibc要求某些初始化代码与可执行文件静态链接。最简单的方法是使用gcc:

进行链接
gcc -static -o a.out output.o

您也可以通过将-v传递给gcc来确切了解所关联的内容。

答案 1 :(得分:3)

我有同样的问题,所以我做了

# 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

答案 2 :(得分:1)

我通常让gcc做事而不是直接使用ld。获得对象后,只需gcc object.o -o executable