かつて X のビルドツールといえば INU ならぬ imake であってこいつはどこにでもある sh と cpp と make さえあれば動いたものだが、今ではこの imake をインストールするのにも

という 3 種類ものビルドツールが必要になるという意味不明な事になっており、 頭が腐ってるのじゃよ と口ずさむ日々である、INU’s Not Unix!

そもそも imake 自体のビルドは Makefile すら不要と言えるほどシンプルなのにどうしてこうなった。

正確には Meson(GNU Autoconf的なもの) と Ninja(make 的なもの) だけが必要なのだがこいつの依存関係に Meson と役割的に丸かぶりの CMake を要する re2c があって芋蔓的にこうなってしまうのである。

言ってしまえばルンバに掃除させるには床の片付けが必要です的な本末転倒どころか、ルンバ AI の機械学習に巨大データセンターと大量の電気と水を用意しろそうすれば限りある資源の醜い奪い合いの結果の絶滅戦争で地球がクリーンになるみたいな話でやはりギークは人類のバグなのである。 非開発者なら sh および基本ツールと GNU make だけ、開発者であってもそれプラス Perl と m4 があれば足りる GNU Autotools( Autoconf / Automake / Libtool ) って優秀だったんだと再評価である、昔はこれでも重厚長大過ぎて辟易したんだが。

いやホンマ xc という統合されたソースツリーの頂点で make World と叩けば事足りたものを、バラバラにされ肉片は細切れに無造作に git repository にぶちこまれ今でも腐臭が漂っているわけである。 そもそもクーデター的に XFree86 プロジェクトを打ち倒して X.Org を僭称した連中もとっくの昔に X11 どころか Wayland の開発にすら飽きて停滞してんだから、いっそもう誰か XFree86 復古の大号令でもした方がいいんじゃねえか。

なお本家 N では xsrc そして O だと Xenocara のようにとっくの昔に Meson+Ninja も GNU Autotools どころか imake すら使わない pmake のみのビルドシステムがあるのだが、オレオレ N6 で N HEAD 向けの xsrc 持ってきてもビルド通すには相当作業が必要なのよね。 つーか N も pmake + bsd.*.mk を無節操に機能拡張続けてるのでオレオレ N6 で N HEAD のそれに追従するのはちょっとやりたくないのだ。

よってオレオレ N6 では X11 は pkgsrc から入れるものと割り切ってたんだけどね、Meson 化によってそうも言ってられなくなってしまった。

まぁ世間逸般では Linux 使ってるだろうし今の時代バイナリパッケージ入れるどころか開発環境 Docker で拾い喰いする時代だからそりゃ複雑な依存関係に誰かが苦労してるなんて想像する頭も失われるってもんだ。 つーかバイナリパッケージですら Flatpak のようにコンテナの時代なんだもの。

make は遅い! Ninja は高速!はそりゃそうかもしれんが本質的な作業とは程遠いビルドツールの構築に必要な時間だけで昔の X ならビルド終わってたわな。 そもそも C++ 使うのやめたらもっとビルド時間が短縮できるんじゃないですかね。

もはや貧民でもパソコン買える時代は過去となり C++ を現実的な時間でコンパイルできる高性能マシンを所有できるのはビックテックの連中だけなので、これも動物農場への囲い込み柵のうちかもしれない。 まさか GPU どころかメモリすら買えない時代になるとはね。自分は DDR3 世代の Sandy おじさんなので影響は受けにくいとはいえそれでも去年の夏よりも値段が倍になってるからな。

そんでさらにこいつらビルドするには更に

  • Mason … Python 3
  • Ninja … Python 3 と C++14 対応コンパイラ
  • CMake … C++11 対応コンパイラ

が必要という始末、こいつらビルド可能ならそもそも移植性チェック不要なくらい贅沢な環境でビルドシステム自体が不要だわバカバカしい。

とりあえず先週くらいから 40 件ほど オレオレ pkgsrc にパッチ足してこれらのビルドツールが オレオレ N6 で動くまでにはしたのだが、どうやら Meson の謎挙動を踏んでしまった。

というのも graphics/MesaLib のビルドでコケるのである、俺にとっちゃ Mesa 3D なんぞ 歯車 がグルグル回る何かでしかない上によく BeOS の ティーポット がぐるぐる回せるやつとごっちゃになるアレという認知であって X11 が必要とするから以上の興味はない。 そもそも GPU なんて Matrox G200e とVGA ポートそして D-Sub 15 ピンケーブルさえあれば何の問題もないのである。

