AArch64環境でDocker使ってbuildするおじさんです。
はじめに
今度は実験場にknot DNSを追加するために、alpineベースでKnot DNS用のDockerfileを書いておりました。
まぁbuildはうまくいくんですよ・・・
Knot DNSのbuild自体はドキュメントに沿ったつもりですが、一部公式のDockerfileを参考にしているところがあります。
ちなみに前置きしておきますと、公式のDockerイメージはUbuntu/Debian、それにFedora/CentOSみたいです。
問題のエラー
buildしていざ実行すると以下のようなエラーが。
# knotd -v -c /usr/local/etc/knot/knot.sample.conf Assertion failed: URCU_TLS(rcu_reader).registered (urcu.c: rcu_unregister_thread_memb: 530) Segmentation fault (core dumped)
そもそもURCUとは
URCU
ってなんぞやって思って調べてみると、以下のWebサイトがあります。
とりあえず概要は別として、エラーメッセージから、RCU
のTLSってあるので、暗号化周りのエラーってことになるんでしょうか。必須なパッケージとして書いて無さそうなんですが、公式のDockerイメージには必ず入っているので、外すのは難しい感じです。
ちなみにその後、外してconfigure
してみたところ、以下のようなエラーが出たので、必須コンポーネントみたいです。
checking for liburcu... no
checking for library containing rcu_set_pointer_sym... no
checking for library containing rcu_set_pointer_sym... no
checking for library containing rcu_set_pointer_sym... no
configure: error: liburcu is required
出来たCorefileを解析するとこんな感じ。
(gdb) info threads Id Target Id Frame * 1 LWP 9110 0x0000ffff8eb5053c in abort () from /lib/ld-musl-aarch64.so.1 2 LWP 9108 0x0000ffff8eb879b8 in __clone () from /lib/ld-musl-aarch64.so.1 3 LWP 9111 0x0000ffff8eb88414 in ?? () from /lib/ld-musl-aarch64.so.1 4 LWP 9117 0x0000ffff8eb879b4 in __clone () from /lib/ld-musl-aarch64.so.1 5 LWP 9114 0x0000ffff8eb879b4 in __clone () from /lib/ld-musl-aarch64.so.1 6 LWP 9109 0x0000ffff8eb879b8 in __clone () from /lib/ld-musl-aarch64.so.1 7 LWP 9112 0x0000ffff8eb88414 in ?? () from /lib/ld-musl-aarch64.so.1 8 LWP 9121 0x0000ffff8eb879b4 in __clone () from /lib/ld-musl-aarch64.so.1 9 LWP 9116 0x0000ffff8eb879b4 in __clone () from /lib/ld-musl-aarch64.so.1 10 LWP 9122 0x0000ffff8eb879b4 in __clone () from /lib/ld-musl-aarch64.so.1 11 LWP 9118 0x0000ffff8eb879b4 in __clone () from /lib/ld-musl-aarch64.so.1 12 LWP 9125 0x0000ffff8eb879b4 in __clone () from /lib/ld-musl-aarch64.so.1 13 LWP 9119 0x0000ffff8eb879b4 in __clone () from /lib/ld-musl-aarch64.so.1 14 LWP 9127 0x0000ffff8eb879b4 in __clone () from /lib/ld-musl-aarch64.so.1 15 LWP 9120 0x0000ffff8eb879b4 in __clone () from /lib/ld-musl-aarch64.so.1 16 LWP 9115 0x0000ffff8eb879b4 in __clone () from /lib/ld-musl-aarch64.so.1 17 LWP 9126 0x0000ffff8eb879b4 in __clone () from /lib/ld-musl-aarch64.so.1 18 LWP 9123 0x0000ffff8eb879b4 in __clone () from /lib/ld-musl-aarch64.so.1 19 LWP 9124 0x0000ffff8eb879b4 in __clone () from /lib/ld-musl-aarch64.so.1 (gdb) where #0 0x0000ffff8eb5053c in abort () from /lib/ld-musl-aarch64.so.1 #1 0x0000ffff8eb50580 in __assert_fail () from /lib/ld-musl-aarch64.so.1 #2 0x0000ffff8e98cc90 in rcu_unregister_thread_memb () from /usr/lib/liburcu.so.6 #3 0x0000aaaac8dc22d4 in thread_ep () #4 0x0000ffff8eb88f20 in ?? () from /lib/ld-musl-aarch64.so.1 Backtrace stopped: previous frame identical to this frame (corrupt stack?) (gdb) info share From To Syms Read Shared Object Library 0x0000ffff8eb12c10 0x0000ffff8eb1d458 Yes (*) /usr/lib/liblmdb.so 0x0000ffff8ea11300 0x0000ffff8eacfd94 Yes (*) /usr/lib/libgnutls.so.30 0x0000ffff8e9aa520 0x0000ffff8e9c5530 Yes (*) /usr/lib/libnettle.so.6 0x0000ffff8e98bc20 0x0000ffff8e98e8bc Yes (*) /usr/lib/liburcu.so.6 0x0000ffff8e9765c0 0x0000ffff8e97807c Yes (*) /usr/lib/libcap-ng.so.0 0x0000ffff8eb48798 0x0000ffff8eb963f0 Yes (*) /lib/ld-musl-aarch64.so.1 0x0000ffff8e9208b0 0x0000ffff8e94d1e8 Yes (*) /usr/lib/libp11-kit.so.0 0x0000ffff8e7aa7b0 0x0000ffff8e7da000 Yes (*) /usr/lib/libunistring.so.2 0x0000ffff8e77cad0 0x0000ffff8e785cac Yes (*) /usr/lib/libtasn1.so.6 0x0000ffff8e7407a0 0x0000ffff8e74de98 Yes (*) /usr/lib/libhogweed.so.4 0x0000ffff8e6d9a60 0x0000ffff8e719858 Yes (*) /usr/lib/libgmp.so.10 0x0000ffff8e6b78f0 0x0000ffff8e6bbb00 Yes (*) /usr/lib/libffi.so.6 (*): Shared library is missing debugging information.
musl libcとは
そもそも、/lib/ld-musl-aarch64.so.1
が「Program terminated with signal SIGSEGV, Segmentation fault.
」してる時点でおかしいんですよね・・・
んで、このld-muslは以下のようなものらしいです。
標準Cライブラリ(libc)互換のCライブラリらしいです。軽量、高速、シンプルな実装を目指して開発されているライブラリで、GNU C library(glibc)との互換性もあるとのことですが、Alpine Linuxはglibc周りはこれに置き換えているんですね・・・
このあたり解決できないかなぁとか思って、alpineでglibc使えないのかなと思って調べてみたら意外に難しい問題のようです。
Alpineでハマりそうな点(glibc) · syuilog
仕方がないんでUbuntu/Debianでbuildしてみたところ、こちらは問題なく動作しました。ということで、このglibcに周りにまつわる問題みたいですね。この問題、muslの開発に聞いてみるのが良いんでしょうか・・・
ちなみにAlpineのパッケージでKnot DNSが用意されているんですが、こちらも私の環境ではsegmentation fault
しました。buildしている人は問題が出なかったんだろうか・・・