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

时间:2019-08-20 02:14:26

标签: c gdb disassembly strip objdump

为什么剥离后的二进制文件显示的是_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>

1 个答案:

答案 0 :(得分:5)

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