//lib/i386-linux-gnu/libc.so.6:添加符号时出错:命令行中缺少DSO

时间:2014-09-24 13:55:00

标签: nasm ld ubuntu-14.04

我正在尝试运行我在2008年9月写的文件,并且我使用了当年的Ubuntu版本并且运行良好。现在我已经安装了带有NASM版本2.10.09的Ubuntu 14.04。

这是文件的源代码https://gist.github.com/vcrobe/2494f0f54c03f8fb0a8d

我已使用此命令成功编译了NASM代码:

nasm -f elf foo.asm

但是当我尝试使用此命令链接目标文件时:

ld -s -o foo foo.o -lelf -I/lib/ld-linux.so.2

我收到以下错误:

ld: foo.o: undefined reference to symbol 'printf@@GLIBC_2.0'
//lib/i386-linux-gnu/libc.so.6: error adding symbols: DSO missing from command line.

有人可以告诉我,我该怎样做才能解决问题?

此后发生了什么变化,因为它曾经在2008年工作过?

1 个答案:

答案 0 :(得分:2)

你不能像这样使用GNU C库。通常,C编译器将链接其他3个文件:crti.o(应该定义_start),crt0.o(或crt1.o)和crtn.o 。这些文件包含GNU C库依赖于其方法和符号的初始化,启动和拆除过程,甚至可以解析

如果您打算使用C库的printf函数(或任何其他libc函数),那么您需要在方法main内进行。< / p>

首先,您必须将_start符号更改为main。然后,您将链接器命令更改为两个选项之一。容易的是

gcc -s -o foo foo.o -lelf

更难的是

ld -s -o foo /lib/i386-linux-gnu/crti.o /lib/i386-linux-gnu/crt1.o foo.o \
    /lib/i386-linux-gnu/crtn.o -I/lib/ld-linux.so.2 -lc

注意:指定要链接的目标文件的顺序非常重要。订单必须 crti.o然后crt{0,1}.o,然后您链接到您自己的对象文件中,并且只有在crtn.o之后链接所有这些文件之后。