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

时间:2017-07-25 01:14:42

标签: linker binaryfiles ld elf instrumentation

我已经更改了ELF二进制文件,现在我正试图找出我搞砸了什么。 我的检测二进制文件在下面的粘贴文本上被称为mutatee_out。 它所说的未定义的符号确实在动态表中,我已经检查过了。还有.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)

2 个答案:

答案 0 :(得分:2)

你改变了二进制文件的哪些部分?只是.dynsym?还是.gnu.hash?如果哈希表不同步,ld.so将找不到某些符号。

答案 1 :(得分:1)

  

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

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

它可以用:

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

我解析整个二进制文件并重新编写它。

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

  

但我相信一些矮人解析可能是错误的,或者.eh_frame部分的写法可能是错误的。

上述所有内容均与符号解析无关。

  

我会检查gnu哈希。

无法构建哈希表会导致查找失败,但在您的情况下ld.so 甚至没有搜索,因此原因必须是其他原因。