gpt4 book ai didi

c - 在 C 中访问 ELF 符号表

转载 作者:太空狗 更新时间:2023-10-29 17:08:24 28 4
gpt4 key购买 nike

我正在编写一个程序来模仿 elfdump -ecps

它目前正确地打印出 elf 头、程序头和节头,但我卡在了符号表的最后几个部分。

所需的输出格式为:

Symbol Table Section:  .dynsym
index value size type bind oth ver shndx name
[0] 0x00000000 0x00000000 NOTY LOCL D 0 UNDEF
[1] 0x00025c0c 0x00000000 FUNC GLOB D 2 UNDEF .udiv
[2] 0x00025e00 0x00000140 OBJT WEAK D 1 .bss _iob
[3] 0x00025b24 0x00000000 OBJT GLOB P 1 .got _GLOBAL_OFFSET_TABLE_
[4] 0x00013a44 0x0000001c FUNC GLOB D 1 .init _init
...

你能告诉我在哪里可以找到 oth、ver、shndx 和 name 吗?

到目前为止,我使用以下内容打印出来:

//for each entry in the symbol table
for(i=0; i<num_sym; i++)
{
//read the current symbol
fread(&mysym,sizeof(Elf32_Sym),1,fp);
idx=mysym.st_name;

//multiple lines to get formatting correct
//prints index in brackets right aligned
char buf[12];
sprintf(buf, "[%d]", i);
printf("%10s", buf);

//value
printf(" 0x%.8x", mysym.st_value);
//size
printf(" 0x%.8x", mysym.st_size);

//type
switch (ELF32_ST_TYPE(mysym.st_info)) {
case 0:
printf(" NOTY");
break;
case 1:
printf(" OBJT");
break;
case 2:
printf(" FUNC");
break;
case 3:
printf(" SECT");
break;
case 4:
printf(" FILE");
break;

default:
break;
}

//bind
switch(ELF32_ST_BIND(mysym.st_info))
{
case 0: printf(" LOCL");
break;
case 1: printf(" GLOB");
break;
case 2: printf(" WEAK");
break;
case 3: printf(" NUM");
break;

default:
break;
}
//TODO: oth
//TODO: ver
//TODO: shndx
//TODO: name

}

我一直在阅读 http://docs.oracle.com/cd/E19457-01/801-6737/801-6737.pdf (第 5 章)但未能找到任何有用的信息

最佳答案

从您链接到的文档的第 119 页开始,Symbol Table 涵盖了大部分内容。

它实际上具有您需要的结构:

typedef struct {
Elf32_Word st_name;
Elf32_Addr st_value;
Elf32_Word st_size;
unsigned char st_info;
unsigned char st_other;
Elf32_Half st_shndx;
} Elf32_Sym;

以及有关如何查找链接条目信息的详细信息(特别是从 st_name 结构字段中查找名称的方法)。

不幸的是,该文档似乎没有涵盖某些东西的来源(例如版本),因此,当我试图模拟另一个具有可用源的程序时,我the source - 真的没有比这更明确的了:-)

从该文件的第 1665 行开始,您会找到 elf_print_symtab() 函数,它负责输出您感兴趣的信息。它调用 get_versym() 获取该信息,从第 1632 行的代码中,您可以看到它为此使用了不同的部分(version symbol section)。

并且可以看出here ,该部分类型被认为是特定于操作系统的部分类型之一,这就是为什么您不会在基本标准中找到它的原因,它只关注常见的东西。

关于c - 在 C 中访问 ELF 符号表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12255555/

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