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

How can I interpret the data in .ARM.attributes in an ELF to get the architecture version and other attributes?

我最感兴趣的是提取体系结构版本,即 v5、v5T 等。我一直在参考 Elf for the ARM Architecture Section 4.3.6 Build Attributes,这对我了解这一点很有帮助。我可以找到 .ARM.attributes 部分的开始,并且可以解析信息的第一个关键部分:格式版本、部分长度和供应商名称 + 空字节,没问题。在那之后我有点迷路了。下面是我 运行 在使用 arm-linux-gnueabi-gcc -march=armv5t -O myprog.c -o myprog 为 ARMv5T 架构编译的精灵上使用 hexdump -vC 的快照。该部分的开始是 77f0b。

我们可以看到: 格式版本:A

节长:0x29

供应商名称:"aeabi"

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

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

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

这些标签记录在 Addenda to, and Errata in, the ABI for the ARM Architecture 中(注意:link 可能会转到过时的版本)。例如,在 2.3.5.2 节(目标相关属性)中,我们了解到 Tag_CPU_arch 的值为 6,它紧跟在 Tag_CPU_name 之后(5,在转储中的 5T) 之前。根据文档中的 table,它的参数是 3,这又对应于 ARM v5T。下一个标签是 Tag_ARM_ISA_use (8),参数为 1,表示 用户希望该实体可以使用 ARM 指令(不管这意味着什么),等等。

请注意,整数以 uleb128 格式编码,尽管此处并不明显。 DWARF standard(在 DWARF 3 的第 7.6 节)中描述了这种编码。基本上就是base-128,little endian,设置MSB的时候需要继续看下去