链接过程仅涉及Section Header,是否可移除共享对象的Program Header Table?
关于共享对象ELF文件能否移除程序头表的解答
结论先行:绝对不能直接移除Shared Object(共享对象)文件中的Program Header Table(程序头表),你的前提认知存在偏差
首先纠正两个认知误区:
误区1:ELF格式的链接过程仅涉及
Section Header Table(节头表)
这个结论仅适用于编译期的静态链接场景:静态链接器需要通过节头表定位代码段、数据段、重定位表等信息,完成段合并、地址重定位操作。但运行时的动态链接过程并不依赖节头表,它的核心依赖就是你想移除的程序头表。
误区2:共享对象用于动态链接场景就不需要程序头表
刚好相反,动态链接的核心就是依托程序头表完成共享对象的加载。程序头表是共享对象运行时加载的必需结构:
程序头表存储了动态链接器加载so文件所需的全部核心信息,包括:需要映射到进程虚拟地址空间的段的位置、大小、访问权限(读/写/执行),动态链接所需的.dynamic段、重定位表、GOT/PLT相关段的位置信息等。如果删除程序头表,动态链接器会直接判定该文件不是合法的可加载ELF文件,直接抛出加载错误,依赖该so的程序完全无法运行。额外说明:
反过来如果你的共享对象不需要用于后续的二次静态链接、调试分析场景,你反而可以移除节头表以及相关的调试信息,不会影响so的正常加载运行,strip命令的默认瘦身操作就会清除这类非运行时必需的信息。
内容的提问来源于stack exchange,提问作者user16387400
相关产品推荐
相关产品推荐

