ELF中目标文件的符号

本文介绍了ELF目标文件中的符号,它作为链接器构建可执行文件的依据,用于标识函数、全局变量等。通过示例展示了如何查看C语言程序的目标文件符号,并详细解释了ELF符号结构。还讨论了C++中的名称修饰,如以_Z开头的符号和嵌套名字。

 0x00 什么是目标文件的符号

符号(symbol)是一个字符串用来标志不同类型(函数,全局变量,静态变量等)。链接器通过查询不同的目标文件(object file) 的符号表来链接生成可执行文件(binary file)。 符号扮演者对外的一些接口,通过查看目标文件或共享目标文件(so), 可以定位到需要使用的API函数,或者外部全局变量。

0X01 具体用法

通过一个简单的c语言程序来简单查看一下symbol。

#include <stdio.h>

int initGloable = 1;
int unitGloable;

static int statusValue = 20;

extern void printf(char*, ...);

void func(int c) {
  printf("hello world %d \n", c);
}

int main (int argc, char** argv) {

  func(0);

  return 0;
}

编译上面的示例代码生成目标文件,并把dump出所有的符号信息

 $nm test.o
                 U _GLOBAL_OFFSET_TABLE_   
0000000000000000 D initGloable            //已经初始化的数据节
0000000000000024 T main                   //text section 中的符号
                 U printf                //未定义的符号链接
0000000000000000 B unitGloable           //未赋初值的全局变量,B表示(BSS节数据内容)
0000000000000000 T _Z4funci                
0000000000000004 d _ZL11statusValue    //局部初始化的数据内容,static 

分别有三列,第一列表示符号值,第二列符号类型(大写字符表示全局变量,小写常表示局部变量),具体没有值的含义可以参考manual page。第三列为符号名。

从ELF符号结构来看

以下是ELF的符号结构,

       typedef struct {
               uint32_t      st_name;
               Elf32_Addr    st_value;
               uint32_t      st_size;
               unsigned char st_info;
               unsigned char st_other;
               uint16_t      st_shndx;
           } Elf32_Sym;

           typedef struct {
               uint32_t      st_name;    //符号名
               unsigned char st_info;    //符号绑定和绑定信息
               unsigned char st_other;   //该成员目前为0, 没用
               uint16_t      st_shndx;   //符号所在的段
               Elf64_Addr    st_value;   //符号相对应的值
               uint64_t      st_size;    //符号大小。
           } Elf64_Sym;

其中,st_in

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值