为什么不在二进制文件本身上搜索符号?

Why would a symbol not be searched on the binary itself?

我已经更改了一个 ELF 二进制文件,现在我正试图找出我搞砸了什么。 在下面粘贴的文本中,我的检测二进制文件称为 mutatee_out。 它所说的未定义符号确实在动态 table 中,我已经检查过了。以及 .text 部分的正确地址。

所以我的问题是:未定义符号的原因是什么? (所以我可以检查可能出了什么问题)。

当我 运行 和 LD_DEBUG=symbols 时,我注意到它没有在文件本身中查找这个符号,因此是未定义的符号。其他符号也在文件中查找,如下所示。

有什么想法吗?为什么不在二进制文件本身上搜索此符号?

 17405:     symbol=_ZTVSt11regex_error;  lookup in file=mutatee_out [0]
 17405:     symbol=_ZTVSt11regex_error;  lookup in file=/usr/lib/x86_64-linux-gnu/libstdc++.so.6 [0]
 17405:     symbol=__gxx_personality_v0;  lookup in file=mutatee_out [0]
 17405:     symbol=_ZN9__gnu_cxx27__verbose_terminate_handlerEv;  lookup in file=mutatee_out [0]
 17405:     symbol=_ZN9__gnu_cxx27__verbose_terminate_handlerEv;  lookup in file=/usr/lib/x86_64-linux-gnu/libstdc++.so.6 [0]
 17405:     symbol=_ZSt9terminatev;  lookup in file=mutatee_out [0]
 17405:     symbol=_ZSt9terminatev;  lookup in file=/usr/lib/x86_64-linux-gnu/libstdc++.so.6 [0]
 17405:     symbol=__gmon_start__;  lookup in file=mutatee_out [0]
 17405:     symbol=__gmon_start__;  lookup in file=/usr/lib/x86_64-linux-gnu/libstdc++.so.6 [0]
 17405:     symbol=__gmon_start__;  lookup in file=/lib/x86_64-linux-gnu/libgcc_s.so.1 [0]
 17405:     symbol=__gmon_start__;  lookup in file=/lib/x86_64-linux-gnu/libc.so.6 [0]
 17405:     symbol=__gmon_start__;  lookup in file=/lib/x86_64-linux-gnu/libm.so.6 [0]
 17405:     symbol=__gmon_start__;  lookup in file=/lib64/ld-linux-x86-64.so.2 [0]
 17405:     symbol=__gmon_start__;  lookup in file=/lib/x86_64-linux-gnu/libdl.so.2 [0]
 17405:     symbol=_ZN9decl_test8call_cppEi;  lookup in file=/usr/lib/x86_64-linux-gnu/libstdc++.so.6 [0]
 17405:     symbol=_ZN9decl_test8call_cppEi;  lookup in file=/lib/x86_64-linux-gnu/libgcc_s.so.1 [0]
 17405:     symbol=_ZN9decl_test8call_cppEi;  lookup in file=/lib/x86_64-linux-gnu/libc.so.6 [0]
 17405:     symbol=_ZN9decl_test8call_cppEi;  lookup in file=/lib/x86_64-linux-gnu/libm.so.6 [0]
 17405:     symbol=_ZN9decl_test8call_cppEi;  lookup in file=/lib64/ld-linux-x86-64.so.2 [0]
 17405:     symbol=_ZN9decl_test8call_cppEi;  lookup in file=/lib/x86_64-linux-gnu/libdl.so.2 [0]
 17405:     mutatee_out: error: symbol lookup error: undefined symbol: _ZN9decl_test8call_cppEi (fatal)

您更改了二进制文件的哪些部分?只是 .dynsym?或者还有 .gnu.hash?如果散列 table 不同步,ld.so 将找不到某些符号。

Why would this symbol not be searched on the binary itself?

也许二进制 要求 ld.so 不在二进制本身中搜索?

它可以通过以下方式做到这一点:

void *sym = dlsym(RTLD_NEXT, "_ZN9decl_test8call_cppEi");

I parse the whole binary and rewrite it again.

在已经链接的二进制文件上正确执行此类转换非常困难。

But I believe some dwarf parsing may be wrong or the writing of the .eh_frame section may be wrong.

以上

None与符号解析有关。

I'll check the gnu hash though.

未能构建哈希 [​​=32=] 将导致查找失败,但在您的情况下 ld.so 甚至没有搜索 ,因此原因必须是别的。