他のglibcを使用して静的にリンクされたバイナリを実行する

他のglibcを使用して静的にリンクされたバイナリを実行する

静的に接続されたバイナリがあります。ツールRHLE4で実行しようとしています。このツールはglibcについて文句を言います。 2.4が必要で、システムのバージョンは2.3です。これが吐き出すメッセージは次のとおりです。

./wkhtmltoimage-i386: /lib/tls/libc.so.6: version `GLIBC_2.4' not found (required by ./wkhtmltoimage-i386)

システムでglibc2.3を交換せずにglibc2.4をビルドし、このツールでのみ使用できる方法はありますか? glibc2.4 を構築する際に、どのようなプレフィックスを構成に使用する必要がありますか?

ベストアンサー1

この wkhtmltoimage ツールのソースコードを使用できるので、次のことをお勧めします。 再コンパイルシステムのデフォルトのglibcを使用してソースからコンパイルします。これはおそらく簡単な作業ではなく、glibcを再コンパイルするよりも速いでしょう。

静的リンク実行ファイルには必要なすべてのCライブラリ呼び出しのコードがすでに含まれているため、新しいglibcを別々にコンパイルして実行ファイルをリンクすることはできません。しかし、glibcを使用するプログラムは決して完全に静的ではありません。一部のライブラリ呼び出し(「ネームサービス」に関連付けられているすべての呼び出しなど)は、まだ動的にロードされたモジュール(通常はglibcの下にあるファイル)getuid()を使用します。これがおそらくプログラムが失敗した理由です。いくつかのNSSモジュールを探していたが、これらの。libnss*.so/libglibc2.3

glibcを再コンパイルする方法を絶対にしたい場合は、次のことができます。(警告:テストされていません!):

  1. glibc2.4がインストールされるように構成非体系的ディレクトリ(たとえば)を作成し、コンパイルして/usr/local/glibc2.4インストールします。

  2. wkhtmlto*動的リンカー検索パス()の最初のコンポーネントとして指定して実行しますLD_LIBRARY_PATH

    env LD_LIBRARY_PATH=/usr/local/glibc2.4/lib wkhtmltoimage ...

修正する:知ってみるとそれほど簡単なことではありませんでした。システムに2つの異なるlibcs​​を配置するには、libcがランタイムリンカーを見つけて固定位置にNSSモジュールを動的にロードするため、単に再コンパイル/インストールする必要があります。これRTDIこのプログラムを使用すると、単一のLinuxシステムにさまざまなバージョンのGNU libcをインストールできます。そのWebページには指示があります(ただし、これは専門家レベルの作業であり、ステップバイステップのガイドではありません)。

もう一度強調しますが、再コンパイルする作業ははるかに少なくなりますwkhtmltoimage...

おすすめ記事