- 论坛徽章:
- 1
|
我尝试理解elf当中的symtab,于是有下面这个小文件:
$ 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
- 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 14 FUNC GLOBAL DEFAULT 1 d
- 17: 00000000 0 NOTYPE GLOBAL DEFAULT UND k
复制代码 上面的信息让我不解的地方是:
网上说Value的信息是对应节的偏移,size是目标大小。为什么所有的对应节的偏移都是0,而且多个size也都是0。
(1) 大小为0,偏移为0,就是不存在的啊,为什么还会有对应的Type, Ndx和Name?
(2) 而且,如果size=0,那么上面的第"1"行,源文件的名称main.c对应Ndx=ABS(不该被重定位的符号),到底应该存在ELF文件的什么地方? 我的理解是size=0,就不存了?
非常疑惑。
|
|