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

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

被折叠的 条评论
为什么被折叠?



