将 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
和之后重新组装。
我需要 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
和之后重新组装。