動かざることバグの如し

近づきたいよ 君の理想に

Ubuntu26.04でRuby 2.6.10をインストールするとエラーになる

環境

  • OS: Ubuntu 26.04 (x86_64)

内容

Ubuntu 26.04で rbenv install 2.6.10 を実行したところ、エラーでインストールできなかった。

いろいろビルドパラメーター変えることでインストール成功した。

とりあえずの解決策

export CFLAGS="-std=gnu11 -Wno-error=incompatible-pointer-types"
export RUBY_CONFIGURE_OPTS="--disable-jit-support"
rbenv install 2.6.10

以下詳しい話

エラー1

compile.c:618:6: error: too many arguments to function '(VALUE (*)(void))ifunc->func'; expected 0, have 3

原因

GCC 15 はデフォルトで C23 モード(-std=gnu23)を使用する。C23 では、引数なしの関数ポインタ宣言 VALUE (*func)()VALUE (*func)(void)(引数ゼロ)として解釈される。 これは C11 以前の「引数の型を指定しない」という意味とは異なる。 Ruby 2.6.x の内部では ANYARGS マクロ(C では空に展開される)を使って関数ポインタを宣言しており、それを 3 引数で呼び出しているため、GCC 15 がエラーを出す。

// internal.h
struct vm_ifunc {
    VALUE (*func)(ANYARGS);  // C では VALUE (*func)() に展開される
    ...
};

// compile.c
(*ifunc->func)(iseq, ret, ifunc->data);  // 3引数で呼び出し → C23 でエラー

解決策

-std=gnu11 を指定し、C11 の挙動(() は引数不定)でコンパイルする。

export CFLAGS="-std=gnu11"

エラー2

/tmp/xxxxxx.h:8954:30: error: passing argument 2 of 'rb_hash_foreach'
  from incompatible pointer type [-Wincompatible-pointer-types]
make: *** [uncommon.mk:233: rb_mjit_min_header-2.6.10.h] Error 1

原因

Ruby 2.6 が導入した MJIT(Method-based JIT)は、ビルド時に Ruby 本体のヘッダファイルを GCC でコンパイルして最小ヘッダを生成する。このコンパイルでも同様に古い関数ポインタ型の不一致が発生し、GCC 15 がエラーにする。

解決策

MJIT サポートごと無効化する。RUBY_CONFIGURE_OPTS を使うことで、OpenSSL のビルドには影響を与えずに Ruby の configure にだけオプションを渡せる。 CONFIGURE_OPTS を使うと OpenSSL のビルドにも --disable-jit-support が渡されてしまい、別のエラーが発生する。必ず RUBY_CONFIGURE_OPTS を使うこと。

export RUBY_CONFIGURE_OPTS="--disable-jit-support"