0

好的...所以我想编写一个程序,仅使用 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 位置 - 这会给我部分表,而 sh_name 会给我一个字符串表的索引......

我怎么去毒刺桌?它是如何表示的?我该如何使用它?并且是 sh_name 中的值,字符串表中的索引(如果它表示为数组),或偏移量..

无论如何-假设我想打印前两个部分的名称-鉴于我在上面编写的代码帮助,我该怎么做?

4

1 回答 1

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));

等等。

于 2012-06-01T18:10:47.093 回答