我有 rootfs 和 klibc 文件系统。我正在创建make
规则,一些开发人员有一个没有互联网的旧编译器。 note1 我试图验证所有文件仅使用 arm 构建当检测到某个版本的编译器时。我已经多次重建树了。我正在使用readelf -A
并查找Tag_THUMB_ISA_use: Thumb-1
,但这似乎只在 arm 代码中(但是使用互通编译器构建)以及thumb
码。我可以手动运行objdump -S
并检查汇编程序以确定正在使用的指令集。
但是,如果我有一个脚本/工具谓词,那么可以使用find
等来搜索 shadow 文件系统以查找可能的二进制文件。已经错过了。我认为其中一些信息会出现在ELF
标题中,可以通过objdump
或readelf
访问,但我找不到任何可靠的信息。
具体我正在寻找,
CONFIG_ARM_THUMB
Linux系统的情况下无法运行。make
使用“C”编译器标志来阻止非拇指编译器的规则。 note1:互通允许在thumb
和arm
模式之间轻松切换,编译器将自动生成代码以支持从任一模式进行调用。
答案 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”,表示拇指的重定位。