如何仅编译 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.o
、crti.o
和 crtbegin.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 文件,您将不得不自己创建它们(可能需要大量工作)。
是否有 GCC 配置可以生成仅包含 ARM32 代码的可执行文件?
我知道 -marm
开关告诉编译器不要生成 Thumb 代码,但它仅适用于程序的 用户代码 ,而初始化例程(例如 _start
, frame_dummy
, ...) 仍然包含 Thumb 指令。
我在 Linux x86-64 系统上使用 Linaro 交叉编译器工具链 (arm-linux-gnueabihf-
)。
编辑:
在重新编译工具链时,我自己找到了(可能的)解决方案。编码为 Thumb 的初始化例程是 glibc 的一部分,可以在目标文件 crt1.o
、crti.o
和 crtbegin.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 文件,您将不得不自己创建它们(可能需要大量工作)。