动态链接ELF文件是否需要Section Header Table?
ELF可执行文件是否需要Section Header Table?
静态链接可执行文件:确实不需要
静态链接的可执行文件在编译链接阶段就把所有依赖的代码、数据合并完成了,加载时只靠Program Header Table(PHT)就能告诉操作系统怎么把各个段加载到内存里。运行时不需要重定位、符号解析这些操作,所以Section Header Table(SHT)完全可以用strip命令剥离掉,丝毫不影响程序正常运行。
动态链接可执行文件:运行时也不需要SHT
你提到重定位段、动态相关段和SHT有关,但这里要搞清楚运行时必须的信息载体和SHT本身的区别:
- 动态链接真正依赖的是Program Header里的PT_DYNAMIC段,这个段里直接存着动态链接器需要的所有关键信息:重定位表的内存地址、符号表位置、依赖的动态库列表等,都是直接按地址偏移存储的,根本不需要通过SHT去查找。
- SHT里记录的重定位节(比如
.rela.dyn、.rela.plt)对应的内容,其实已经被映射到内存中了,动态链接器是通过PT_DYNAMIC找到这些内容的地址,而非SHT的索引。 - 简单说,动态链接可执行文件的SHT同样可以被剥离,只要PT_DYNAMIC完整,动态链接器就能正常工作。你看到的文章说SHT用于访问这些段,更多是从调试、分析工具的角度出发——像
readelf、objdump这类工具需要SHT来解析各个节的含义,方便人类理解,但程序自己运行根本不需要这玩意儿。
实测验证
你可以自己动手试:拿一个动态链接的可执行文件,用strip --strip-all命令处理它,处理完后运行,程序依然能正常跑,因为PT_DYNAMIC没被删掉,动态链接器能找到它需要的所有信息。
内容的提问来源于stack exchange,提问作者user9916031
相关产品推荐
相关产品推荐

