Почему файл ELF содержит разделы symtab с размером = 0?

Я пытался понять таблицу символов внутри 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, верно?


person Troskyvs    schedule 09.10.2016    source источник


Ответы (1)


вы должны заметить, что тип символа STT_FILE из того, что я знаю, означает, что символы связаны с oject-файлом, с которым извлекаются символы. a в любом случае вы правы, value обычно обозначает индекс символа в разделе, содержащем его, а size обозначает размер символа

внутри символа, который вы просматриваете, индекс - ABS, а тип - STT_FILE. Это информация, которая должна использоваться во время статического связывания объектных файлов и позволять компоновщику знать, какие символы из какого источника пришли, следовательно, это абстрактный символ, который не фактически хранится в объектном файле, поэтому он не имеет значения и размера .... надеюсь, это помогло вам

person DrPrItay    schedule 19.10.2016