我正在尝试在英特尔架构上的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链接但是在我的计算机上找不到库...
有人有想法吗?
答案 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