我试图理解 ELF 中的符号表,所以我有:
$ cat a.c
int i=0;
int j;
static int l=4;
void k();
void d(){
k();
}
在 ELF 中编译并检查其符号表:
$ gcc -g a.c -c -m32 && readelf -s a.o
Symbol table '.symtab' contains 18 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 00000000 0 NOTYPE LOCAL DEFAULT UND
1: 00000000 0 FILE LOCAL DEFAULT ABS a.c # Confused
2: 00000000 0 SECTION LOCAL DEFAULT 1
3: 00000000 0 SECTION LOCAL DEFAULT 3
4: 00000000 0 SECTION LOCAL DEFAULT 4
5: 00000000 4 OBJECT LOCAL DEFAULT 3 l
6: 00000000 0 SECTION LOCAL DEFAULT 5
7: 00000000 0 SECTION LOCAL DEFAULT 7
8: 00000000 0 SECTION LOCAL DEFAULT 8
9: 00000000 0 SECTION LOCAL DEFAULT 10
10: 00000000 0 SECTION LOCAL DEFAULT 12
11: 00000000 0 SECTION LOCAL DEFAULT 14
12: 00000000 0 SECTION LOCAL DEFAULT 15
13: 00000000 0 SECTION LOCAL DEFAULT 13
14: 00000000 4 OBJECT GLOBAL DEFAULT 4 i
15: 00000004 4 OBJECT GLOBAL DEFAULT COM j
16: 00000000 13 FUNC GLOBAL DEFAULT 1 d
17: 00000000 0 NOTYPE GLOBAL DEFAULT UND k
真正让我感到困惑的是:它说(来自互联网),“值”表示每个部分的偏移量,“大小”表示目标大小。为什么它们都偏移 00000000 并且其中一些大小 = 0?
问题:
我想如果 size=0 那么它不应该存在,并且在 ELF 中拥有信息毫无意义。
例如,对于包含源文件名“ac”的行“1”(我标记为“#Confused”),它有Ndx=ABS和Name=ac的信息,如果这个部分是0大小,那么它是如何存储在ELF中的? 我想应该至少有3个字节来保存“ac”文件名,所以大小应该>=3。对吧?