繁体   English   中英

剥离的二进制文件显示“_cxa_finalize”而不是“libc_start_main”

[英]Stripped binary shows “_cxa_finalize” instead of “libc_start_main”

为什么剥离二进制显示_cxa_finalize而不是libc_start_main

我试图在Linux(Ubuntu)上的一个非常简单的C程序中找到并反汇编main() )。 剥离二进制文件。 您可以在下面看到相同指令的反汇编(未剥离)与反汇编(剥离)。

问题:剥离版本中的_cxa_finalize是什么? 为什么libc_start_main被替换_cxa_finalize

没有剥离:

106d:   48 8d 3d c1 00 00 00    lea    rdi,[rip+0xc1]        # 1135 <main>

1074:   ff 15 66 2f 00 00       call   QWORD PTR [rip+0x2f66]        # 3fe0 <__libc_start_main@GLIBC_2.2.5>

剥离:

106d:   48 8d 3d c1 00 00 00    lea    rdi,[rip+0xc1]        # 1135 <__cxa_finalize@plt+0xf5>

1074:   ff 15 66 2f 00 00       call   QWORD PTR [rip+0x2f66]        # 3fe0 <__cxa_finalize@plt+0x2fa0>

这不是__cxa_finalize 它是__cxa_finalize@plt+0xf5 __cxa_finalize@plt+0x2fa0__cxa_finalize@plt+0x2fa0 (注意重要的偏移量)。 反汇编程序没有关于符号main__libc_start_main因为你删除了符号表,但由于技术原因,它仍然知道与PLT thunk相关联的符号(因为它们需要在动态链接时绑定,反汇编程序可能当缺少符号表时,它会回退到使用该信息。 通常,反汇编程序从地址向后工作,直到找到由符号命名的地址,并假定(错误地,这里)被反汇编的地址是该函数的一部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM