如何仅编译 ARM32 二进制文件(没有拇指)

How to compile ARM32 only binary (no thumb)

是否有 GCC 配置可以生成仅包含 ARM32 代码的可执行文件? 我知道 -marm 开关告诉编译器不要生成 Thumb 代码,但它仅适用于程序的 用户代码 ,而初始化例程(例如 _start , frame_dummy, ...) 仍然包含 Thumb 指令。 我在 Linux x86-64 系统上使用 Linaro 交叉编译器工具链 (arm-linux-gnueabihf-)。

编辑:

在重新编译工具链时,我自己找到了(可能的)解决方案。编码为 Thumb 的初始化例程是 glibc 的一部分,可以在目标文件 crt1.ocrti.ocrtbegin.o 中找到。我没有尝试重新编译它,但可能有一个配置值强制将整个 libc 编码为 ARM32。

Is there a GCC configuration which will produce an executable only containing ARM32 code? I know the -marm switch ...

您的主要问题是该代码(例如 _start)不是由编译器生成的,但它已经存在预编译(作为拇指代码)。

如果你想让这些函数成为非拇指代码,你必须 "replace" 现有文件(拇指)由你自己的(非拇指)。

(您不必覆盖现有文件,但您可以指示链接器在不同的目录中搜索这些文件。)

如果您找不到预建的非 thumb 文件,您将不得不自己创建它们(可能需要大量工作)。