是否存在编译指示或属性可避免GCC移除未使用的调试类型?
GCC未使用类型调试符号保留方法
默认情况下,GCC不会为未使用的类型生成调试符号。例如以下代码:
union my_type_A { int _; }; int main() {}
由于实际项目复杂度较高,启用全局选项-fno-eliminate-unused-debug-types会带来显著的空间开销。目前常用的临时解决方案是添加一个未使用的函数来引用该类型:
void foo(my_type_A) {}
但这种方法不够直观,以下是更合适的方案:
解决方案:使用**__attribute__((used))**属性
可以通过GCC的used属性针对单个类型保留调试符号,无需启用全局选项。有两种实现方式:
标记typedef
为类型的typedef添加__attribute__((used))属性,即使该typedef未被使用,也会保留对应类型的调试符号:union my_type_A { int _; }; typedef union my_type_A my_type_A __attribute__((used)); int main() {}直接标记类型定义
在类型定义时添加__attribute__((used))属性(GCC 4.9及以上版本支持):union __attribute__((used)) my_type_A { int _; }; int main() {}
以上两种方式都能确保目标类型的调试符号被GCC保留,同时避免全局选项带来的额外空间开销。
参考GCC官方手册的「调试选项」章节内容,-fno-eliminate-unused-debug-types是全局禁用未使用调试类型移除的方案,而__attribute__((used))则是针对单个类型的轻量化替代方案。
内容的提问来源于stack exchange,提问作者Home of the Brave
相关产品推荐
相关产品推荐

