4

我需要帮助!!我正在尝试构建一个独立的可执行文件,即没有任何动态链接。

我编写了一个小测试程序,为它生成了一个名为 test.o 的可重定位目标文件。当我尝试使用 GNU 链接器构建独立可执行文件时,出现以下错误:

$ld -static -o test test.o /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/libc.a /usr/lib/gcc/i486-linux-gnu/4.4/libgcc .a /usr/lib/gcc/i486-linux-gnu/4.4/libgcc_eh.a /usr/lib/gcc/i486-linux-gnu/4.4/libgcc_eh.a(unwind-dw2-fde-glibc.o):在函数_Unwind_Find_FDE': (.text+0x190b): undefined reference todl_iterate_phdr'

如何解决未定义的符号 dl_iterate_phdr。该符号出现在哪个档案中?

谢谢!!!

编辑1:

以防万一我不是很清楚,我的动机是生成一个独立的可执行文件,即一个在加载到内存时完全准备好执行的可执行文件,即)所有符号解析和重定位都由程序链接器本身而不是动态链接器完成. 是否可以生成这样的可执行文件?

最后更新:

现在我让它直接使用以下命令来遵守 ld :

$ld -static -o 测试 /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/gcc/i486-linux-gnu/4.4.3/crtbeginT.o /usr/lib/gcc/ i486-linux-gnu/4.4.3/crtend.o test.o --start-group /usr/lib/gcc/i486-linux-gnu/4.4.3/libgcc.a /usr/lib/gcc/i486- linux-gnu/4.4.3/libgcc_eh.a /usr/lib/libc.a --end-group

man ld 说 --start-group archives --endgroup 用于解析循环引用!!我还发现符号 dl_iterate_phdr 是在 libc.a 中定义的。

感谢你的帮助!!

4

3 回答 3

4

当我尝试使用 GNU 链接器构建独立的可执行文件时

不。使用ld链接任何用户空间程序通常是一个错误。您的链接行肯定不正确。

使用编译器驱动程序为您完成繁重的工作。这应该有效:

gcc -static -o test test.o

我想使用 ld 因为我想构建一个独立的可执行文件

是什么让您相信 GCC 构建的可执行文件不如 ld 构建的可执行文件那么独立?不管是什么,你都错了:gcc只是ld用正确的参数调用。

于 2013-01-15T06:49:51.900 回答
3

如果在针对 android 时遇到此错误,则需要链接 libdl.so (-ldl)

于 2017-06-01T22:38:20.070 回答
1

gcc -o 主要 main.c -L 。-static-libgcc -Wl,-static -lhello -lc

于 2018-05-09T06:19:33.893 回答