Ubuntu 26.04 の「cannot enable executable stack as shared object requires」
ubuntu-latest は、2026年10月19日から11月19日にかけて Ubuntu 24.04 から 26.04 に移ります(ほかに変わること)。Ubuntu 26.04 の glibc は 2.43(11月4日の libc6 は 2.43-2ubuntu2.4)で、24.04 は 2.39 です。glibc 2.41 からは、共有ライブラリが実行可能なスタックを求めても dlopen はスタックを実行可能にせず、読み込みを失敗させます(glibc の NEWS・2.41 の項)。24.04 では同じライブラリが読み込めていました。
どう見えるか
ERROR: Unable to load dependent library .../lib/julia/libopenlibm.so Message:.../lib/julia/libopenlibm.so: cannot enable executable stack as shared object requires: Invalid argument ImportError: libtensorflow_cc.so.2: cannot enable executable stack as shared object requires: Invalid argument MATLAB:mex:ErrInvalidMEXFile ... blosc_mex.mexa64: cannot enable executable stack as shared object requires: Invalid argument
1つ目は setup-julia が julia --version で確かめるところ、2つ目は TensorFlow を import する Python のテスト、3つ目は MATLAB の MEX ファイルです。直すのは、文に名前が出ているライブラリです。
報告のあったもの
- Julia 1.9.x、1.10.0〜1.10.8、1.11.0〜1.11.3 に入っている
libopenlibm.soは実行可能なスタックを求めるので、Julia が起動しません(setup-julia #426)。Julia 1.10.9 と 1.11.4 には直った openlibm が入っています。1.9 はサポートが終わっていて、直りません。version: minは compat が許すいちばん低い版を選ぶので、1.10.0 になることがあります(RegistryCI.jl #748)。 - conda-forge の TensorFlow 2.19.1 は、
libtensorflow_cc.so.2とほかの3つのライブラリにこの印を付けています。2.21.0 では付いていませんが、報告の時点では別の理由で import が落ちていました(queens #358)。 - 古い Python の wheel。たとえば Python 3.6 の環境の onnxruntime です(spinalcordtoolbox #5349)。
- MATLAB の MEX ファイル:R2024a の
mexは.note.GNU-stackの無いリソースのファイルを一緒にリンクするので、リンカーが MEX 全体に実行可能なスタックが要ると印を付けます(blosc-matlab #1)。
こうしたライブラリのほとんどは、スタックの上でコードを動かしてはいません。印はたいてい、.note.GNU-stack の無いアセンブリのファイルやバイナリの入力が1つあるせいで付き、ビルドの時にリンカーが missing .note.GNU-stack section implies executable stack と警告しています。
印を見つける
readelf -lW libopenlibm.so | grep GNU_STACK GNU_STACK 0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RWE 0x10
RWE なら問題があり、RW なら大丈夫です。patchelf --print-execstack でも同じことが分かります。
直し方1:印の無いリリースを使う
Julia なら、matrix と [compat] のいちばん低い版を 1.10.9(または 1.11.4)に上げます。Python のパッケージは、新しい wheel では印が無いことがあります。長く効くのはこの直し方です。
直し方2:patchelf で印を消す
- run: |
sudo apt-get update && sudo apt-get install -y patchelf
patchelf --clear-execstack "$(dirname "$(which julia)")/../lib/julia/libopenlibm.so"
ライブラリを入れるステップのあと(この例では setup-julia のあと)に置きます。Ubuntu 26.04 の apt の patchelf は 0.18.0 で、--clear-execstack があります。ライブラリが本当にスタックの上でコードを動かしていなければ安全で、たいていはそうです。動かしている場合(たとえば GCC の入れ子の関数)は、あとでセグメンテーション違反で落ちるので、消したあとにテストを走らせます。
直し方3:自分のライブラリは印なしで作り直す
-Wl,-z,noexecstack でリンクするか、アセンブリのファイルごとに、リンカーが探しているセクションを書きます:
.section .note.GNU-stack,"",@progbits
MEX ファイルなら、blosc-matlab と同じく MEX の LDFLAGS に -Wl,-z,noexecstack を足します。作ったものは readelf -lW で確かめます。
直し方4:当面は glibc に許させる
env: GLIBC_TUNABLES: glibc.rtld.execstack=2
glibc のマニュアルは、この場合のために値 2 を説明しています。プロセスの開始時にスタックを実行可能にするので、あとの dlopen でこうしたライブラリを読み込めます。プロセス全体のスタックが実行可能になるので、テストのジョブのつなぎとして使います。または、GitHub が 24.04 のイメージを終えるまで、そのジョブを ubuntu-24.04 に残します。
見分け方
- 文が
Invalid argumentで終わり、ファイルはあります。ファイルが無いのは別の失敗です:Ubuntu 26.04 の「cannot open shared object file」。 - このように落ちるのは、プログラムが起動したあとに
dlopenで読み込むライブラリだけです。そのため、Python の import・Julia のライブラリ・MEX ファイルがよくある例になります。 - 「Set up job」の Runner Image の欄にイメージが出ます。11月19日までは、再実行が 24.04 に当たって通ることがあるので、再実行が緑でも何も確かめたことになりません。
ほかの 26.04 の失敗
- Ubuntu 26.04 でビルドしたあとの「version `GLIBC_2.43' not found」:glibc が 2.43 なので、そこでビルドしたバイナリは
GLIBC_2.42やGLIBC_2.43を求めて Ubuntu 24.04・Debian 13 やそれより古い環境で起動しないことがあります。リリースは古いイメージでビルドし、CI で下限を確かめます。 - Ubuntu 26.04 の rpmbuild:rpm が 6.0.1 なので、
%installがパッケージごとのビルドのディレクトリで動いて Electron Forge の RPM の maker が「cp: cannot stat 'usr/*'」で落ち、_rpmformat 4を渡さなければパッケージは v6 になります。 - Ubuntu 26.04 の「cannot open shared object file」:libxml2 は
libxml2.so.16、ICU は 78 なので、24.04 で保存したキャッシュや 24.04 向けのバイナリがlibxml2.so.2やlibicudata.so.74を見つけられません。 - Ubuntu 26.04 の libpcre3 と libpcre3-dev:Ubuntu 26.04 には PCRE1 が無いので、apt から
libpcre3-devが消え、24.04 向けのプログラムはlibpcre.so.3を読み込めません。 - Ubuntu 26.04 の GCC 15 で通らなくなった C と C++ のビルド:既定の gcc が 13 から 15 に上がるので、C は C23 としてコンパイルされ、古い警告の6つがエラーになり、C++ のヘッダーは
<cstdint>を読み込んでくれなくなります。 - Ubuntu 26.04 の /tmp で「disk quota exceeded」:最初の 26.04 のイメージは
/tmpが約 7.9G の tmpfs(ユーザーごとのクォータつき)だったので、/tmpでの大きなビルドが落ちました。TMPDIRを$RUNNER_TEMPにします。 - Ubuntu 26.04 の apt:名前が変わった・無くなったパッケージ。
失敗したジョブを IntelliJ IDEA から見るなら
Pipeline Inbox for GitHub Actions Workflows は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。すべてのリポジトリの実行を、ジョブ・ステップと一緒に IDE のツールウィンドウに並べ、いまのブランチの実行はステータスバーに出ます。読むのは無料、失敗したジョブの再実行・キャンセル・ワークフローの実行・デプロイのレビューは Pro(月 US$1.50・30日の無料試用つき)です。
GitHub と GitHub Actions は GitHub, Inc. の商標、Ubuntu は Canonical Ltd. の商標、MATLAB は The MathWorks, Inc. の商標、TensorFlow は Google LLC の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは GitHub, Inc.・Canonical・The MathWorks・Google・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:「The ubuntu-latest label will migrate to Ubuntu 26」 · Ubuntu 26.04 の「cannot open shared object file」 · IntelliJ IDEA で使える GitHub Actions のプラグインの比較 · English