我试图理解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中包含信息毫无意义。
,例如,对于第" 1"包含源文件名" a.c" (我标记为" #Confused),它有Ndx = ABS和Name = a.c的信息,如果这个部分是0大小,那么它是如何存储在ELF中的?我想应该至少有3个字节来保存" a.c"文件名,因此大小应为> = 3。正确?
答案 0 :(得分:0)
你应该注意到符号的类型是
根据我所熟悉的Intent emailIntent = new Intent();
emailIntent.setAction(Intent.ACTION_SEND);
emailIntent.putExtra(Intent.EXTRA_TEXT, text);
emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
emailIntent.setType("message/rfc822");
Intent openInChooser = Intent.createChooser(emailIntent,resources.getString(R.string.app_name));
startActivity(openInChooser);
意味着符号与提取的符号的oject文件相关。
一个
无论如何你是正确的,STT_FILE
通常标记包含它的部分内的符号索引,value
表示符号的大小
索引为size
,类型为ABS
这是在目标文件的静态链接期间应该使用的信息,并允许链接器知道哪些符号来自哪个源,因此这是一个实际上不存储在目标文件中的抽象符号,因此它没有值且没有大小....希望这有助于你