【问题标题】:Gcc collect2: fatal error: cannot find 'ld'Gcc collect2:致命错误:找不到'ld'
【发布时间】:2016-06-28 12:06:50
【问题描述】:

我正在阅读有关在http://wiki.osdev.org/Bare_Bones 上制作操作系统的教程。当我尝试使用以下命令链接 boot.o 和 kernel.o 时:i686-elf-gcc -T linker.ld -o myos.bin -ffreestanding -O2 -nostdlib boot.o kernel.o -lgcc ,我只是得到这个错误:

collect2: fatal error: cannot find 'ld'
compilation terminated.

我刚刚安装了带有 gcc-5.2.1binutils-2.25.1 的全新 Ubuntu 15.10。 我在互联网上搜索了答案,但没有任何帮助。

【问题讨论】:

  • 链接时直接使用链接器,不要调用GCC前端程序。 IE。 i686-elf-ld 代替。
  • 将“-v”标志添加到 gcc 命令行以查看所有路径可能会有所帮助。
  • @JoachimPileborg 当我尝试i686-elf-ld 命令时,它说它找不到命令。还有其他建议吗? @max630 它说:COLLECT_GCC=i686-elf-gcc COLLECT_LTO_WRAPPER=$HOME/opt/cross/libexec/gcc/i686-elf/5.2.0/lto-wrapper 目标:i686-elf 配置:../gcc- 5.2.0/configure --target=i686-elf --prefix=$HOME/opt/cross --disable-nls --enable-languages=c,c++ --without-headers 线程模型:单gcc版本5.2.0 (GCC) 那么,我到底想看到什么?
  • 你已经为交叉编译目标构建了一个 binutils 包?并安装在编译器所在的位置?
  • @JoachimPileborg 在我找到 collect2 程序源之后,我浏览了它,我认为源和程序输出不匹配。有什么想法吗?

标签: c gcc cross-compiling ubuntu-15.10


【解决方案1】:

当我试图在受害服务器上编译我的漏洞利用时,我在渗透测试期间也遇到过同样的错误。

在我的例子中,“ld”程序所在的目录没有在PATH环境变量中定义,所以我简单地添加了它。

例如export PATH=$PATH:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin

【讨论】:

    【解决方案2】:

    我在入侵远程机器并尝试使用 gcc 在受害机器上编译漏洞时遇到此错误。

    我只是将程序ld 复制到/tmp/,这是我通过运行编译我的漏洞利用exploit.c 的工作目录 cp /usr/bin/ld /tmp/ld 然后是原始的 gcc 编译命令,编译成功了。

    【讨论】:

    • 恢复(共享)虚拟机并再次尝试后,奇怪的是它没有工作。奇怪...
    • 这并不奇怪,tmp 默认不在环境路径中。有人会使用export PATH=$PATH+:/tmp,然后让操作系统找到你的二进制文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 2018-02-25
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    相关资源
    最近更新 更多