代码之家  ›  专栏  ›  技术社区  ›  Guillaume Petitjean

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

  •  2
  • Guillaume Petitjean  · 技术社区  · 6 年前

    我需要将我的固件(运行在stm32l4x6上,用arm-none-eabi_gcc构建)与两个第三方库(我没有这些libs的源代码)链接起来。

    一个lib是使用硬float abi编译的,另一个lib根本不使用float,可能与软float abi链接。

    我知道两个abi都不兼容,我完全理解它们之间的区别,但是如果一个库根本不使用float操作呢?是什么阻止了使用任何ABI将其与其他代码链接?

    从我在谷歌上搜索到的信息来看,在这种情况下不可能强制链接器,但是是否可以将库(.a从gcc)从一个浮动ABI“转换”到另一个浮动ABI?

    2 回复  |  直到 6 年前
        1
  •  2
  •   followed Monica to Codidact    6 年前

    可以强制链接器接受具有不匹配ABI的对象

    --noinhibit-exec
    

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

    -Wl,--noinhibit-exec
    

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

    或者,可以从对象文件中删除包含ABI信息的属性

    arm-none-eabi-objcopy --remove-section=.ARM.attributes input.o output.o
    

    然后链接器会很高兴地将它与任何东西链接起来。

    如果不是单个对象文件( .o )但是图书馆( .a ,然后您可能需要使用 arm-none-eabi-ar 然后重新组装。

        2
  •  0
  •   0___________    6 年前

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