[英]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.