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

art*_*ise 3 arm binutils

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

find但是,如果我有一个脚本/工具谓词,以便可以使用 等 来搜索影子文件系统以查找可能丢失的二进制文件,那么事情会容易得多。我认为其中一些信息将位于ELF标题中并可以通过objdump或访问readelf,但我没有找到任何可靠的信息。

具体来说,我正在寻找,

  1. 编译的“C”如果没有 Linux 系统就无法运行CONFIG_ARM_THUMB
  2. make使用“C”编译器标志的规则会阻塞非拇指编译器。

注1:互通允许在thumbarm模式之间轻松切换,编译器将自动生成代码以支持从任一模式调用。

art*_*ise 5

输出readelf -A不描述elf内容。它只是描述了预期或提供给编译器的处理器和/或系统的功能。由于我有一个ARM926CPU,它是一个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]$
Run Code Online (Sandbox Code Playgroud)

即,只需查看初始ELF条目值并查看低位是否被设置。这是一个快速检查,符合我所寻找的精神。 unixsmurf有一个优点,任何ELF内的代码都可以混合和匹配ARMThumb。如果程序动态地识别CPU 并选择适当的例程,这也许没问题。即,仅存在Thumb指令并不意味着代码将会执行。

只需查看该entry值即可确定gcc使用了哪些编译器标志,至少对于gcc版本 4.6 到 4.7 而言是如此。