如何在 ELF 中解释 .ARM.attributes 中的数据以获取体系结构版本和其他属性?

Tal*_*ria 4 arm elf eabi

我最感兴趣的是提取体系结构版本,即 v5、v5T 等。我一直在参考Elf 的 ARM 体系结构部分 4.3.6 构建属性,这有助于我达到这一点。我可以找到.ARM.attributes部分的开头,并且可以解析信息的第一个关键部分:Format-version,Section-length和vendor-name + null byte,没问题。在那之后我有点失落。下面是我在为 ARMv5T 架构hexdump -vC编译的精灵上运行的快照arm-linux-gnueabi-gcc -march=armv5t -O myprog.c -o myprog。该部分的开头是 77f0b。

在此处输入图片说明

我们可以看到: Format-version: A

段长度:0x29

供应商名称:“aeabi”

显然,5T 在 77f1C 以 ASCII 形式提供,但我不确定如何解释我需要解析以获得该值的标签。

注意:是的,我知道我可以使用一些工具来执行此操作,但我需要在我正在编写的应用程序中提取信息。它已经解析了必要的信息,以使其走到这一步。

额外问题:PowerPC 是否有类似的标签?我找不到任何支持文档。

Flo*_*mer 7

这些标签记录在ARM 体系结构 ABI附录和勘误表中(注意:链接可能指向过时的版本)。例如,在第 2.3.5.2 节(与目标相关的属性)中,我们了解到它的Tag_CPU_arch值为 6,它紧跟在转储中的Tag_CPU_name(5, 在 之前5T) 之后。根据文档中的表格,它的参数是 3,它再次对应于 ARM v5T。下一个标记是Tag_ARM_ISA_use(8),参数为 1,表示用户希望该实体可以使用 ARM 指令(无论这意味着什么),依此类推。

请注意,整数以 uleb128 格式编码,尽管这里不明显。DWARF 标准(在 DWARF 3 的第 7.6 节中)描述了这种编码。基本上,它是 base-128,小端,并且您需要在设置 MSB 时继续阅读。