You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何结构体定义未出现在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 06:05:04