Gcc 对'dl_iterate_phdr';

Gcc 对'dl_iterate_phdr';,gcc,linker,ld,Gcc,Linker,Ld,我需要帮助!!我试图建立一个独立的可执行ie没有任何动态链接 我编写了一个小测试程序,为它生成了一个可重新定位的对象文件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.

我需要帮助!!我试图建立一个独立的可执行ie没有任何动态链接

我编写了一个小测试程序,为它生成了一个可重新定位的对象文件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):在函数
\u unwind\u Find\u fde'中:
(.text+0x190b):对
dl\u iterate\u phdr'的未定义引用

如何解析未定义的符号dl\u iterate\u phdr。此符号存在于哪个存档中

谢谢

编辑1:

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

最后更新:

现在,我使用下面的命令使它直接符合ld:

$ld-static-o test/usr/lib/crt1.o/usr/lib/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/i486 linux-gnu/4.4.4.3/libgcc\eh.a/usr/lib/libc/libc.a--end group

man ld说——开始组存档——结束组用于解析循环引用!!我还发现符号dl_iterate_phdr是在libc.a中定义的

谢谢大家的帮助

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

不要。使用
ld
链接任何用户空间程序通常是一个bug。你的链接线肯定是错误的

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

gcc -static -o test test.o
我希望使用ld,因为我想构建一个独立的可执行文件


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

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

gcc-o main.c-L-静态libgcc-Wl,-静态-lhello-lc


尝试将
-ldl
添加到您的链接器flagsThanks-ldl解决未定义的符号错误。但要生成独立的可执行文件,我不想动态链接任何库。所以我尝试静态链接libdl.a,但仍然得到相同的未定义符号错误。您的操作系统和gcc版本是什么?你有没有试着直接链接到gcc而不是ld?克里斯,我在ubuntu上运行,gcc的版本是4.4.3。当然,当我尝试与gcc链接时,它确实起作用。但我希望使用ld,因为我想构建一个独立的可执行文件。请帮忙!!是的,我知道gcc在内部调用ld。但我假设gcc默认包含不必要的对象或归档文件作为可执行文件的一部分。但我错了,使用gcc的verbose参数,我看到几乎所有包含的归档文件/对象文件都是必需的,它几乎类似于我的ld命令。所以现在我只使用“gcc-static”。顺便说一句,谢谢你的回复。