RISC-V 64 链接错误 undefined reference to __atomic_exchange_1

我在完成操作系统课程设计时, 遇到了链接错误: undefined reference to `__atomic_exchange_1’。

经过研究, 我写出了最小的能够产生链接错误的代码如下:

#include <atomic>

int main()
{
  std::atomic<char> a(0);
  return a.exchange(1);
}

编译指令为: riscv64-unknown-elf-g++ -std=c++11 -Wall atomic.cc, 运行此命令, 立即可以得到上述链接错误。此外, 若将代码中char改为short, 可以得到类似的链接错误: undefined reference to `__atomic_exchange_2’。

经过研究, 这是因为RV64没有对8位整数或16位整数的原子操作的支持, 从而导致GCC不支持__atomic_exchange_1或__atomic_exchange_2。

其中, _1或_2指的是操作数的长度是1字节或2字节, 由于RV64支持32位整数或64位整数的原子操作, __atomic_exchange_4或__atomic_exchange_8有定义, 也就不会产生链接错误。读者可以试试将char换成int或者long。

根本原因是代码中使用了std::atomic<char>等, 间接用到了8位整数的原子操作。

__atomic_compare_exchange_1等链接错误原理类似。

特此记录。

发表评论

注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)

本文链接:https://twd2.me/archives/10597QrCode