当前位置: 首页 > news >正文

编译链接实战(9)elf符号表

文章目录

    • 符号的概念
    • 符号表探索

前面介绍了elf文件的两种视图,以及两种视图的各自几个组成部分:

img

elf文件有两种视图,链接视图和执行视图。在链接视图里,elf文件被划分成了elf 头、节头表、若干的节(section);在执行视图里,elf文件被划分成了elf头、程序头表、段(segment)。

可以看到,段实际上包含了若干个节,执行视图是给程序启动用的,用于指示如何加载程序;而链接视图是连接时使用的,用于指示链接器如何链接文件。

节头表就是一个表,可以理解成一个结构体数组,每一项用于描述一个节。每个我们今天来看下其中的一个节【符号表】。

今天我们关注**.symtab.dynsym**这两个节。

动态符号表 (.dynsym) 用来保存与动态链接相关的导入导出符号,不包括模块内部的符号。

而 .symtab 则保存所有符号,包括 .dynsym 中的符号。

符号的概念

什么是符号?我们将函数和全局变量(static局部变量也算)统称为符号(Symbol),函数名和变量名就是符号名(Symbol Name),我们可以将符号看做是链接中的粘合剂,整个链接过程正是基于符号才能够正确完成。每个目标文件都会有一个符号表(Symbol Table),即上图的.symtab段,这个表里记录了目标文件所用到的所有符号。每个定义的符号有一个对应的值,叫做符号值(Symbol Value),对于变量和函数来说,符号值就是它们的地址。

在本目标文件中引用的全局符号,却没有定义在本目标文件中,一般叫做外部符号。

实际上段名(比如.text),汇编语言里的标签(比如_start、_edata、_end),源文件名也是符号。

备注:局部变量临时分配在栈中,不会在过程外被引用,所以不会产生符号。

弱符号

符号可以分为强符号和弱符号。

  • 强符号:函数名、初始化的全局变量名;
  • 弱符号:未初始化的全局变量名。

符号表探索

我们来写一个测试程序:
oop.c:

#include <stdio.h>
int g_a = 10;      
static int g_s_b;
static int g_s_c = 0;
int g_d;
__thread int g_tls_e;
static __thread int g_tls_s_f;
__thread int g_tls_g = 0;
extern int g_e_h;
extern void fun1();
void fun()
{int l_i;g_d = 10; static int l_s_i;g_e_h= 10;//外部变量和函数如果不使用的话,编译器不会为其产生符号表,因为会优化 fun1();printf("hello\n");return;
}//定义一个弱函数
__attribute__((weak)) void fun_weak() 
{return;
}

该程序定义了若干个变量用于覆盖所有情况。
前缀g表示全局,l表示局部,s表示静态,tls表示线程局部数据,e表示extern。

进行编译而不链接:

gcc oop.c -c 

得到oop.o可重定位对象文件,前面说过,也是elf格式文件。

查看其节头表:

