gpt4 book ai didi

linux - 为什么 ELF 文件包含大小为 0 的符号表部分?

转载 作者:太空宇宙 更新时间:2023-11-04 12:41:51 25 4
gpt4 key购买 nike

我试图理解 ELF 中的符号表,所以我有:

$ cat a.c 

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

编译并检查其在 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

真正让我困惑的是:它说(来自互联网),“值”表示每个部分的偏移量,“大小”表示目标大小。为什么它们都是 offset 00000000 而其中一些 size=0?

Question:

我想如果 size=0 那么它不应该存在,并且在 ELF 中拥有信息是没有意义的。

例如,对于包含源文件名“a.c”(我标记为“#Confused”)的“1”行,它有Ndx=ABS和Name=a.c的信息,如果该部分是0大小,那么它如何存储在 ELF 中?我想至少应该有 3 个字节来保存“a.c”文件名,所以大小应该 >=3。对吗?

最佳答案

你应该注意到符号的类型是STT_FILE 我所熟悉的意思是符号与提取符号的对象文件相关。 A无论如何你是正确的,value 通常标记符号在包含它的部分中的索引,size 表示符号的大小

在您正在查看的代码中,索引是 ABS,类型是 STT_FILE这是在目标文件的静态链接期间应该使用的信息,并允许链接器知道哪些符号来自哪个源,因此这是一个抽象符号,实际上并没有存储在目标文件中,因此它没有值(value)也没有大小....希望这对你有帮助

关于linux - 为什么 ELF 文件包含大小为 0 的符号表部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39939489/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com