为何符号集为另一共享库超集的两个共享库大小完全相同?
共享库A与B大小相同的原因分析
以下是几种可能的核心原因:
链接器的垃圾代码消除(GC)机制:多数现代链接器默认会开启
--gc-sections(或类似功能),自动移除未被任何导出符号或库内代码引用的代码段、数据段。你添加的额外目标文件内容如果没有被实际引用,会被链接器完全丢弃,不会出现在最终的B库中。段对齐填充的抵消效应:共享库的各个段(如
.text、.data)需要按照系统指定的对齐值(通常是4KB、8KB级别)进行填充对齐。即便B库本应比A库多出少量内容,对齐时的填充差异刚好抵消了这部分增量,导致总大小完全一致。剥离操作的隐性影响:虽然两个库都被
strip处理,但strip会移除非动态符号表、调试信息等内容。如果额外目标文件里只有未导出的符号或调试信息,这些内容在strip后会被彻底清除,不会影响库的最终大小。而你用nm -D查看的是动态符号表,仅包含导出符号,所以能看到B的符号是A的超集,但那些未导出的新增内容已经被剥离掉了。新增目标文件无有效内容:你添加的额外目标文件可能本身没有实际的代码或数据(比如空文件编译出的
.o),或者里面的函数/常量被编译器完全优化掉了,链接后自然不会增加库的体积。
内容的提问来源于stack exchange,提问作者clpgr
相关产品推荐
相关产品推荐

