微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 GCC 不总是发出原子内置函数?

如何解决为什么 GCC 不总是发出原子内置函数?

使用 crosstool-ng,我为 mips-unkNown-linux-uclibc 构建了一个 GCC 10.2 交叉工具链。它适用于我正在编译的遗留应用程序。我最近尝试使用使用 crosstool-ng 构建的类似 GCC 交叉工具链为运行 RTOS 的嵌入式设备编译相同的应用程序。主要区别在于我将其配置为使用 newlib 而不是 uclibc 并将其设置为裸机而不是 linux。工具链大多有效,但链接时出现以下错误

undefined reference to `__sync_val_compare_and_swap_4'
undefined reference to `__sync_add_and_fetch_4'

快速浏览 libgcc.a 会发现这些符号存在于 mips-unkNown-linux-uclibc 工具链中

dani@ws:~/x-tools$ nm mips-unkNown-linux-uclibc/lib/gcc/mips-unkNown-linux-uclibc/10.2.0/libgcc.a | grep sync_add
sync_add_and_fetch_1.o:
00000000 T __sync_add_and_fetch_1
sync_add_and_fetch_2.o:
00000000 T __sync_add_and_fetch_2
sync_add_and_fetch_4.o:
00000000 T __sync_add_and_fetch_4
sync_add_and_fetch_8.o:
sync_add_and_fetch_16.o:

并且不在 mips-unkNown-elf 工具链中

dani@ws:~/x-tools$ nm mips-unkNown-elf/lib/gcc/mips-unkNown-elf/10.2.0/libgcc.a | grep sync_add
sync_add_and_fetch_1.o:
sync_add_and_fetch_2.o:
sync_add_and_fetch_4.o:
sync_add_and_fetch_8.o:
sync_add_and_fetch_16.o:
dani@ws:~/x-tools$

当 linux 不是目标时,为什么 GCC 编译器构建不发出同步内置函数?我如何配置它才能做到这一点?我目前的 hack 是创建我自己的程序集实现,这些实现与 GCC 在 mips-unkNown-linux-uclibc 工具链中发出的那些实现相同,但更愿意理解为什么它们不首先发出。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。