4

我在 C 中做了一个非常简单的程序 hello。当在 exe 文件中使用 ld 时返回这个

ld: error in hello(.eh_frame); no .eh_frame_hdr table will be created.

我没有定义任何LD_LIBRAY_PATH路径或路径,/etc/ld.so.conf我尝试使用 ls 并返回:

ld: error in /bin/ls(.eh_frame); no .eh_frame_hdr table will be created.
ld: warning: cannot find entry symbol _start; defaulting to 0000000000402920

发生了什么?我使用的是 Debian,我的 GCC 版本是(Debian 4.7.2-5)。

4

2 回答 2

8

我相信您打算使用的实用程序是 ldd (LDD),而不是 ld。

ldd 将显示您的 exe 使用的所有共享链接库。或者至少在编译时链接它。

于 2013-12-02T21:53:57.747 回答
5

我认为您不了解 ld 的作用。ld 获取“目标文件”(已编译但未链接的代码,通常存储在 .o 文件中)和库(收集到单个 .a 或 .so 文件中的目标文件集),并将它们连接起来以生成可执行文件操作系统可以运行。

当您使用单个参数调用 ld 时,它期望该参数是一个目标文件。在您的情况下,您在“hello”和“/bin/ls”上使用它,它们是已经链接的可执行文件,从而产生(诚然令人困惑的)错误消息。

我怀疑您的困惑源于这样一个事实,即当您使用 gcc 编译源代码时,它还会将其与标准库链接并生成一个可执行文件(如“hello”),除非您明确告诉它不要这样做。不需要单独的链接步骤。

作为参考,这里是gcc 手册页ld 手册页

于 2013-10-23T18:39:25.077 回答