0

ELF内のシンボルテーブルを理解しようとしていたので、次のことがありました。

$ cat a.c 

 int i=0; 
 int j; 
 static int l=4; 
 void k(); 
 void d(){ 
   k(); 
 } 

ELF 内の symtab をコンパイルしてチェックします。

$ 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 で、一部はサイズ = 0 なのですか?

質問:

size=0 の場合、存在しないはずであり、ELF 内に情報を保持しても意味がないと思います。

たとえば、ソースファイル名「ac」を含む行「1」(私は「# Confused」とマークしました) には、Ndx=ABS および Name=ac の情報があります。このセクションのサイズが 0 の場合、ELF 内にどのように格納されますか? ? "ac" というファイル名を保存するには、少なくとも 3 バイトあるはずなので、サイズは >=3 にする必要があります。

4

1 に答える 1