news 2026/4/14 9:10:33

【DeepSeek】ELF中的动态符号表

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【DeepSeek】ELF中的动态符号表

DT_SYMTAB 详解(含符号类型深度解析)

DT_SYMTAB.dynamic段中的关键条目,其核心作用是定位动态符号表

以下是关于它的详细解析,重点深入剖析符号的类型与属性

1. 定义与指向
  • 定义DT_SYMTAB条目存储的是一个虚拟内存地址。
  • 指向目标:该地址指向.dynsym段。
  • 本质:它告诉动态链接器:“所有的动态符号信息(如导入的函数名、导出的函数名)都在这个地址开始的地方”。
2. 核心结构:Elf64_Sym

.dynsym段是一个数组,数组中的每一项都是一个Elf64_Sym结构体。

结构体定义:

typedefstruct{Elf64_Word st_name;// 符号名在字符串表(.dynstr)中的偏移unsignedcharst_info;// 【核心】符号类型与绑定属性(详见下文)unsignedcharst_other;// 符号可见性(Visibility)Elf64_Section st_shndx;// 符号所在的段索引(如 .text, .data)Elf64_Addr st_value;// 符号的值(地址或偏移)Elf64_Xword st_size;// 符号的大小(字节为单位)}Elf64_Sym;

3. 重点详解:st_info(符号类型与绑定)

st_info是一个 8 位的字段,它打包了两个极其重要的信息:绑定属性类型

系统通过宏来拆解这个字段:

  • #define ELF64_ST_BIND(i) ((i) >> 4)// 高 4 位:绑定属性
  • #define ELF64_ST_TYPE(i) ((i) & 0xf)// 低 4 位:符号类型
3.1 符号绑定属性:高 4 位

这决定了符号的可见性链接行为

名称含义动态链接中的作用
0STB_LOCAL局部符号不参与动态链接。这些符号仅在目标文件内部可见(如static函数)。动态链接器会忽略它们。.dynsym中通常不包含此类符号。
1STB_GLOBAL全局符号动态链接的核心。对其他目标文件可见。如果在当前文件中定义,则它是导出符号;如果未定义(st_shndx == SHN_UNDEF),则它是导入符号
2STB_WEAK弱符号弱引用/弱定义。类似于全局符号,但优先级较低。如果链接器找到了同名的GLOBAL符号,则使用全局符号;否则使用弱符号。常用于允许覆盖的默认实现。
3.2 符号类型:低 4 位

这决定了符号代表什么实体

名称含义动态链接中的处理
0STT_NOTYPE未指定类型未知类型。有时用于未定义的绝对符号或特殊目的。
1STT_OBJECT数据对象变量(如全局变量int global_var)。动态链接器解析后,会将变量的真实地址填入 GOT 表,代码通过 GOT 访问该变量。
2STT_FUNC函数函数或可执行代码(如printf)。这是最常见的情况。解析后,函数的真实地址会被填入 PLT/GOT 表。
3STT_SECTION段符号代表某个段(如.text段本身)。主要用于重定位,通常不出现在.dynsym中。
4STT_FILE文件符号源文件名。用于调试,链接器会忽略它。
10STT_GNU_IFUNC间接函数高级特性。符号的值不是函数地址,而是一个“解析函数”的地址。运行时先调用这个解析函数,返回值才是真正的函数地址。常用于实现多版本函数调度(如 glibc 的memcpy根据CPU型号选择最优实现)。

4. 实例分析:readelf --dyn-syms

让我们通过readelf看看真实的符号表,验证上述理论。

命令:readelf --dyn-syms /bin/ls

输出示例:

Symbol table '.dynsym' contains 85 entries: Num: Value Size Type Bind Vis Ndx Name 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND 1: 0000000000000000 0 FUNC GLOBAL DEFAULT UND malloc 2: 0000000000000000 0 FUNC GLOBAL DEFAULT UND free 3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND abort 4: 0000000000000000 0 OBJECT GLOBAL DEFAULT UND stderr ... 80: 0000000000004a30 312 FUNC GLOBAL DEFAULT 13 main 81: 0000000000004b20 32 FUNC WEAK DEFAULT 13 usage

深度解读:

  1. 第 0 项(空符号)

    • Type: NOTYPE,Bind: LOCAL。这是符号表的第 0 个索引,作为未定义符号的“空指针”引用,强制为空。
  2. 第 1 项

    • Name: malloc:函数名。
    • Bind: GLOBAL:全局符号。
    • Ndx: UND(Undefined):说明这是一个导入符号ls程序需要使用malloc,但自己没定义,需要动态链接器去 libc.so 找。
    • Type: FUNC:它是一个函数。
  3. 第 4 项

    • Name: stderr:标准错误流。
    • Type: OBJECT:它是一个变量(数据对象),不是函数。
    • Bind: GLOBAL,Ndx: UND:这是一个导入的全局变量。
  4. 第 80 项

    • Name: main:主函数。
    • Ndx: 13:定义在本文件的第 13 号段(通常是.text)。
    • Value: 0x4a30:有具体的地址值。
    • 作用:这是一个导出符号。虽然ls是可执行文件,但在某些调试或监控场景下,动态链接器需要知道main的地址。
  5. 第 81 项

    • Bind: WEAK:这是一个弱符号。如果链接时发现了同名的强符号,这个usage函数就会被覆盖。
5. 总结:DT_SYMTAB 的全貌

DT_SYMTAB指向的符号表,通过st_info字段清晰地划分了符号的疆域:

  • 区分数据与代码:通过STT_OBJECTSTT_FUNC告诉链接器,解析后填入 GOT 的是数据指针还是函数入口地址。
  • 区分导入与导出:通过Ndx(段索引) 配合GLOBAL绑定。UND是进口,具体段号是出口。
  • 区分强弱:通过GLOBALWEAK决定符号覆盖的优先级规则。

这套机制构成了动态链接器查找和修正符号的“法理依据”。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 9:09:29

如何快速掌握MouseTester:从入门到专业的鼠标性能测试完整指南

如何快速掌握MouseTester:从入门到专业的鼠标性能测试完整指南 【免费下载链接】MouseTester 项目地址: https://gitcode.com/gh_mirrors/mo/MouseTester MouseTester是一款专业的开源鼠标性能测试工具,能够帮助游戏玩家、设计师和硬件爱好者精准…

作者头像 李华
网站建设 2026/4/14 9:09:17

3步高效解锁加密音乐:Unlock Music Electron完整使用指南

3步高效解锁加密音乐:Unlock Music Electron完整使用指南 【免费下载链接】unlock-music-electron Unlock Music Project - Electron Edition 在Electron构建的桌面应用中解锁各种加密的音乐文件 项目地址: https://gitcode.com/gh_mirrors/un/unlock-music-elect…

作者头像 李华
网站建设 2026/4/14 9:08:36

Clawdbot汉化版实战:在企业微信里搭建免费、私密的AI对话助手

Clawdbot汉化版实战:在企业微信里搭建免费、私密的AI对话助手 1. 为什么选择Clawdbot汉化版 在企业日常工作中,我们经常需要快速获取信息、处理文档或生成内容。传统方式要么需要切换多个应用,要么依赖云端服务存在数据隐私风险。Clawdbot汉…

作者头像 李华
网站建设 2026/4/14 9:07:45

Kook Zimage真实幻想Turbo效果炸裂!高清梦幻人像作品集首发

Kook Zimage真实幻想Turbo效果炸裂!高清梦幻人像作品集首发 1. 梦幻人像生成新标杆 当第一次看到Kook Zimage真实幻想Turbo生成的作品时,我作为一个从业多年的数字艺术创作者,也不禁为它的表现力所震撼。这款基于Z-Image-Turbo底座的幻想风…

作者头像 李华
网站建设 2026/4/14 9:07:28

CSDN开发者社区Qwen3-TTS-12Hz-1.7B-CustomVoice实战分享

CSDN开发者社区Qwen3-TTS-12Hz-1.7B-CustomVoice实战分享 1. 引言 最近在CSDN开发者社区里,Qwen3-TTS-12Hz-1.7B-CustomVoice这个语音合成模型引起了广泛讨论。作为一个支持10种语言、内置9种高品质音色的开源模型,它让语音合成变得前所未有的简单和强…

作者头像 李华
网站建设 2026/4/14 9:07:24

深入浅出QML布局:ColumnLayout与ListView的结合

在QML编程中,布局管理是一个既关键又容易让人迷惑的部分。特别是当涉及到ColumnLayout和ListView的结合时,如何正确地管理它们的布局,避免未定义的行为和视觉上的混乱,是一个常见的问题。本文将通过一个实际的例子,详细探讨如何在QML中正确使用ColumnLayout来管理ListView…

作者头像 李华