【问题标题】:gcc -c and ld: exec No such file or directory [duplicate]gcc -c和ld:exec没有这样的文件或目录[重复]
【发布时间】:2017-05-08 08:30:13
【问题描述】:

我知道这是一个非常基本的问题,但是虽然我发现了类似的问题,但我没有找到解决方案...

我对这个简单的程序也有同样的问题:

#include <stdio.h>

void main()
{
    printf("Hi\n");
    fflush(stdout);
}

如果我用 gcc main.c 编译,我没有问题。

如果我用 gcc -c main.c 编译然后用 ld -o main main.o 链接,我会得到错误 undefined reference em> 表示 putsstdoutfflush。我在末尾添加了 -lc 并在创建二进制文件时仅在 _start 点上有一个警告,但是当我执行程序时,它返回一个通用 “找不到文件” 错误。 如果我没记错的话,问题是链接器使用的是不存在的 libc.so.1 而不是我认为的 libc.so.6: readelf -a main

[Requesting program interpreter: /usr/lib/libc.so.1]

有谁知道怎么回事?这是一些环境/系统问题还是我必须更改 ld 选项?怎么样?

谢谢你,对这个“愚蠢”的问题感到抱歉......(以及我可怜的“英语”)

编辑:“已解决”(见下文),只是添加从 gcc -v main.c [COLLECT_GCC_OPTIONS] 获得的新 ld 选项,我试图在最小值处减少:

ld -o main main.o --hash-style=gnu --as-needed -dynamic-linker /lib/ld-linux.so.2 -z relro /usr/lib/gcc/i686-linux-gnu/5/../../../i386-linux-gnu/crt1.o /usr/lib/gcc/i686-linux-gnu/5/../../../i386-linux-gnu/crti.o /usr/lib/gcc/i686-linux-gnu/5/crtbegin.o -L/usr/lib/gcc/i686-linux-gnu/5 -L/usr/lib/gcc/i686-linux-gnu/5/../../../i386-linux-gnu -L/usr/lib/gcc/i686-linux-gnu/5/../../../../lib -L/lib/i386-linux-gnu -L/lib/../lib -L/usr/lib/i386-linux-gnu -L/usr/lib/../lib -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/i686-linux-gnu/5/crtend.o /usr/lib/gcc/i686-linux-gnu/5/../../../i386-linux-gnu/crtn.o

EDIT2:启动程序,我认为最小值是

ld -o main main.o --as-needed -dynamic-linker /lib/ld-linux.so.2 -lc

它返回一个分段错误(我认为是缺少指向 crt* 的链接)

【问题讨论】:

  • 如果你让gcc调用ld,你会得到同样的错误吗,也就是说,如果你使用:gcc -o main main.o链接会发生什么?
  • 不,就像我说的,如果我让 gcc 调用 ld 我没有问题,抱歉我必须更好地突出它
  • 这个答案有帮助吗:stackoverflow.com/a/14418246/646887 ?
  • 尝试在带有详细 (-v) 标志的 .o 文件上调用 gcc。它将打印用于调用ld 的命令。检查它传递给ld的其他标志。
  • @KlasLindbäck 实际上,您链接的答案有所帮助,使用在 ld 中使用 gcc -v 打印的 COLLECT_GCC_OPTIONS,该程序有效,谢谢

标签: c gcc ld


【解决方案1】:

你不能仅仅链接一个带有注释的目标文件来获得一个可执行文件。您需要与定义目标文件所需符号的库链接。由于任何 C 程序都需要一些启动代码来初始化 main 的 argc 和 argv,因此您可能至少需要链接到通常称为 crt0.o 的文件,也可能需要链接到 C 标准库。

这涉及很多。如果您使用gcc -v 运行详细编译,您可以看到实际的链接命令。

【讨论】:

  • 是的,谢谢,我按照上面的建议查看 gcc -v 后解决了
  • 你不能只链接一个目标文件并注意获取可执行文件。 - 对于 C 编译器输出是正确的,但你可以 这样做对于从定义 _start 的手写 asm 构建的目标文件。 (或者甚至是定义 _start 的 hacky C 程序。)您将其链接到静态可执行文件中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
  • 2021-10-31
  • 2021-12-13
  • 2012-02-12
  • 1970-01-01
相关资源
最近更新 更多