# Computer-Systems-A-Programmer-s-Perspective **Repository Path**: hucy001/Computer-Systems-A-Programmer-s-Perspective ## Basic Information - **Project Name**: Computer-Systems-A-Programmer-s-Perspective - **Description**: No description available - **Primary Language**: Unknown - **License**: BSD-3-Clause-Clear - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-07-26 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 可执行程序的符号表 ELF格式 符号表.symtab的每个链接符号包含两个属性:作用域和存放位置 #### 符号的作用域 1. 文件作用域 local 2. 函数作用域 local 3. 全局作用域 global #### 常用的段 1. text : 函数 2. data : 初始化值不为0的全局或静态变量 3. bbs : 初始化值为0或者未初始化的全局或静态变量 4. rodata : 所有的常量 #### 示例代码 ```c include "stdio.h" ifdef __cplusplus extern "C" { endif const double l_rodata=0; // 文件作用域 rodata段 double g_bbs; // 全局作用域 bbs段 const static double l_rodata_s=1.0; // 文件作用域 rodata段 static double l_bbs; // 文件作用域 bbs段 double g_data=1.0; // 全局作用域 data段 static double l_data=2.0; // 文件作用域 data段 // 全局作用域 text段 void f_test(int) { static int l_f_bbs; // 函数作用域 bbs段 static int l_f_bbs_0=0; // 函数作用域 bbs段 static int l_f_data=20; // 函数作用域 data段 } // 文件作用域 text段 static void g_test(double) { } // 全局作用域 text段 int main() { static int l_bbs; // 函数作用域 bbs段 const static int l_rodata= 11; // 函数作用域 rodata段 f_test(1); g_test(1.9); printf("hello world\n"); } ``` #### 使用readelf工具查看符号表 1. 编译可执行文件: **gcc -o test test.cpp** 2. 查看段信息: **readelf -S test** ```c Section Headers: [Nr] Name Type Address Offset Size EntSize Flags Link Info Align [13] . text PROGBITS 0000000000400440 00000440 00000000000001b2 0000000000000000 AX 0 0 16 [15] . rodata PROGBITS 0000000000400600 00000600 0000000000000034 0000000000000000 A 0 0 8 [24] . data PROGBITS 0000000000601030 00001030 000000000000001c 0000000000000000 WA 0 0 8 [25] . bss NOBITS 0000000000601050 0000104c 0000000000000028 0000000000000000 WA 0 0 8 [26] .comment PROGBITS 0000000000000000 0000104c 000000000000002d 0000000000000001 MS 0 0 1 [27] .symtab SYMTAB 0000000000000000 00001080 0000000000000720 0000000000000018 28 56 8 ``` 3. 查看变量符号: **readelf -s test|grep "OBJECT"** ```c 37: 0000000000601060 8 OBJECT LOCAL DEFAULT 25 _ZL5l_bbs 38: 0000000000601040 8 OBJECT LOCAL DEFAULT 24 _ZL6l_data 40: 0000000000400620 8 OBJECT LOCAL DEFAULT 15 _ZL8l_rodata 41: 0000000000400628 8 OBJECT LOCAL DEFAULT 15 _ZL10l_rodata_s 42: 0000000000601048 4 OBJECT LOCAL DEFAULT 24 _ZZ6f_testE8l_f_data 43: 0000000000601068 4 OBJECT LOCAL DEFAULT 25 _ZZ6f_testE9l_f_bbs_0 44: 000000000060106c 4 OBJECT LOCAL DEFAULT 25 _ZZ6f_testE7l_f_bbs 45: 0000000000400630 4 OBJECT LOCAL DEFAULT 15 _ZZ4mainE8l_rodata 46: 0000000000601070 4 OBJECT LOCAL DEFAULT 25 _ZZ4mainE5l_bbs 57: 0000000000601038 8 OBJECT GLOBAL DEFAULT 24 g_data 67: 0000000000601058 8 OBJECT GLOBAL DEFAULT 25 g_bbs ``` 4. 查看函数符号: **readelf -s test|grep "FUNC"** ```c 39: 0000000000400536 11 FUNC LOCAL DEFAULT 13 g_test 72: 0000000000400541 59 FUNC GLOBAL DEFAULT 13 main 73: 000000000040052d 9 FUNC GLOBAL DEFAULT 13 f_test ```