确定... 所以我想编写一个程序,只使用mmap打印elf文件中的所有部分名称(这不重要......)
所以我到目前为止做的是这个 - 将文件绑定到stat结构= map_start = mmap(0,fd_stat.st_size,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0))< 0)
从我得到=的起点将其转换为写入格式 header =(Elf32_Ehdr *)map_start;
从文件=获取节标题偏移量 secoff = header-> e_shoff;
现在 - 我知道我需要去map_start + secoff位置 - 这会给我一个section表,而sh_name会给我一个字符串表索引...
我怎么去刺痛台? 它是如何表现的? 我该如何使用它?并且是sh_name中的值,字符串表中的索引(如果它表示为数组)或偏移量。
无论如何 - 让我说我想要打印前两个部分的名字 - 我怎么做才能完成我上面写的代码 请帮忙吗?
答案 0 :(得分:0)
header = (Elf32_Ehdr *) map_start;
secoff = header->e_shoff;
这可能是错的。除非显式声明Elf32_Ehdr结构__attribute__((packed))
,否则编译器最终会在结构成员之间插入填充,因此sizeof(Elf32_Ehdr) != (the actual size of an ELF header section)
。为什么不简单地使用libelf访问器函数呢?
更新:如果您不允许使用访问者功能,则必须执行以下操作:
Elf32_Ehdr hdr;
memcpy(&hdr.e_ident, map_start + 0, EI_NIDENT);
memcpy(&hdr.e.type, map_start + 0 + sizeof(Elf32_half), sizeof(Elf32_Half));
等等。