#linux #elf #symbols #readelf
#linux #elf #символы #readelf
Вопрос:
Я пытался понять таблицу символов внутри 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 amp;amp; 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
Что меня действительно смутило, так это:
В нем сказано (из Интернета), «Значение» означает смещение каждого раздела, а «размер» означает целевой размер. Почему все они имеют значение offfset 00000000, а некоторые из них size = 0?
Вопрос:
Я полагаю, что если size = 0, то он не должен существовать, и бессмысленно иметь информацию внутри ELF.
Например, для строки «1», которая содержит имя исходного файла «a.c» (я пометил «# Confused), он содержит информацию Ndx = ABS и Name = a.c, если этот раздел имеет размер 0, то как он хранится внутри ELF? Я полагаю, что для сохранения имени файла «a.c» должно быть не менее 3 байт, поэтому размер должен быть> = 3. верно?
Ответ №1:
вы должны заметить, что тип символа STT_FILE
из того, с чем я знаком, означает, что символы связаны с файлом извлечения, с помощью которого извлекаются символы. в любом случае, вы правы, value
обычно помечается индекс символа в разделе, содержащем его и size
представляющем размер символа
внутри символа, на который вы смотрите, индекс is ABS
и тип is STT_FILE
, это информация, которая должна использоваться при статическом связывании объектных файлов и позволяет компоновщику знать, какие символы пришли из какого источника, следовательно, это абстрактный символ, который фактически не хранится в объектном файле, следовательно, он не имеет значения и не имеет значения.размер…. надеюсь, это помогло вам