【问题标题】:How to call the c library from assembly code on Linux?如何在 Linux 上从汇编代码中调用 c 库?
【发布时间】:2011-10-08 21:58:49
【问题描述】:

我正在尝试在英特尔架构的 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(ioflush.o): 在函数中 fflush': (.text+0xd7): undefined reference to_Unwind_Resume' /usr/lib32/libc.a(ioflush.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 链接,但在我的计算机上找不到该库...

有人有想法吗?

【问题讨论】:

  • 尝试使用 gcc 而不是 ld 链接

标签: c linux assembly linker


【解决方案1】:

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

gcc -static -o a.out output.o

您也可以通过将-v 传递给gcc 来准确查看链接的内容。

【讨论】:

  • 效果很好。谢谢 :) 我刚刚添加了 -m32 选项以便在我的 64 位机器上编译,但这很好。
【解决方案2】:

我遇到了同样的问题,所以我做了

# 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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-06
      • 2016-06-01
      • 1970-01-01
      • 2021-01-03
      • 2016-09-07
      • 2017-02-18
      • 2017-01-19
      • 2021-11-29
      相关资源
      最近更新 更多