エラーログはこちら。

FAILED: [code=1] src/gallium/targets/vdpau/libvdpau_gallium.so.1.0.0 
c++  -o src/gallium/targets/vdpau/libvdpau_gallium.so.1.0.0 src/gallium/targets/vdpau/libvdpau_gallium.so.1.0.0.p/target.c.o -L/usr/pkg/gcc6/lib/gcc/x86_64--netbsd/6.5.0 -L/usr/pkg/gcc6/lib -L/usr/pkg/lib -L/usr/lib -L/usr/pkg/lib/libLLVM -I/usr/pkg/include -I/usr/include -I/usr/pkg/include/libelf -I/usr/pkg/include/libLLVM -I/usr/pkg/include/libdrm -I/usr/pkg/include/python3.11 -Wl,--as-needed -Wl,--no-undefined -shared -fPIC -Wl,-soname,libvdpau_gallium.so.1.0.0 -Wl,--whole-archive -Wl,--start-group src/gallium/frontends/vdpau/libvdpau_st.a -Wl,--no-whole-archive -Wl,-R/usr/pkg/gcc6/lib/gcc/x86_64--netbsd/6.5.0 -Wl,-R/usr/pkg/gcc6/lib -Wl,-zrelro -Wl,-R/usr/lib -Wl,-R/usr/pkg/lib -Wl,-R/usr/pkg/lib/libLLVM -O2 -Dalloca=__builtin_alloca -DHAVE_NOATEXIT -DSYSCONFDIR=/usr/pkg/etc -Dz_off_t=long src/gallium/auxiliary/libgalliumvlwinsys.a src/util/libmesa_util.a src/util/format/libmesa_format.a src/gallium/auxiliary/libgalliumvl.a src/gallium/auxiliary/libgallium.a src/compiler/nir/libnir.a src/compiler/libcompiler.a src/gallium/auxiliary/pipe-loader/libpipe_loader_static.a src/loader/libloader.a src/util/libxmlconfig.a src/gallium/winsys/sw/null/libws_null.a src/gallium/winsys/sw/wrapper/libwsw.a src/gallium/winsys/sw/dri/libswdri.a src/gallium/winsys/sw/kms-dri/libswkmsdri.a src/gallium/drivers/r300/libr300.a src/gallium/winsys/radeon/drm/libradeonwinsys.a src/gallium/drivers/r600/libr600.a src/mesa/libmesa_gallium.a src/mesa/libmesa_common.a src/compiler/glsl/libglsl.a src/compiler/glsl/glcpp/libglcpp.a src/mesa/libmesa_sse41.a src/gallium/drivers/radeonsi/libradeonsi_gfx6.a src/gallium/drivers/radeonsi/libradeonsi_gfx7.a src/gallium/drivers/radeonsi/libradeonsi_gfx8.a src/gallium/drivers/radeonsi/libradeonsi_gfx9.a src/gallium/drivers/radeonsi/libradeonsi_gfx10.a src/gallium/drivers/radeonsi/libradeonsi_gfx103.a src/gallium/drivers/radeonsi/libradeonsi.a src/gallium/winsys/amdgpu/drm/libamdgpuwinsys.a src/amd/addrlib/libaddrlib.a src/amd/common/libamd_common.a src/amd/llvm/libamd_common_llvm.a src/gallium/winsys/nouveau/drm/libnouveauwinsys.a src/gallium/drivers/nouveau/libnouveau.a -Wl,--version-script /usr/pkgsrc/graphics/MesaLib/work/mesa-21.3.9/src/gallium/targets/vdpau/vdpau.sym -Wl,--dynamic-list /usr/pkgsrc/graphics/MesaLib/work/mesa-21.3.9/src/gallium/targets/vdpau/../dri-vdpau.dyn -Wl,--gc-sections /usr/lib/libz.so -pthread -lm /usr/pkg/lib/libdrm.so -Wl,-R/usr/pkg/lib /usr/pkg/lib/libxcb-sync.so -Wl,-R/usr/pkg/lib /usr/pkg/lib/libxcb-present.so -Wl,-R/usr/pkg/lib /usr/pkg/lib/libxshmfence.so -Wl,-R/usr/pkg/lib /usr/pkg/lib/libxcb-xfixes.so -Wl,-R/usr/pkg/lib /usr/pkg/lib/libxcb-dri3.so -Wl,-R/usr/pkg/lib/libLLVM -Wl,-R/usr/pkg/gcc6/lib/gcc/x86_64--netbsd/6.5.0 -Wl,-R/usr/pkg/gcc6/lib -Wl,-zrelro -Wl,-R/usr/lib -Wl,-R/usr/pkg/lib -L/usr/pkg/lib/libLLVM -L/usr/pkg/lib -lLLVM-13 -Wl,-R/usr/lib /usr/lib/libexpat.so -Wl,-R/usr/lib /usr/pkg/lib/libdrm_radeon.so -Wl,-R/usr/pkg/lib/libLLVM -Wl,-R/usr/pkg/gcc6/lib/gcc/x86_64--netbsd/6.5.0 -Wl,-R/usr/pkg/gcc6/lib -Wl,-zrelro -Wl,-R/usr/lib -Wl,-R/usr/pkg/lib -L/usr/pkg/lib/libLLVM -L/usr/pkg/lib -lLLVM-13 -Wl,-R/usr/pkg/lib /usr/pkg/lib/libelf.so -Wl,-R/usr/pkg/lib/libLLVM -Wl,-R/usr/pkg/gcc6/lib/gcc/x86_64--netbsd/6.5.0 -Wl,-R/usr/pkg/gcc6/lib -Wl,-zrelro -Wl,-R/usr/lib -Wl,-R/usr/pkg/lib -L/usr/pkg/lib/libLLVM -L/usr/pkg/lib -lLLVM-13 -Wl,-R/usr/pkg/lib/libLLVM -Wl,-R/usr/pkg/gcc6/lib/gcc/x86_64--netbsd/6.5.0 -Wl,-R/usr/pkg/gcc6/lib -Wl,-zrelro -Wl,-R/usr/lib -Wl,-R/usr/pkg/lib -L/usr/pkg/lib/libLLVM -L/usr/pkg/lib -lLLVM-13 -Wl,-R/usr/pkg/lib/libLLVM -Wl,-R/usr/pkg/gcc6/lib/gcc/x86_64--netbsd/6.5.0 -Wl,-R/usr/pkg/gcc6/lib -Wl,-zrelro -Wl,-R/usr/lib -Wl,-R/usr/pkg/lib -L/usr/pkg/lib/libLLVM -L/usr/pkg/lib -lLLVM-13 -Wl,-R/usr/pkg/lib/libLLVM -Wl,-R/usr/pkg/gcc6/lib/gcc/x86_64--netbsd/6.5.0 -Wl,-R/usr/pkg/gcc6/lib -Wl,-zrelro -Wl,-R/usr/lib -Wl,-R/usr/pkg/lib -L/usr/pkg/lib/libLLVM -L/usr/pkg/lib -lLLVM-13 -Wl,-R/usr/pkg/lib/libLLVM -Wl,-R/usr/pkg/gcc6/lib/gcc/x86_64--netbsd/6.5.0 -Wl,-R/usr/pkg/gcc6/lib -Wl,-zrelro -Wl,-R/usr/lib -Wl,-R/usr/pkg/lib -L/usr/pkg/lib/libLLVM -L/usr/pkg/lib -lLLVM-13 -Wl,-R/usr/pkg/lib/libLLVM -Wl,-R/usr/pkg/gcc6/lib/gcc/x86_64--netbsd/6.5.0 -Wl,-R/usr/pkg/gcc6/lib -Wl,-zrelro -Wl,-R/usr/lib -Wl,-R/usr/pkg/lib -L/usr/pkg/lib/libLLVM -L/usr/pkg/lib -lLLVM-13 -Wl,-R/usr/pkg/lib/libLLVM -Wl,-R/usr/pkg/gcc6/lib/gcc/x86_64--netbsd/6.5.0 -Wl,-R/usr/pkg/gcc6/lib -Wl,-zrelro -Wl,-R/usr/lib -Wl,-R/usr/pkg/lib -L/usr/pkg/lib/libLLVM -L/usr/pkg/lib -lLLVM-13 -Wl,-R/usr/pkg/lib/libLLVM -Wl,-R/usr/pkg/gcc6/lib/gcc/x86_64--netbsd/6.5.0 -Wl,-R/usr/pkg/gcc6/lib -Wl,-zrelro -Wl,-R/usr/lib -Wl,-R/usr/pkg/lib -L/usr/pkg/lib/libLLVM -L/usr/pkg/lib -lLLVM-13 -Wl,-R/usr/pkg/lib/libLLVM -Wl,-R/usr/pkg/gcc6/lib/gcc/x86_64--netbsd/6.5.0 -Wl,-R/usr/pkg/gcc6/lib -Wl,-zrelro -Wl,-R/usr/lib -Wl,-R/usr/pkg/lib -L/usr/pkg/lib/libLLVM -L/usr/pkg/lib -lLLVM-13 /usr/pkg/lib/libdrm_amdgpu.so -Wl,-R/usr/pkg/lib -Wl,-R/usr/pkg/lib/libLLVM -Wl,-R/usr/pkg/gcc6/lib/gcc/x86_64--netbsd/6.5.0 -Wl,-R/usr/pkg/gcc6/lib -Wl,-zrelro -Wl,-R/usr/lib -Wl,-R/usr/pkg/lib -L/usr/pkg/lib/libLLVM -L/usr/pkg/lib -lLLVM-13 -Wl,-R/usr/pkg/lib /usr/pkg/lib/libdrm_nouveau.so -Wl,-R/usr/pkg/lib /usr/pkg/lib/libxcb.so /usr/pkg/lib/libX11-xcb.so /usr/pkg/lib/libX11.so -Wl,-R/usr/pkg/lib /usr/pkg/lib/libxcb-dri2.so -Wl,--end-group
src/util/libmesa_util.a(crc32.c.o): In function `util_hash_crc32':
crc32.c:(.text.util_hash_crc32+0x3d): undefined reference to `crc32'
src/util/libmesa_util.a(compress.c.o): In function `util_compress_deflate':
compress.c:(.text.util_compress_deflate+0x5e): undefined reference to `deflateInit_'
compress.c:(.text.util_compress_deflate+0x6f): undefined reference to `deflate'
compress.c:(.text.util_compress_deflate+0x7f): undefined reference to `deflateEnd'
compress.c:(.text.util_compress_deflate+0x9e): undefined reference to `deflateEnd'
src/util/libmesa_util.a(compress.c.o): In function `util_compress_inflate':
compress.c:(.text.util_compress_inflate+0x56): undefined reference to `inflateInit_'
compress.c:(.text.util_compress_inflate+0x7a): undefined reference to `inflate'
compress.c:(.text.util_compress_inflate+0x87): undefined reference to `inflateEnd'
compress.c:(.text.util_compress_inflate+0x91): undefined reference to `inflateEnd'
collect2: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.

