共享库中未引用函数未被自动移除,如何通过链接器解决?
解决共享库中不可达函数代码未被移除的问题
你需要给链接器加上--gc-sections选项,就能自动移除从可见入口(这里是foo函数)不可达的未引用代码。具体调整如下:
保留现有编译命令:你已经用
-ffunction-sections把每个函数编译到独立的section中,这是后续回收的基础,无需修改:gcc -c -ffunction-sections foo.c gcc -c -ffunction-sections bar.c修改链接命令,添加
--gc-sections:gcc -Wl,--version-script,vis.map -Wl,--gc-sections -shared -o libfoo.so foo.o bar.o
原理说明
默认情况下,即使符号被版本脚本隐藏,链接器也不会主动删除未被引用的代码section。而--gc-sections会触发链接器的垃圾回收机制:它会从所有可见的符号(这里是foo)出发,遍历所有可达的代码section,把完全不可达的section(比如baz所在的section)从最终的共享库中移除。
因为你已经通过-ffunction-sections将每个函数单独放在一个section里,所以--gc-sections可以精准地只移除baz的代码,不会影响其他内容,完全满足你不能修改bar.c的需求。
内容的提问来源于stack exchange,提问作者Daniel Walker
相关产品推荐
相关产品推荐

