如何在Linux上从汇编代码调用C库?

7
我是一名有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

我正在尝试在Intel架构的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):对__gcc_personality_v0的引用未定义 /usr/lib32/libc.a(iofflush.o):在函数fflush中:对_Unwind_Resume的引用未定义 /usr/lib32/libc.a(iofflush.o):(.eh_frame+0xdf):对__gcc_personality_v0的引用未定义 /usr/lib32/libc.a(iofputs.o):在函数fputs中:对_Unwind_Resume的引用未定义 /usr/lib32/libc.a(iofputs.o):(.eh_frame+0xdf):对__gcc_personality_v0的引用未定义 /usr/lib32/libc.a(iofwrite.o):在函数fwrite中:对_Unwind_Resume的引用未定义

我看到一些解决方案表明我应该链接使用-lgcc,但是在我的电脑上没有找到这个库...

有人有主意吗?


3
尝试使用gcc进行链接,而不是使用ld。 - Lyke
3个回答

5

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

gcc -static -o a.out output.o

您可以通过在gcc后加上-v参数来查看链接的内容。


它运行良好。谢谢 :) 我只是添加了 -m32 选项以便在我的 64 位机器上编译,但这很棒。 - Baptiste Wicht

4

我也遇到了同样的问题,所以我做了以下操作:

# 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

通常我会让gcc来完成这件事,而不是直接使用ld。一旦你有了目标文件,只需执行gcc object.o -o executable即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接