Skip to content

GLIBC_2.34 エラー(/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found)

問題の概要

Ubuntu WSL(Windows Subsystem for Linux)環境でELF実行ファイルを実行しようとした際、以下のエラーが発生する問題です。

bash
/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by myFile)

このエラーは、対象の実行ファイルがGLIBC(GNU C Library)のバージョン2.34を必要としているにもかかわらず、システムにインストールされているGLIBCのバージョンが古い場合に発生します。

根本原因

GLIBCはLinuxシステムの基盤を構成する重要なライブラリであり、バージョン間の互換性が厳格に保たれています。バイナリファイルが特定のGLIBCバージョンに対してコンパイルされている場合、実行時には同じかそれ以上のバージョンのGLIBCが必要となります。

注意

システムのGLIBCを手動でアップグレードすることは推奨されません。GLIBCはシステムの根幹をなすライブラリであるため、不用意なアップデートはシステムの安定性に悪影響を及ぼす可能性があります。

解決策

方法1: ソースコードからの再コンパイル(推奨)

最も安全かつ効果的な解決方法は、ソースコードからターゲット環境用に再コンパイルすることです。

bash
# ソースコードを取得
git clone [repository-url]
cd [project-directory]

# ビルド環境の準備
sudo apt update
sudo apt install build-essential

# コンパイル
make

この方法により、現在のシステム環境に最適化された実行ファイルが生成され、GLIBCのバージョン不一致問題を回避できます。

方法2: コンテナ技術の利用

DockerやPodmanなどのコンテナ技術を使用して、新しいGLIBCバージョンを含む環境でアプリケーションを実行する方法もあります。

dockerfile
# Dockerfileの例
FROM ubuntu:22.04

# 必要なパッケージをインストール
RUN apt update && apt install -y [必要なパッケージ]

# アプリケーションをコピー
COPY myFile /app/myFile

# 実行
CMD ["/app/myFile"]
bash
# ビルドと実行
docker build -t myapp .
docker run myapp

方法3: 静的リンクによるビルド(Go言語の場合)

Go言語で書かれたアプリケーションの場合は、CGOを無効にして静的リンクを行うことでGLIBC依存を排除できます。

bash
CGO_ENABLED=0 go build -o myFile .
dockerfile
FROM golang:1.22

ENV CGO_ENABLED=0

WORKDIR /app
COPY . .
RUN go build -o myFile .

CMD ["./myFile"]

方法4: 特定のライブラリパスを使用した実行

必要なGLIBCライブラリを別途用意し、明示的にライブラリパスを指定して実行する方法です。

bash
# 必要なライブラリを特定のディレクトリに配置
mkdir my-libs
cp /path/to/ld-linux-x86-64.so.2 my-libs/
cp /path/to/libc.so.6 my-libs/
cp /path/to/libstdc++.so.6 my-libs/

# ライブラリパスを指定して実行
/my-libs/ld-linux-x86-64.so.2 --library-path /my-libs ./myFile

補足情報

GLIBCバージョン確認方法

現在のシステムのGLIBCバージョンは以下のコマンドで確認できます。

bash
ldd --version | head -1
# または
/lib/x86_64-linux-gnu/libc.so.6 | head -1

まとめ

GLIBCのバージョン不一致エラーに対処するには、以下のアプローチが有効です:

  1. ソースからの再コンパイル - 最も安全で推奨される方法
  2. コンテナの利用 - 環境分離による互換性確保
  3. 静的リンク - ライブラリ依存性の排除
  4. 明示的なライブラリパス指定 - 一時的な解決策

システムの基幹ライブラリを不用意に更新する前に、これらの代替手段を検討することをお勧めします。