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 にする必要があります。