How do I include only used symbols when statically linking with gcc?

只谈情不闲聊 提交于 2019-11-30 06:21:53

问题


I'm deploying a small program compiled with gcc, 4.3.2-1.1 (Debian). This program will be deployed on virtual machine templates ranging from Debain 5 to bleeding edge Fedora, Ubuntu, Slackware, Arch and others.

The program depends on some symbols from Xen's libraries which are only available in an unstable tree. Hence, installing Xen's libraries via respective package managers on the virtual machine templates would not solve my immediate issue.

Until I package my own version of these libraries, I need to statically link the executable.

Does gcc 4.3-x, by default only include symbols that are actually used when statically linking, or is there another optimization flag that I should be passing to the linker? I know that statically linking is bad, I'm doing it only as a temporary work around.


回答1:


This issue is related not only to gcc, but to ld(1) too.

By default, gcc doesn't eliminate dead code, you can check this by compiling/linking executable, and then running

objdump -d a.out

which shows you all functions in your executable.

Simple "googling" give this link.

So, to remove unused functions, you need:

  • Compile with “-fdata-sections” to keep the data in separate data sections and “-ffunction-sections” to keep functions in separate sections, so they (data and functions) can be discarded if unused.
  • Link with “--gc-sections” to remove unused sections.


来源:https://stackoverflow.com/questions/5307348/how-do-i-include-only-used-symbols-when-statically-linking-with-gcc

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!