-ffunction-sections -fdata-sections -Wl, –gc-sections编译选项

https://gcc.gnu.org/onlinedocs/gcc-7.5.0/gnat_ugn/Compilation-options.html

实际上gcc和clang均可支持。当使用-ffunction-sections -fdata-sections这两个参数编译,并且在链接时使用-Wl,–gc-sections参数,就可以将无用的代码进行删除。

编译时-ffunction-sections 和 -fdata-sections 将每个函数或符号创建为一个sections,每个sections名与function或data名保持一致;链接时-Wl,–gc-sections 指示链接器去掉不用的section。注意仅仅是去掉了不用的sections,不能解决依赖问题。

示例源文件链接在此,其逻辑如下:静态库libfoo.a的第二个函数依赖于动态库libbar.so,在main.c中引用了静态库libfoo.a的第一个函数。分别打开和关闭编译选项得到main1和main2:

查看得到的二进制文件:

可以看到,main1中并无foo2,虽然foo2是静态库libfoo.a的一部分。

而原生的main2中则有foo2,虽然在main函数中并未引用foo2。

此操作只会让链接器去掉无用的段,并不会减少依赖:

 

This entry was posted in tittle tattle. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *