@@ -94,7 +94,70 @@ https://stackoverflow.com/questions/131303/how-can-i-measure-the-actual-memory-u
94
94
95
95
96
96
97
+ 在Linux环境中,程序的符号信息(如函数名称、变量名称等)对于动态链接和加载非常重要。程序在运行时需要通过符号信息来定位具体的函数和数据。这一过程涉及多个阶段和组件,包括编译器、链接器、动态链接库(如`glibc`)以及操作系统内核。
97
98
99
+ ### 符号信息的存储位置
100
+
101
+ 符号信息主要存储在程序的可执行文件或共享库文件中。具体来说,符号信息存储在ELF(Executable and Linkable Format)文件的不同节(section)中。以下是几个重要的节:
102
+
103
+ 1. **`.symtab`**:符号表节,包含程序中的所有符号信息。
104
+ 2. **`.strtab`**:字符串表节,包含符号名称的字符串。
105
+ 3. **`.shstrtab`**:节名字符串表,包含各个节的名字。
106
+ 4. **`.rela.text`**:重定位节,用于描述如何将符号信息与实际的内存位置关联起来。
107
+ 5. **`.dynamic`**:动态节,描述了动态链接所需的信息,包括符号表的位置等。
108
+
109
+ ### 符号信息的加载过程
110
+
111
+ 当程序启动时,Linux系统会通过动态链接器(如`ld-linux.so`)加载程序及其所需的库文件。这个过程中涉及以下几个步骤:
112
+
113
+ 1. **加载ELF文件**:
114
+ - 操作系统内核首先加载程序的可执行文件(通常是`.elf`格式的文件)到内存中。
115
+
116
+ 2. **解析符号信息**:
117
+ - 动态链接器会读取ELF文件中的`.symtab`、`.strtab`、`.shstrtab`等节,解析符号信息。
118
+ - 对于动态链接的库,动态链接器还需要加载这些库文件,并解析其中的符号信息。
119
+
120
+ 3. **重定位(Relocation)**:
121
+ - 重定位是将符号信息绑定到具体的内存地址的过程。
122
+ - 动态链接器会根据`.rela.text`节中的信息进行重定位,将符号绑定到正确的内存地址。
123
+
124
+ 4. **符号解析(Symbol Resolution)**:
125
+ - 如果程序使用了动态链接库中的函数,动态链接器需要解析这些符号,确定它们在内存中的确切位置。
126
+ - 解析完成后,程序可以通过符号名称来访问相应的函数和数据。
127
+
128
+ ### 示例
129
+
130
+ 以下是一个简单的示例,展示了如何查看一个程序的符号信息:
131
+
132
+ 1. **使用`objdump`命令查看符号表**:
133
+ ```sh
134
+ objdump -t your_program | grep 'FUNC' # 查看函数符号
135
+ objdump -s your_program | grep 'DATA' # 查看数据符号
136
+ ```
137
+
138
+ 2. **使用`readelf`命令查看符号表**:
139
+ ```sh
140
+ readelf -s your_program # 查看符号表
141
+ ```
142
+
143
+ 3. **使用`nm`命令查看符号表**:
144
+ ```sh
145
+ nm your_program # 查看符号表
146
+ ```
147
+
148
+ ### 符号信息在内存中的位置
149
+
150
+ 在程序加载到内存后,符号信息的实际地址会根据程序的加载地址确定。具体来说:
151
+
152
+ - **符号表(`.symtab`)**:通常位于程序的只读数据段(如`.rodata`)中。
153
+ - **字符串表(`.strtab`)**:同样位于只读数据段中。
154
+ - **重定位信息(`.rela.text`)**:通常位于读写数据段(如`.data`)中,因为它需要在加载时进行更新。
155
+
156
+ 这些信息在程序加载到内存后,会根据程序的加载基地址进行调整。例如,如果程序加载到了虚拟地址`0x400000`,那么所有的符号信息也会相应地偏移。
157
+
158
+ ### 总结
159
+
160
+ 程序在Linux环境下通过符号信息定位到具体函数的过程主要包括符号解析和重定位。符号信息主要存储在ELF文件的不同节中,如`.symtab`、`.strtab`、`.shstrtab`等。这些信息在程序加载到内存后,会根据程序的加载地址进行调整,并通过动态链接器进行解析和绑定,以确保程序能够正确地访问和调用函数和数据。
98
161
99
162
100
163
0 commit comments