将 ARM gcc 生成的库从一个软浮点 bi 转换为硬浮点 abi

Convert a ARM gcc generated library from one soft float bi to hard float abi

我需要 link 我的固件(运行 在 STM32L4x6 上,使用 arm-none-eabi_gcc 构建)与两个第三方库(我没有这些库的源代码) .

一个库是使用硬浮点 ABI 编译的,另一个库根本没有使用浮点并且 link 可能是用软浮点 ABI 编译的。

我知道这两个 abis 不兼容,我完全理解它们之间的区别,但是如果一个库根本不使用 float 操作怎么办?是什么阻止了 link 使用任何 abi 的其他代码?

据我搜索,在这种情况下不可能强制 linker,但是是否可以 "convert" 一个库(.a 来自 gcc)从一个浮点数abi 到另一个 ?

我能想到的唯一方法是另一个 C 包装器,您可以在其中定义将链接到软浮点数和硬浮点数的函数。这当然是解决方法,但您需要向编译器展示如何将参数传递给函数。

您可以强制 linker 接受具有不匹配 ABI 的对象

--noinhibit-exec

或(如果它是通过 gcc 包装器调用的)

-Wl,--noinhibit-exec

您会收到一些错误消息,但它仍会生成外观合理的二进制文件。

或者,您可以使用

从对象文件中删除包含 ABI 信息的属性
arm-none-eabi-objcopy --remove-section=.ARM.attributes input.o output.o

然后 link 人会很高兴地 link 它与之后的任何事情。

如果它不是单个目标文件 (.o) 而是一个库 (.a),那么您可能必须使用 arm-none-eabi-ar 和之后重新组装。