クッソ長い c++ へのリンクオプションに辟易するし誰も横スクロールして確認する気にもならんだろうが起きてる現象自体は単純で zlib にあるシンボルが無え!って話でしか無い。

実際にファイルを読んでこか。

まずルートの meson.build で zlib が dep_zlilb として定義されている。

dep_zlib = dependency('zlib', version : '>= 1.2.3',
^^^^^^^^   ^^^^^^^^^^
                      fallback : ['zlib', 'zlib_dep'],
                      required : get_option('zlib'))
if dep_zlib.found()
  pre_args += '-DHAVE_ZLIB'
endif

...

with_compression = dep_zlib.found() or dep_zstd.found()
if with_compression
  pre_args += '-DHAVE_COMPRESSION'
elif with_shader_cache
  error('Shader Cache requires compression')
endif

dependency は引数で指定された名前とバージョンの共有ライブラリ情報をオブジェクト化して返す、うーんこの時代錯誤なオブジェクト指向が加齢臭キッツイ、今年って 1996 年だっけ? そもそも X11 を捨てて Wayland 作りはじめた理由の一つにプログラミング言語 C で OOP するのがアホくさいからだったはずなんだが、やっぱ好きなんですねぇ〜オブジェクト。 現実世界はお前らの幼稚なオブジェクトに落とし込めるほど単純じゃねえんだわクソが。

