Skip to content
ArielAxionL edited this page Apr 25, 2022 · 7 revisions

如何方便地更新 *sums

请使用 pacman-contrib 包里的 updpkgsums 工具。

如何处理 extra-riscv64-build 报错

  • /var/lib/archbuild/extra-riscv64-build/user does not appear to be an Arch chroot

    删除 /var/lib/archbuild/extra-riscv64-build/

  • 包下载完成后报签名错误

    devtools 的 chroot 共享了主机 OS 的 pacman 包缓存,如果主机 OS 中存在同名同架构同版本的包(一般是架构无关的 any 包)时,chroot 中的 pacman 就会认为包已经存在,不会尝试下载。而 riscv64 chroot 里 pacman 的源与主机 OS 不一样,包的签名也就不一样,因此会出现签名校验失败的错误。

    建议为 chroot 单独创建一个缓存目录(如 ~/.cache/rv64-packages),并在调用 devtools 时把这个目录挂载进去:

    extra-riscv64-build -- -d ~/.cache/rv64-packages:/var/cache/pacman/pkg
    
  • 一些由 qemu 本身导致的问题,而开发板能编译通过

    在 telegram bot 上 使用 /mark 命令标记对应的包,例如:

    /mark wayland noqemu
    
    1. 能 patch 使用 generic 分支的就不要 noqemu,如果 qemu 过不了板子能过,不要修
    1. 将 wayland 添加到 qemu user blacklist

如何解决编译器 warning/error 导致编译失败的问题

示例情况

error: format not a string literal and no format arguments [-Werror=format-security]
Error: redefined symbol cannot be used on reloc

解决办法

优先检查上游是否已经修复了问题。若已修复,则可以引入对应的 patch。否则,请尝试修复后提交给上游,并引入 patch。

不建议修改 *FLAGS 绕过问题。

如何处理「升级版本后可以构建成功」的包

是肥猫的包请告诉肥猫,不是肥猫的包肥猫也没有办法。

考虑:

  1. 去 Arch 包管理站上 flag outdated
  2. 手动从上游 cherry-pick 有用的 commit,或将有用的 commit 组合成 patch。

如何解决 atomic 相关的问题

这类问题有很多种情况,需要 case by case 处理。

根源:https://github.com/riscv-collab/riscv-gcc/issues/12

链接时找不到 __atomic_*

多线程程序,构建系统中只指定了 -lpthread

将对应的 -lpthread 改成 -pthread。参考 https://github.com/felixonmars/archriscv-packages/pull/193/files

cmake
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(my_app PRIVATE Threads::Threads)

程序中显式使用了 __atomic_*

没有定论,如果程序也使用了 pthread 请参照上一条。

程序判断了 ATOMIC_*_LOCK_FREE 宏的值

例如:percona-server 的 lock_free_type.h

gcc 下暂时没有办法让这个宏的值等于 2,请换 clang 试试。

如何在 C 代码中判断 riscv64

#if defined(__riscv) && __riscv_xlen == 64

如何解决 __m128 对齐问题

考虑换用 alignas(16)

如何获取 cpu cycle 数量

if defined(__riscv) && __riscv_xlen == 32
  uint32_t cycles_lo, cycles_hi0, cycles_hi1;
  // Implemented in assembly because Clang insisted on branching.
  asm volatile(
    "rdcycleh %0\n"
    "rdcycle %1\n"
    "rdcycleh %2\n"
    "sub %0, %0, %2\n"
    "seqz %0, %0\n"
    "sub %0, zero, %0\n"
    "and %1, %1, %0\n"
    : "=r"(cycles_hi0), "=r"(cycles_lo), "=r"(cycles_hi1));
  return (static_cast<uint64_t>(cycles_hi1) << 32) | cycles_lo;
#elif defined(__riscv) && __riscv_xlen == 64
  uint64_t cycles;
  asm volatile("rdcycle %0" : "=r"(cycles));
  return cycles;
Clone this wiki locally