【问题标题】://lib/i386-linux-gnu/libc.so.6: error adding symbols: DSO missing from command line//lib/i386-linux-gnu/libc.so.6:添加符号时出错:命令行中缺少 DSO
【发布时间】:2014-11-19 01:20:07
【问题描述】:

我正在尝试运行我在 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 年工作?

【问题讨论】:

    标签: nasm ld ubuntu-14.04


    【解决方案1】:

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

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

    所以首先你必须将_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

    【讨论】:

    • 感谢您的快速回复。当我尝试第二个选项 ld... 我收到以下错误“ld:找不到 /lib/i386-linux-gnu/crti.o:没有这样的文件或目录”,crt1.o 和 crtn.o 也是如此.我怎样才能解决这个问题?我确实需要用这种方式链接目标文件。
    • @vcRobe 如果他们不在,请使用locate 追踪他们。它们可能位于/usr/lib/ 目录而不是/lib 目录中。
    • 哦,我忘了添加链接器选项来链接 C 库。它现在就在那里。
    • 有效!非常感谢伙计。没错,我使用了 locate 并且 crt 文件位于 /usr/lib ,是的,如果我不使用 -lc 它不会链接。此外,我必须按照您的建议将 _start 重命名为“main”。再次感谢。现在我想到的一个问题是为什么它在 2008 年有效?因为从那以后我就没有改过代码了?
    • @vcRobe 可能是因为 2008 年之后 GNU C 库开始需要链接初始化和终结例程。但我不是专家。
    猜你喜欢
    • 2021-05-16
    • 2015-07-12
    • 2012-11-27
    • 1970-01-01
    • 2015-09-18
    • 2013-11-22
    • 2018-02-12
    • 2015-11-02
    • 1970-01-01
    相关资源
    最近更新 更多