【问题标题】:ld : _start not found defaulting told : _start not found 默认为
【发布时间】:2013-01-28 09:27:51
【问题描述】:

你好,我做了一个简单的 hello world C 程序,我正在编译它:

gcc -c hello.c
ld hello.o -lc -o out

我收到来自 ld 的警告:ld : _start not found defaulting to ....

我执行了objdump -D hello.o,但在输出中找不到_start 例程。
我在这里错过了什么?

【问题讨论】:

  • 可能你缺少 main();或有无效的 main 声明
  • 您有什么特殊原因直接调用ld 吗?
  • gcc hello.c 工作正常,我没有错过 main()

标签: c gcc ld


【解决方案1】:

您缺少crt* 的内容,如果您与gcc -v 链接,您将看到这些内容:crt1.ocrtend.ocrtn.o。查看gcc 如何调用collect2(在gcc -v 中可见)并对ld 使用相同的选项。

main 函数不是可执行入口点:标准库的一些初始化在main 之前完成(因为否则不可能或不合逻辑)。真正的入口点,默认是_start,在crt1.o,它总是链接到你的可执行文件中。

【讨论】:

  • 我如何将crtn.o传递给ld。或者这是我需要做的吗?
  • ld -o out -L/lib/crt0.o cprog.o -lc。即使这样也行不通。
  • crt0.o (或 crt1 或您拥有的任何东西,可能取决于目标)是一个对象,而不是一个库。你完全按照cprog.o 传递它,没有-L
  • ld -o out /usr/lib/x86_64-linux-gnu/crt1.o cprog.o -lc 现在告诉我未定义的 _init 引用
  • 添加-dynamic-linker /lib64/ld-linux-x86-64.so.2,并确保在开头链接crt1.ocrti.o,然后是您的目标文件,然后是crtn.o(与其他crt*位于同一目录)。或者看gcc -v输出.
【解决方案2】:

因为你没有main函数,你也可以试试

gcc -v hello.c -o hello

看看是否编译成功。

【讨论】:

  • @DeepankarBajpeyi 重要的部分是-v:gcc 向您展示它是如何链接的(查看collect2 调用)
  • 它有一堆环境变量。
【解决方案3】:

在我的系统(Angstrom Linux,gcc 4.3.3)上,这是由于我安装了libgcc-s-dev 而不是libgcc-dev。系统上没有包含_start 字符串的二进制文件,我检查了一下。安装 libgcc-dev 有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-12
    • 2016-05-21
    • 2016-12-10
    • 2020-03-01
    • 2013-11-18
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多