为何结构体定义未出现在objdump的动态符号表输出中?
为什么自定义结构体MyStruct没出现在动态符号表中?
测试代码
#include <iostream> struct MyStruct { int i; }; int main(int argc, char** argv) { MyStruct s; s.i = 1; std::cout << s.i << std::endl; return 0; }
执行命令与输出
执行命令:objdump -TC test
输出的动态符号表:
/home/.../test: file format elf64-x86-64 DYNAMIC SYMBOL TABLE: 0000000000000000 DF *UND* 0000000000000000 GLIBCXX_3.4 std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&) 0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 __cxa_atexit 0000000000000000 DF *UND* 0000000000000000 GLIBCXX_3.4 std::ostream::operator<<(std::ostream& (*)(std::ostream&)) 0000000000000000 DF *UND* 0000000000000000 GLIBCXX_3.4 std::ios_base::Init::Init() 0000000000000000 DF *UND* 0000000000000000 GLIBCXX_3.4 std::ostream::operator<<(int) 0000000000000000 w D *UND* 0000000000000000 _ITM_deregisterTMCloneTable 0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 __libc_start_main 0000000000000000 w D *UND* 0000000000000000 __gmon_start__ 0000000000000000 w D *UND* 0000000000000000 _ITM_registerTMCloneTable 0000000000000000 DF *UND* 0000000000000000 GLIBCXX_3.4 std::ios_base::Init::~Init() 0000000000000000 w DF *UND* 0000000000000000 GLIBC_2.2.5 __cxa_finalize 0000000000004040 g DO .bss 0000000000000110 GLIBCXX_3.4 std::cout
原因分析
动态符号表仅记录模块间需要共享的实体,比如全局函数、全局变量、动态链接库的外部函数等。你的MyStruct不出现的核心原因是:
- 它是普通类型定义,没有包含虚函数:C++中只有带虚函数的结构体/类会生成虚表,虚表会作为全局符号进入符号表
- 仅在
main函数内部使用,未导出到其他模块:编译器会将结构体的类型信息直接内联到代码中,无需生成独立的符号条目 - 不存在以该结构体为类型的全局变量或导出函数:这类实体才会触发编译器生成相关符号
验证方法
如果想让MyStruct相关符号出现在动态符号表中,可以修改代码触发符号生成:
#include <iostream> struct MyStruct { int i; virtual void dummy() {} // 添加虚函数,生成虚表符号 }; MyStruct global_instance; // 定义全局变量,生成类型相关符号 int main(int argc, char** argv) { MyStruct s; s.i = 1; std::cout << s.i << std::endl; return 0; }
重新编译后执行objdump -TC test,就能看到类似_ZTV8MyStruct(虚表符号)、_ZTI8MyStruct(类型信息符号)、global_instance的符号条目。
内容的提问来源于stack exchange,提问作者theateist
相关产品推荐
相关产品推荐

