问题
I'm trying to reduce the size of my elf executable. I'm compiling with -ffunction-sections
-fdata-sections
and linking with -gc-sections
, but it appears some of the symbols that I believe are unused are not being discarded.
Is there some command in the GNU toolchain I can run to find out which symbols are being used and where?
- Toolchain: GNU arm-none-eabi
- Platform: Cortex-M4
- Language: C++
Here are my typical build flags:
Compilation: arm-none-eabi-g++.exe -Wall -O3 -mthumb -std=c++11 -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -fsingle-precision-constant -ffunction-sections -fdata-sections
Link: arm-none-eabi-g++.exe -static -mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -Wl,-gc-sections -Wl,-T"LinkerScript.ld
Thanks for the help.
回答1:
I wasn't able to find a command that showed the symbol dependencies. However, I was able to get the information I needed by using the following technique:
- Add the symbol in question to the
/DISCARD/
section of the linker script. This will output an error message revealing which symbol is using it. It looks something like this:<symbol0>' referenced in section '<symbol1>' of <lib0.a file path>(<object0 file path>): defined in discarded section '<symbol0>' of <lib1.a file path>(object1 file path>)
- Continue to add symbols from these messages up the call stack to the
/DISCARD/
section until you find the root of the problem.
The root of the problem for me was having a class that inherited from another. This created a virtual table, and the compiler cannot remove dead code that is referenced in a virtual table.
Lesson learned: if you want to reduce code size and still use C++, don't use inheritance. The GNU toolchain used to have a -fvtable-gc
switch to help with this, but it was removed some time ago. I will refactor my code to address my specific problem.
回答2:
You can try the linker option -Wl,--trace-symbol=<symbol_name>
. It will display in the output where the symbol is defined, and where the symbol is used.
回答3:
Create a linker map file with cross-reference output:
-Wl,-Map=output.map -Wl,--cref
来源:https://stackoverflow.com/questions/24649504/gcc-gc-sections-and-finding-symbol-dependencies