为Thumb OR Arm编译的ARM ELF的脚本/工具谓词

时间:2013-04-09 22:52:24

标签: arm binutils

我有 rootfs klibc 文件系统。我正在创建make规则,一些开发人员有一个没有互联网的旧编译器。 note1 我试图验证所有文件仅使用 arm 构建当检测到某个版本的编译器时。我已经多次重建树了。我正在使用readelf -A并查找Tag_THUMB_ISA_use: Thumb-1,但这似乎只在 arm 代码中(但是使用互通编译器构建)以及thumb码。我可以手动运行objdump -S并检查汇编程序以确定正在使用的指令集。

但是,如果我有一个脚本/工具谓词,那么可以使用find等来搜索 shadow 文件系统以查找可能的二进制文件。已经错过了。我认为其中一些信息会出现在ELF标题中,可以通过objdumpreadelf访问,但我找不到任何可靠的信息。

具体我正在寻找,

  1. 编译后的“C”在没有CONFIG_ARM_THUMB Linux系统的情况下无法运行。
  2. make使用“C”编译器标志来阻止非拇指编译器的规则。
  3. note1:互通允许在thumbarm模式之间轻松切换,编译器将自动生成代码以支持从任一模式进行调用。

2 个答案:

答案 0 :(得分:3)

readelf -A输出未描述精灵内容。它只描述了预期或提供给编译器的处理器系统的功能。由于我的ARM926 CPU是ARMV5TEJ处理器,因此gcc / ld将始终设置为Tag_THUMB_ISA_use: Thumb-1,因为它只表示ARMV5TEJ被识别为Thumb-1能。它没有说明代码本身。

检查Linux arch/arm/kernel/elf.c例程elf_check_arch()会显示对x->e_entry & 1的检查。这导致以下脚本,

readelf -h $1 | grep -q Entry.*[13579bdf]$

即,只需查看初始 ELF 条目值,然后查看是否设置了低位。这是一个快速检查,符合我所寻找的精神。 unixsmurf有一个很好的观点,即任何 ELF 中的代码都可以混合使用 ARM Thumb 。如果程序动态 ids CPU并选择适当的例程,这可能没问题。即,仅存在 Thumb 指令并不意味着代码将执行。

仅查看entry值确定了使用了哪个gcc编译器标志,至少对于gcc版本4.6到4.7。

答案 1 :(得分:2)

由于拇指和手臂序列可以在目标文件中自由互换,即使在同一部分内,简单的ELF标题检查也无法帮助您确定文件是否包含Thumb指令。

略微迂回但仍然不是100%万无一失的方法是使用readelf -r并检查输出是否包含“R_ARM_THM”,表示拇指的重定位。