GCC—gc-sections和查找符号依赖项
GCC --gc-sections and finding symbol dependencies
我正在尝试减少我的elf可执行文件的大小。我正在用-ffunction-sections
-fdata-sections
编译,并与-gc-sections
链接,但似乎一些我认为未使用的符号没有被丢弃。
是否有一些命令在GNU工具链我可以运行找出哪些符号正在使用和在哪里?
- 工具链:GNU arm-none-eabi 平台:Cortex-M4
- 语言:c++
以下是我的典型构建标志:
编译: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
谢谢你的帮助
我找不到显示符号依赖关系的命令。然而,我能够通过使用以下技术获得我需要的信息:
- 将符号添加到链接器脚本的
/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
开关来帮助解决这个问题,但它在一段时间前被删除了。我将重构我的代码来解决我的具体问题。
您可以尝试链接器选项-Wl,--trace-symbol=<symbol_name>
。它将显示在定义符号和使用符号的输出中。
创建具有交叉引用输出的链接器映射文件:
-Wl,-Map=output.map -Wl,--cref
- 如何从C++中的依赖类型中获得它所依赖的类型
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 将无符号char*转换为std::istream*C++
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- vscode g++链路故障:体系结构x86_64的未定义符号
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 使用gcc从静态链接的文件中查找可选符号
- C++中无符号字符溢出
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 当 lib 已添加到其他依赖项时,如何在 VS 中调试未解析的外部符号错误
- 如何定义具有依赖于符号调试的参数的函数
- C++为 Android 构建的库使用了错误的依赖项符号
- c/c 的文件/符号依赖图形可视化
- 依赖VS2010中静态编译的库时未定义的符号
- 如何强制DLL依赖,即使EXE没有直接使用任何符号
- GCC—gc-sections和查找符号依赖项
- 动态加载的PIC共享库具有来自NPIC依赖项的运行时未解析符号