func_name.part.# 在 objdump 反汇编中

逆向工程 拆卸 转储
2021-06-15 21:53:54

我正在查看一个 GMP 静态链接到它的可执行文件。以下似乎很奇怪。

Disassembly of section .text:

0000000000400e60 <refmpn_fill.part.4>:
  400e60:   50                      push   %rax
  400e61:   ba 55 84 42 00          mov    $0x428455,%edx
  400e66:   be 92 00 00 00          mov    $0x92,%esi
  400e6b:   bf a8 81 42 00          mov    $0x4281a8,%edi
  400e70:   e8 1b 66 00 00          callq  407490 <__gmp_assert_fail>

0000000000400e75 <refmpn_count_leading_zeros.part.19>:
  400e75:   50                      push   %rax
  400e76:   ba c2 81 42 00          mov    $0x4281c2,%edx
  400e7b:   be eb 06 00 00          mov    $0x6eb,%esi
  400e80:   bf a8 81 42 00          mov    $0x4281a8,%edi
  400e85:   e8 06 66 00 00          callq  407490 <__gmp_assert_fail>
  400e8a:   66 0f 1f 44 00 00       nopw   0x0(%rax,%rax,1)

0000000000400e90 <main>:
  400e90:   53                      push   %rbx
  400e91:   bb e8 03 00 00          mov    $0x3e8,%ebx
  400e96:   48 83 ec 20             sub    $0x20,%rsp
  400e9a:   e8 11 03 00 00          callq  4011b0 <tests_start>

如您所见,有以下形式的函数的反汇编:function_name.part.#where#表示某个数字。part.#源代码中没有这样的函数在末尾附加名称那么这些物体是如何出现的呢?

1个回答

这称为部分内联

部分内联与函数大纲密切相关。编译器可能会选择内联被调用函数的一部分,而不是将整个主体内联到调用位置(通常是函数开头的热片段,并提前返回)。