web-dev-qa-db-ja.com

別のglibcで静的にリンクされたバイナリを実行する

RHLE4で実行しようとしている tool の静的にリンクされたバイナリがあります。ツールはglibcについて文句を言います。 2.4が必要で、システム内の1つは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のビルド中に、構成にどのプレフィックスを使用する必要がありますか?

6
letronje

このwkhtmltoimageツールのソースコードが利用可能であるため、システムのネイティブglibcを使用してソースから 再コンパイル することをお勧めします。 glibcを再コンパイルするよりもさらに高速になる可能性がありますが、これは簡単な作業ではありません。

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

どうしてもglibcの再コンパイルの道を進みたいのであれば、次のことがうまくいく可能性があります(警告:テストされていません!):

  1. non-systemディレクトリにインストールするようにglibc2.4を構成します。例: /usr/local/glibc2.4、コンパイルしてインストールします。

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

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

更新:これはそれほど簡単ではないことが判明しました。システム上に2つの異なるlibcがあると、libcが検索するため、再コンパイル/インストール以上のものが必要になります。ランタイムリンカーと動的ロードNSSモジュールを固定の場所に配置します。 rtldi プログラムでは、異なるバージョンのGNU libcを単一のLinuxシステムにインストールできます。そのWebページには説明があります(ただし、これはエキスパートレベルのタスクであるため、確かにステップバイステップのウォークスルーではありません)。

wkhtmltoimage ..を再コンパイルする方がはるかに少ない作業になることをもう一度強調しておきます。

12
Riccardo Murri