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

#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 , это информация, которая должна использоваться при статическом связывании объектных файлов и позволяет компоновщику знать, какие символы пришли из какого источника, следовательно, это абстрактный символ, который фактически не хранится в объектном файле, следовательно, он не имеет значения и не имеет значения.размер…. надеюсь, это помогло вам