そんで zlib が見つかったら CFLAGS および CXXFLAGS-DHAVE_ZLIB -DHAVE_COMPRESSION を追加している。

この dep_zlib は src/util/meson.build 中の libmesa_util.a の依存関係を定義した配列 deps_for_libmesa_util で使われてる。

deps_for_libmesa_util = [
^^^^^^^^^^^^^^^^^^^^^
  dep_zlib,
  ^^^^^^^^
  dep_clock,
  dep_thread,
  dep_atomic,
  dep_m,
  dep_valgrind,
  dep_zstd,
  dep_dl,
  dep_unwind,
]

この deps_for_libmesa_util は 同ファイル において静的リンクライブラリ libmesa_util.a の作成を指示する static_library の引数 dependencies で使われている。

_libmesa_util = static_library(
                ^^^^^^^^^^^^^^
  'mesa_util',
  [files_mesa_util, files_debug_stack, format_srgb],
  include_directories : [inc_include, inc_src, inc_mapi, inc_mesa, inc_gallium, inc_gallium_aux],
  dependencies : deps_for_libmesa_util,
                 ^^^^^^^^^^^^^^^^^^^^^
  link_with: libmesa_format,
  c_args : [c_msvc_compat_args],
  gnu_symbol_visibility : 'hidden',
  build_by_default : false
)

