剥离的 XCOFF 二进制文件如何仍然可用?

逆向工程 文件格式
2021-06-24 01:23:07

IBM 的 AIXstrip实用程序文档声明如下:

不带选项的strip 命令删除行号信息、重定位信息、符号表、调试部分、typchk 部分和注释部分。

如果重定位信息被删除,为什么剥离的可执行文件仍然可用?

2个回答

COFF 文件不是为了支持链接时间后的重定位而设计的:

最初用于 Linux 的二进制格式是一种a.out 变体。在引入共享库时,必须做出某些设计决策才能在 a.out. 主要接受的限制是在加载时和之后执行重定位共享库必须以它们在运行时在磁盘上使用的形式存在。这对共享库的构建和使用方式施加了重大限制:每个共享库必须有一个固定的加载地址;否则将无法生成不必重新定位的共享库。1

虽然 XCOFF 表示支持使用共享库的 COFF 的扩展,但删除的重定位信息strip属于用于链接时重定位而不是加载或运行时重定位的信息:

  • 通过删除绑定器和符号调试程序使用的信息来减小扩展通用对象文件格式 (XCOFF) 对象文件的大小。

  • 当单个 XCOFF 目标文件被链接以创建 XCOFF 可执行文件时,活页夹使用重定位信息来修改地址常量和其他可重定位的值。2

活页夹的作用似乎类似于ldLinux 系统上的链接编辑器

-xflag说明

删除符号表信息但不删除静态或外部符号信息。-x 标志还会删除重定位信息,因此无法链接到文件。


  1. 如何编写共享库

  2. XCOFF 文件的重定位信息 (reloc.h)

显然XCOFF 格式 有一个单独的部分用于动态链接器(系统加载器):

加载器部分 (loader.h)

加载器部分包含系统加载器加载和重定位可执行 XCOFF 对象所需的信息。loader 部分是由 binder 生成的。加载器部分在 XCOFF 部分标题中具有 STYP_LOADER 的 s_flags 部分类型标志。按照惯例, .loader 是加载程序部分名称。本节中的数据不被 XCOFF 符号表中的条目引用。

大概这个没有被删除strip,所以这个文件仍然有效。

另请参阅有关剥离 ELF 文件会发生什么的类似问题