$ readelf -S oop.o  --wide
There are 15 section headers, starting at offset 0x458:Section Headers:[Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al[ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0[ 1] .text             PROGBITS        0000000000000000 000040 000043 00  AX  0   0  1[ 2] .rela.text        RELA            0000000000000000 000330 000078 18   I 12   1  8[ 3] .data             PROGBITS        0000000000000000 000084 000004 00  WA  0   0  4[ 4] .bss              NOBITS          0000000000000000 000088 000010 00  WA  0   0  4[ 5] .tbss             NOBITS          0000000000000000 000088 00000c 00 WAT  0   0  4[ 6] .rodata           PROGBITS        0000000000000000 000088 000006 00   A  0   0  1[ 7] .comment          PROGBITS        0000000000000000 00008e 00002c 01  MS  0   0  1[ 8] .note.GNU-stack   PROGBITS        0000000000000000 0000ba 000000 00      0   0  1[ 9] .note.gnu.property NOTE            0000000000000000 0000c0 000020 00   A  0   0  8[10] .eh_frame         PROGBITS        0000000000000000 0000e0 000058 00   A  0   0  8[11] .rela.eh_frame    RELA            0000000000000000 0003a8 000030 18   I 12  10  8[12] .symtab           SYMTAB          0000000000000000 000138 000198 18     13   8  8[13] .strtab           STRTAB          0000000000000000 0002d0 00005a 00      0   0  1[14] .shstrtab         STRTAB          0000000000000000 0003d8 00007a 00      0   0  1
Key to Flags:W (write), A (alloc), X (execute), M (merge), S (strings), I (info),L (link order), O (extra OS processing required), G (group), T (TLS),C (compressed), x (unknown), o (OS specific), E (exclude),D (mbind), l (large), p (processor specific)

通过readelf的-s选项可以查看符号表:

$ readelf -s oop.o        Symbol table '.symtab' contains 17 entries:Num:    Value          Size Type    Bind   Vis      Ndx Name0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS oop.c2: 0000000000000000     0 SECTION LOCAL  DEFAULT    1 .text3: 0000000000000004     4 OBJECT  LOCAL  DEFAULT    4 g_s_b4: 0000000000000008     4 OBJECT  LOCAL  DEFAULT    4 g_s_c5: 0000000000000004     4 TLS     LOCAL  DEFAULT    5 g_tls_s_f6: 0000000000000000     0 SECTION LOCAL  DEFAULT    6 .rodata7: 000000000000000c     4 OBJECT  LOCAL  DEFAULT    4 l_s_i.08: 0000000000000000     4 OBJECT  GLOBAL DEFAULT    3 g_a9: 0000000000000000     4 OBJECT  GLOBAL DEFAULT    4 g_d10: 0000000000000000     4 TLS     GLOBAL DEFAULT    5 g_tls_e11: 0000000000000008     4 TLS     GLOBAL DEFAULT    5 g_tls_g12: 0000000000000000    56 FUNC    GLOBAL DEFAULT    1 fun13: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND g_e_h14: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND fun115: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND puts16: 0000000000000038    11 FUNC    WEAK   DEFAULT    1 fun_weak

strip之后就查询不到静态符号表信息了,但是动态符号表信息还是可以查到的。

可以看到该符号表包含了17项(entry),每一项用Elf32_Sym结构体描述:

typedef struct
{Elf32_Word    st_name;                /* Symbol name (string tbl index) */Elf32_Addr    st_value;               /* Symbol value */Elf32_Word    st_size;                /* Symbol size */unsigned char st_info;                /* Symbol type and binding */unsigned char st_other;               /* Symbol visibility */Elf32_Section st_shndx;               /* Section index */
} Elf32_Sym;

每一列的值其实都和结构体的成员相对应。

  • Name 符号的名字

  • Ndx 表示其所在section的序号,初始化过的全局变量g_a肯定在数据段.data,函数在代码段.text,【未经初始化的全局变量】和static变量在.bss段(static不管是否初始化都在bss段)。由于.bss段在程序启动时会被清0,所以未初始化的全局变量和static变量的值是0。
    对于在本文件中引用到,但是在其他文件定义的符号,其Ndx为UND,例如本例的extern变量和函数。在链接阶段,找到该符号的定义之后,会对其Ndx进行修正。

  • Value 该符号的值(注意不是变量的值),符号的值就是指符号的地址,对于编译的中间文件.ol来说,value其实是该符号在其所在的section的偏移,是个相对值;对于链接后的可执行文件来说,该值是个绝对值,表示符号的绝对地址。

  • Type 表示符号的类型,常见的几种类型如下:

 484 #define STT_NOTYPE      0               /* Symbol type is unspecified */485 #define STT_OBJECT      1               /* Symbol is a data object */486 #define STT_FUNC        2               /* Symbol is a code object */487 #define STT_SECTION     3               /* Symbol associated with a section */488 #define STT_FILE        4               /* Symbol's name is file name */489 #define STT_COMMON      5               /* Symbol is a common data object */490 #define STT_TLS         6               /* Symbol is thread-local data object*/
  • OBJECT 表示全局变量和static变量
    FUNC 表示函数
    FILE 文件名
    COM 公用全局变量
    TLS 线程本地数据

  • Bind列有以下几个常见值:

 472 #define STB_LOCAL       0               /* Local symbol */473 #define STB_GLOBAL      1               /* Global symbol */474 #define STB_WEAK        2               /* Weak symbol */

分别表示局部、全局、弱符号。

  • Vis表示该符号的可见范围,visibility的缩写:
 /* Symbol visibility specification encoded in the st_other field.  */#define STV_DEFAULT     0               /* Default symbol visibility rules */#define STV_INTERNAL    1               /* Processor specific hidden class */#define STV_HIDDEN      2               /* Sym unavailable in other modules */#define STV_PROTECTED   3               /* Not preemptible, not exported */ 

相关文章:

编译链接实战(9)elf符号表

文章目录符号的概念符号表探索前面介绍了elf文件的两种视图&#xff0c;以及两种视图的各自几个组成部分&#xff1a;elf文件有两种视图&#xff0c;链接视图和执行视图。在链接视图里&#xff0c;elf文件被划分成了elf 头、节头表、若干的节&#xff08;section&#xff09;&a…...

React合成事件的原理是什么

事件介绍 什么是事件&#xff1f; 事件是在编程时系统内发生的动作或者发生的事情&#xff0c;而开发者可以某种方式对事件做出回应&#xff0c;而这里有几个先决条件 事件对象 给事件对象注册事件&#xff0c;当事件被触发后需要做什么 事件触发 举个例子 在机场等待检票…...

Arduino-交通灯

LED交通灯实验实验器件&#xff1a;■ 红色LED灯&#xff1a;1 个■ 黄色LED灯&#xff1a;1 个■ 绿色LED灯&#xff1a;1 个■ 220欧电阻&#xff1a;3 个■ 面包板&#xff1a;1 个■ 多彩杜邦线&#xff1a;若干实验连线1.将3个发光二极管插入面包板&#xff0c;2.用杜邦线…...

【论文笔记】Manhattan-SDF == ZJU == CVPR‘2022 Oral

Neural 3D Scene Reconstruction with the Manhattan-world Assumption 本文工作&#xff1a;基于曼哈顿世界假设&#xff0c;重建室内场景三维模型。 1.1 曼哈顿世界假设 参考阅读文献&#xff1a;Structure-SLAM: Low-Drift Monocular SLAM in Indoor EnvironmentsIEEE IR…...

好消息!Ellab(易来博)官方微信公众号开通了!携虹科提供专业验证和监测解决方案

自1949年以来&#xff0c;丹麦Ellab一直通过全球范围内的验证和监测解决方案&#xff0c;协助全球生命科学和食品公司优化和改进其流程的质量。Ellab全面的无线数据记录仪&#xff0c;热电偶系统&#xff0c;无线环境监测系统&#xff0c;校准设备&#xff0c;软件解决方案等等…...

想要去字节跳动面试Android岗,给你这些面试知识点

关于面试字节跳动&#xff0c;我总结一些面试点&#xff0c;希望可以帮到更多的小伙伴&#xff0c;由于篇幅问题这里没有把全部的面试知识点问题都放上来&#xff01;&#xff01;目录&#xff1a;1.网络2.Java 基础&容器&同步&设计模式3.Java 虚拟机&内存结构…...

Java的Lambda表达式的使用

Lambda表达式是Java 8中引入的一个重要特性&#xff0c;它是一种简洁而强大的语法结构&#xff0c;可以用于替代传统的匿名内部类。 Lambda表达式的语法结构如下&#xff1a; (parameters) -> expression或者 (parameters) -> { statements; }其中&#xff0c;paramet…...

Spring MVC 源码 - HandlerMapping 组件(三)之 AbstractHandlerMethodMapping

HandlerMapping 组件HandlerMapping 组件&#xff0c;请求的处理器匹配器&#xff0c;负责为请求找到合适的 HandlerExecutionChain 处理器执行链&#xff0c;包含处理器&#xff08;handler&#xff09;和拦截器们&#xff08;interceptors&#xff09;handler 处理器是 Objec…...

超店有数,为什么商家要使用tiktok达人进行营销推广呢?

近几年互联网发展萌生出更多的短视频平台&#xff0c;而tittok这个平台在海外也越来越火爆。与此同时&#xff0c;很多商家也开始用tiktok进行营销推广。商家使用较多的方式就是达人营销&#xff0c;这种方法很常见且转化效果不错。那为什么现在这么多商家喜欢用tiktok达人进行…...

【分享】订阅万里牛集简云连接器同步企业采购审批至万里牛系统

方案场景 面临着数字化转型的到来&#xff0c;不少公司希望实现业务自动化需求&#xff0c;公司内部将钉钉作为办公系统&#xff0c;万里牛作为ERP系统&#xff0c;两个系统之前的数据都储存在各自的后台&#xff0c;导致数据割裂&#xff0c;数据互不相通&#xff0c;人工手动…...

C++类和对象_02----对象模型和this指针

目录C对象模型和this指针1、成员变量和成员函数分开存储1.1、空类大小1.2、非空类大小1.3、结论2、this指针概念2.1、解决名称冲突2.2、在类的非静态成员函数中返回对象本身&#xff0c;可使用return *this2.3、拷贝构造函数返回值为引用的时候&#xff0c;可进行链式编程3、空…...

瑞芯微RK3568开发:烧录过程

进入rk3568这款芯片的烧录模式共有3种方式&#xff0c;先讲需要准备的环境要求。 一、软硬件环境 1、配套sdk版本的驱动DriverAssitant_vx.x.x和RKDevTool_Release_vx.x&#xff0c;版本不对应可能无法烧录&#xff0c;建议直接在sdk压缩包里获取&#xff1b; 2、如果正确安…...

【数据结构】——树和二叉树的概念

目录 1.树概念及结构 1.1树的概念 1.2 树的相关性质 1.3 树的表示 1.4 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 2.二叉树概念及结构 2.1二叉树概念 2.2 特殊的二叉树 2.3 二叉树的性质 1.树概念及结构 1.1树的概念 树是一种非线性的数据结构…...

Meta分析在生态环境领域里的应用

Meta分析&#xff08;Meta Analysis&#xff09;是当今比较流行的综合具有同一主题的多个独立研究的统计学方法&#xff0c;是较高一级逻辑形式上的定量文献综述。20世纪90年代后&#xff0c;Meta分析被引入生态环境领域的研究&#xff0c;并得到高度的重视和长足的发展&#x…...

PrivateLoader PPI服务发现RisePro恶意软件窃取分发信息

称为PrivateLoader的按安装付费&#xff08;PPI&#xff09;软件下载器服务正用于恶意软件RisePro的信息窃取。Flashpoint 于 2022 年 12月13日发现了新的窃取者&#xff0c;此前发现了在名为Russian Market的非法网络犯罪市场上使用该恶意软件泄露的“几组日志”。RisePro是一…...

SQL93 返回购买 prod_id 为 BR01 的产品的所有顾客的电子邮件(一)

描述你想知道订购 BR01 产品的日期&#xff0c;有表OrderItems代表订单商品信息表&#xff0c;prod_id为产品id&#xff1b;Orders表代表订单表有cust_id代表顾客id和订单日期order_date&#xff1b;Customers表含有cust_email 顾客邮件和cust_id顾客idOrderItems表prod_idorde…...

Git ---- 概述

Git ---- 概述1. 何为版本控制2. 为什么需要版本控制3. 版本控制的工具集中式版本控制工具分布式版本控制工具4. Git 简史5. Git 工作机制6. Git 和代码托管中心Git 是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小型到大型的各种项目。 Git 易于学…...

用 tensorflow.js 做了一个动漫分类的功能(二)

前言&#xff1a;前面已经通过采集拿到了图片&#xff0c;并且也手动对图片做了标注。接下来就要通过 Tensorflow.js 基于 mobileNet 训练模型&#xff0c;最后就可以实现在采集中对图片进行自动分类了。这种功能在应用场景里就比较多了&#xff0c;比如图标素材站点&#xff0…...

小林coding

一、图解网络 问大家&#xff0c;为什么要有TCP/Ip网络模型&#xff1f; 对于同一台设备上的进程通信&#xff0c;有很多种方式&#xff0c;比如有管道、消息队列、共享内存、信号等方式&#xff0c;对于不同设备上的进程通信&#xff0c;就需要有网络通信&#xff0c;而设备是…...

操作系统真相还原_第6章:完善内核

文章目录6.1 函数调用约定简介6.2 汇编语言和C语言混合编程汇编调用CC调用汇编6.3 实现打印函数流程程序编译并写入硬盘执行6.4 内联汇编简介汇编语言AT&T语法基本内联汇编扩展内联汇编6.1 函数调用约定简介 调用约定&#xff1a; calling conventions 调用函数时的一套约…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...