C ++
我试图减小我的elf可执行文件的大小。 我正在用-ffunction-sections
-fdata-sections
和-fdata-sections
链接进行-gc-sections
,但似乎我认为一些未使用的符号不会被丢弃。
在GNU工具链中是否有一些命令可以运行以找出哪些符号正在使用以及在哪里?
这里是我典型的构建标志:
编译: 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
链接: arm-none-eabi-g++.exe -static -mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -Wl,-gc-sections -Wl,-T"LinkerScript.ld
谢谢您的帮助。
使用交叉引用输出创建链接器映射文件:
-Wl,-Map=output.map -Wl,--cref
我无法找到显示符号依赖关系的命令。 但是,通过使用以下技术,我能够获得所需的信息:
/DISCARD/
部分。 这将输出一个错误消息,揭示哪个符号正在使用它。 它看起来像这样: <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>)
/DISCARD/
部分,直到找到问题的根源。 问题的根源在于有一个从另一个继承的类。 这创建了一个虚拟表,编译器无法删除在虚拟表中引用的死代码。
获得的经验:如果要减少代码大小并仍然使用C ++,请不要使用继承。 GNU工具链曾经有一个-fvtable-gc
开关来帮助解决这个问题,但是它-fvtable-gc
一段时间被删除了。 我会重构我的代码来解决我的具体问题。
您可以尝试链接器选项-Wl,--trace-symbol=<symbol_name>
。 它将显示在定义符号的输出中,以及符号的使用位置。
上一篇: c++
下一篇: Can I mix arm