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

Linker 为什么不在二进制文件本身上搜索符号?,linker,binaryfiles,ld,elf,instrumentation,Linker,Binaryfiles,Ld,Elf,Instrumentation,我已经更改了一个ELF二进制文件,现在我正试图找出我搞砸了什么。 我的插入指令的二进制文件在下面粘贴的文本中称为mutatee_out。 它所说的未定义的符号确实在动态表中,我已经检查过了。并且在.text部分有正确的地址 所以我的问题是:一个未定义符号的原因是什么?(这样我就可以检查可能出了什么问题) 当我使用LD_DEBUG=symbols运行时,我注意到它没有在文件本身中查找此符号,因此是未定义的符号。在文件上查找其他符号,如下所示 有什么想法吗?为什么不在二进制文件本身上搜索此符号 1

我已经更改了一个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)

您更改了二进制文件的哪些部分?只是
.dynsym
?或者
.gnu.hash
也可以?如果哈希表不同步,
ld.so
将找不到一些符号。

您更改了二进制文件的哪些部分?只是
.dynsym
?或者
.gnu.hash
也可以?如果哈希表不同步,
ld.so
将找不到一些符号

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

 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)
也许二进制文件要求
ld.so
不要在二进制文件本身中搜索

 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)
它可以通过以下方式做到这一点:

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

我解析整个二进制文件并再次重写它

在已经链接的二进制文件上正确执行这种转换是非常困难的

但是我相信一些矮人解析可能是错误的,或者.eh_框架部分的编写可能是错误的

以上这些都与符号分辨率无关

不过我会检查gnu哈希

未能构建哈希表将导致查找失败,但在您的情况下,
ld。因此,
甚至没有进行搜索,因此原因一定是其他原因

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

 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)
也许二进制文件要求
ld.so
不要在二进制文件本身中搜索

 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)
它可以通过以下方式做到这一点:

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

我解析整个二进制文件并再次重写它

在已经链接的二进制文件上正确执行这种转换是非常困难的

但是我相信一些矮人解析可能是错误的,或者.eh_框架部分的编写可能是错误的

以上这些都与符号分辨率无关

不过我会检查gnu哈希


未能建立哈希表将导致查找失败,但在您的情况下,
ld。因此
甚至没有进行搜索,因此原因一定是其他原因。

我解析整个二进制文件并再次重写它。但是我相信一些矮人解析可能是错误的,或者.eh_框架部分的编写可能是错误的。不过我会检查gnu哈希。我解析整个二进制文件,然后再次重写它。但是我相信一些矮人解析可能是错误的,或者.eh_框架部分的编写可能是错误的。不过我会检查gnu哈希。在添加病毒代码之前,可执行文件工作了吗?。。。我是说在你编辑二进制可执行文件之前?它不是病毒代码。这是一个严肃的项目,您可以访问GitHub.com/dyninst查看。是的,它是有效的,目标是让它在之后也能工作。在你添加病毒代码之前,可执行文件能工作吗?。。。我是说在你编辑二进制可执行文件之前?它不是病毒代码。这是一个严肃的项目,您可以访问GitHub.com/dyninst查看。是的,它是有效的,目标是让它在以后也能工作。它不应该要求不被搜索。我们有一个二进制插装库,所以不难,它叫做dyninst。问题是,我现在只更改与矮人相关的代码,试图找出在整个过程中出现了什么问题。符号被发现并被搜索,但是中间的东西被做错了。如果你只改变矮人,这将不影响LD,所以符号查找。我改变了解析侏儒部分和EHF框架部分的代码。@ SASAN IICOLAS,正如我上面所说的,既不是侏儒也不是<代码>。EHYFrase与符号分辨率无关。你的问题在别处。它不应该要求不要被搜索。我们有一个二进制插装库,所以不难,它叫做dyninst。问题是,我现在只更改与矮人相关的代码,试图找出在整个过程中出现了什么问题。符号被发现并被搜索,但是中间的东西被做错了。如果你只改变矮人,这将不影响LD,所以符号查找。我改变了解析侏儒部分和EHF框架部分的代码。@ SASAN IICOLAS,正如我上面所说的,既不是侏儒也不是<代码>。EHYFrase与符号分辨率无关。你的问题在别处。