はいここ、そもそも静的リンクライブラリを作る時に別の共有ライブラリをリンクするよう指示しても未定義シンボルの解決に使われるだけよね。 静的リンクライブラリのアーカイブファイル同士をマージするいわゆる fat library なんて今時やらねえしな。

なので libmesa_util.a を使用する際には再度 zlib をリンクするよう指示する必要があるのだけど、そのための定義を 同ファイル でさっきの deps_for_libmesa_util とは別に declare_dependency を使って idep_mesautil として宣言している。

idep_mesautil = declare_dependency(
^^^^^^^^^^^^^   ^^^^^^^^^^^^^^^^^^
  link_with : _libmesa_util,
  include_directories : [inc_util, inc_gallium],
  dependencies : [dep_zlib, dep_clock, dep_thread, dep_atomic, dep_m, dep_valgrind],
                  ^^^^^^^^
)

そんで問題の未解決シンボルエラーでビルドが失敗する libvdpau_gallium.so は src/gallium/targets/vdpau/meson.build の中で share_library により作成指示されてるんだけど、こいつの引数 dependencies に idep_mesautil が指定されているにも関わらず zlib のシンボルが無いとお怒りになられるのだ。

libvdpau_gallium = shared_library(
                   ^^^^^^^^^^^^^^
  'vdpau_gallium',
  'target.c',
  gnu_symbol_visibility : 'hidden',
  link_args : [vdpau_link_args, ld_args_gc_sections],
  include_directories : [
    inc_include, inc_src, inc_mapi, inc_mesa, inc_gallium, inc_gallium_aux, inc_util, inc_gallium_winsys, inc_gallium_drivers,
  ],
  link_whole : [libvdpau_st],
  link_with : [
    libgalliumvlwinsys, libgalliumvl, libgallium,
    libpipe_loader_static, libws_null, libwsw, libswdri, libswkmsdri,
  ],
  dependencies : [
    idep_mesautil,
    ^^^^^^^^^^^^^
    driver_r300, driver_r600, driver_radeonsi, driver_nouveau,
  ],

他の環境ではバグ報告もなくビルド通ってるのが不思議でかろうじて F の bugzilla で 同じエラー 出てる人いたけど、ld が古いから LLVMlld の最新版使うようにしたら解決したとあるので、今時のリンカがある環境なら発生しない問題ということっぽいね。

どうも GNU Binutils 2.36 以降では ar に -l/–record-libdeps ってオプションが追加されてアーカイブ中に __.LIBDEP って名前で依存関係を記録できるようになって ld は libdep plugin を使うとリンク時に記録に従ってライブラリを追加してくれるからそいつのお陰かなあと推察。

そんじゃベースの 2.21.1 でなく devel/binutils なら最新の 2.41 だからそれ使うよう graphics/MesaLib/Makefiledevel/binutils/buildlink3.mk をインクルードしてみた。

--- Makefile.orig       2026-01-11 22:17:04.819059807 +0900
+++ Makefile    2026-01-18 01:37:07.163184221 +0900
@@ -198,6 +198,7 @@ post-install:
            ${DESTDIR}${PREFIX}/lib/dri/swrast_dri.so
 .endif
 
+.include "../../devel/binutils/buildlink3.mk"
 .include "../../devel/meson/build.mk"
 .include "../../devel/zlib/buildlink3.mk"
 .include "../../lang/python/batteries-included.mk"

しかしこれじゃアカンのですわ、pkgsrc は gcc や binutils を 作業ディレクトリ以下のサンドボックスにシンボリックリンクを作り、さらに pkgtools/cwrappers というラッパーコマンド経由で呼び出すことで異なるバージョンの実装を切り替える buildlink というトリックがあるのだけど、こいつらは ar をガン無視しやがるので –record-libdeps が使えないのである。 対応するにもちょっと作業量が多いかんじ、正攻法の方が時間がかからないパターンやこれ。

もうぶん投げたい気持ちで一杯なのだが、この長い引数リストを不要だったり重複したりするオプションを取り除いて整理してみた。

/usr/pkg/gcc6/bin/c++ \
    -L/usr/pkg/gcc6/lib/gcc/x86_64--netbsd/6.5.0 -Wl,-R/usr/pkg/gcc6/lib/gcc/x86_64--netbsd/6.5.0 \
    -L/usr/pkg/gcc6/lib -Wl,-R/usr/pkg/gcc6/lib \
    -L/usr/pkg/lib -Wl,-R/usr/pkg/lib \
    -L/usr/lib -Wl,-R/usr/lib \
    -L/usr/pkg/lib/libLLVM -Wl,-R/usr/pkg/lib/libLLVM \
    -o src/gallium/targets/vdpau/libvdpau_gallium.so.1.0.0 \
    src/gallium/targets/vdpau/libvdpau_gallium.so.1.0.0.p/target.c.o \
    -shared \
    -fPIC \
    -Wl,-soname,libvdpau_gallium.so.1.0.0 \
    -Wl,--as-needed \
    -Wl,--gc-sections \
    -Wl,--no-undefined \
    -Wl,--version-script /usr/pkgsrc/graphics/MesaLib/work/mesa-21.3.9/src/gallium/targets/vdpau/vdpau.sym \
    -Wl,--dynamic-list /usr/pkgsrc/graphics/MesaLib/work/mesa-21.3.9/src/gallium/targets/vdpau/../dri-vdpau.dyn \
    -Wl,-zrelro \
    -Wl,--start-group \
    -Wl,--whole-archive src/gallium/frontends/vdpau/libvdpau_st.a -Wl,--no-whole-archive \
    src/gallium/auxiliary/libgalliumvlwinsys.a \
    src/util/libmesa_util.a \
    src/util/format/libmesa_format.a \
    src/gallium/auxiliary/libgalliumvl.a \
    src/gallium/auxiliary/libgallium.a \
    src/compiler/nir/libnir.a \
    src/compiler/libcompiler.a \
    src/gallium/auxiliary/pipe-loader/libpipe_loader_static.a \
    src/loader/libloader.a \
    src/util/libxmlconfig.a \
    src/gallium/winsys/sw/null/libws_null.a \
    src/gallium/winsys/sw/wrapper/libwsw.a \
    src/gallium/winsys/sw/dri/libswdri.a \
    src/gallium/winsys/sw/kms-dri/libswkmsdri.a \
    src/gallium/drivers/r300/libr300.a \
    src/gallium/winsys/radeon/drm/libradeonwinsys.a \
    src/gallium/drivers/r600/libr600.a \
    src/mesa/libmesa_gallium.a \
    src/mesa/libmesa_common.a \
    src/compiler/glsl/libglsl.a \
    src/compiler/glsl/glcpp/libglcpp.a \
    src/mesa/libmesa_sse41.a \
    src/gallium/drivers/radeonsi/libradeonsi_gfx6.a \
    src/gallium/drivers/radeonsi/libradeonsi_gfx7.a \
    src/gallium/drivers/radeonsi/libradeonsi_gfx8.a \
    src/gallium/drivers/radeonsi/libradeonsi_gfx9.a \
    src/gallium/drivers/radeonsi/libradeonsi_gfx10.a \
    src/gallium/drivers/radeonsi/libradeonsi_gfx103.a \
    src/gallium/drivers/radeonsi/libradeonsi.a \
    src/gallium/winsys/amdgpu/drm/libamdgpuwinsys.a \
    src/amd/addrlib/libaddrlib.a \
    src/amd/common/libamd_common.a \
    src/amd/llvm/libamd_common_llvm.a \
    src/gallium/winsys/nouveau/drm/libnouveauwinsys.a \
    src/gallium/drivers/nouveau/libnouveau.a \  
    /usr/lib/libz.so \
    -pthread \
    -lm \
    /usr/pkg/lib/libdrm.so \
    /usr/pkg/lib/libxcb-sync.so \
    /usr/pkg/lib/libxcb-present.so \
    /usr/pkg/lib/libxshmfence.so \
    /usr/pkg/lib/libxcb-xfixes.so \
    /usr/pkg/lib/libxcb-dri3.so \
    -lLLVM-13 \
    /usr/lib/libexpat.so \
    /usr/pkg/lib/libdrm_radeon.so \
    /usr/pkg/lib/libelf.so \
    /usr/pkg/lib/libdrm_amdgpu.so \
    /usr/pkg/lib/libdrm_nouveau.so \
    /usr/pkg/lib/libxcb.so \
    /usr/pkg/lib/libX11-xcb.so \
    /usr/pkg/lib/libX11.so \
    /usr/pkg/lib/libxcb-dri2.so \
    -Wl,--end-group

なるほどまずエラーが起きるのは

  • 未解決シンボルがあったらエラーを報告し終了させる –no-undefined が指定されている
  • 動的リンクライブラリを実行時まで遅延する & 使われない動的リンクライブラリのリンクをしないようにする –as-needed が指定されている
  • 静的リンクライブラリつまり ar 形式のアーカイブ (*.a) 内の循環参照をすべて解決するまでループさせる –star-group および –end-group によるグループ指定にアーカイブではない動的リンクライブラリまで含まれている

この 3 つのリンクオプションがあるせいで発生してるっぽい。

  • –start-group と –end-group で囲まれた静的リンクライブラリ、つまり ar 形式アーカイブ (*.a) の中の循環参照をすべて解決する
  • それでも残っている未解決のシンボルは動的リンクライブラリ (*.so) のリンク時に解決を試みる
  • 参照されてない不要な動的リンクライブラリはリンク対象から除外する
  • それでも未解決シンボルが残っているなら –no-undefined が指定されている場合はエラーとする

という動作をするんだけど、このグループ内に動的リンクライブラリまで含まれてしまってるとどうも問題が起きるようなのだ。

--- link.sh.orig        2026-01-18 04:25:25.000000000 +0900
+++ link.sh     2026-01-18 04:26:37.000000000 +0900
@@ -57,6 +57,7 @@
     src/amd/llvm/libamd_common_llvm.a \
     src/gallium/winsys/nouveau/drm/libnouveauwinsys.a \
     src/gallium/drivers/nouveau/libnouveau.a \
+    -Wl,--end-group \
     /usr/lib/libz.so \
     -pthread \
     -lm \
@@ -75,6 +76,5 @@
     /usr/pkg/lib/libxcb.so \
     /usr/pkg/lib/libX11-xcb.so \
     /usr/pkg/lib/libX11.so \
-    /usr/pkg/lib/libxcb-dri2.so \
-    -Wl,--end-group
+    /usr/pkg/lib/libxcb-dri2.so
 

こうすると正常にリンクが成功するようになった。

何が起きてるのかはさだかじゃないのだけど推測するに

  • グループ内に *.a だけでなく *.so がある場合も未解決シンボルの解決がなされて libmesa_util.a の未解決シンボルは libz.so に存在するとマークされる
  • 動的リンクライブラリのリンク時に libz.so への参照はもう不要と判断され –as-needed によりリンク対象から除外される
  • 最終的に –no-undefined で未解決シンボルの有無がチェックされて libz.so が無いためにあえなく死亡

みたいな動作なんだろうね、ただ本当にこの挙動が起きてるなら他の動的リンクライブラリも zlib 同様に未解決エラーが出そうなもんだがなぜか zlib だけでしか発生しないのが謎である。 zlib に依存するのが libmesa_util.a 内のオブジェクトだけだからなのかなぁ。 しかも –no-undefined 外しても libz.so はリンクされてるから –as-needed がリンク対象から外したってのはちょっと疑問である。

それに /usr/lib/libz.so でなく gcc の -l library オプションすなわち -lz を指定すればグループ内では libz.so でなく libz.a が参照され静的リンクされそうなもんなんだがやっぱりエラーがでる、うーん意味がわからん。

ということで正確に挙動を把握すべく ld のソースを読まないとならなくなってしまったようなのでまた次回へ続くとなる。 それプラス問題解決には meson に正しい位置で -Wl,–end-group を吐かせるようにコード修正も必要になりそう、 ええかげんにせんと気狂いて死ぬ