Я пытался понять таблицу символов внутри ELF, поэтому у меня было:
$ cat a.c
int i=0;
int j;
static int l=4;
void k();
void d(){
k();
}
Скомпилируйте и проверьте его symtab внутри 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, а некоторые из них size = 0?
Вопрос:
Я полагаю, что если size = 0, то его не должно существовать, и бессмысленно иметь информацию внутри ELF.
Например, для строки «1», содержащей имя исходного файла «ac» (я отметил «# Confused»), в ней есть информация о Ndx = ABS и Name = ac, если размер этого раздела равен 0, то как он сохраняется внутри ELF. ? Я полагаю, что для сохранения имени файла "ac" должно быть не менее 3 байтов, поэтому размер должен быть> = 3, верно?