我已经更改了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)
答案 0 :(得分:2)
你改变了二进制文件的哪些部分?只是.dynsym
?还是.gnu.hash
?如果哈希表不同步,ld.so
将找不到某些符号。
答案 1 :(得分:1)
为什么不在二进制文件上搜索这个符号?
也许二进制文件要求 ld.so
不要搜索二进制文件本身?
它可以用:
void *sym = dlsym(RTLD_NEXT, "_ZN9decl_test8call_cppEi");
我解析整个二进制文件并重新编写它。
在已经链接的二进制文件上正确执行此类转换非常困难。
但我相信一些矮人解析可能是错误的,或者.eh_frame部分的写法可能是错误的。
上述所有内容均与符号解析无关。
我会检查gnu哈希。
无法构建哈希表会导致查找失败,但在您的情况下ld.so
甚至没有搜索,因此原因必须是其他原因。