GNU/Linux >> Linux の 問題 >  >> Linux

古いバージョンの libc にリンクして、より広いアプリケーション カバレッジを提供する

実行可能ファイル内のどのシンボルが、望ましくないバージョンの glibc への依存関係を作成しているかを調べます。

$ objdump -p myprog
...
Version References:
  required from libc.so.6:
    0x09691972 0x00 05 GLIBC_2.3
    0x09691a75 0x00 03 GLIBC_2.2.5

$ objdump -T myprog | fgrep GLIBC_2.3
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.3   realpath

依存ライブラリ内を調べて、リンクできる古いバージョンのシンボルがあるかどうかを確認します:

$ objdump -T /lib/libc.so.6 | grep -w realpath
0000000000105d90 g    DF .text  0000000000000021 (GLIBC_2.2.5) realpath
000000000003e7b0 g    DF .text  00000000000004bf  GLIBC_2.3   realpath

幸運です!

GLIBC_2.2.5 からバージョンを要求する あなたのコードで:

#include <limits.h>
#include <stdlib.h>

__asm__(".symver realpath,[email protected]_2.2.5");

int main () {
    realpath ("foo", "bar");
}

GLIBC_2.3 が不要になったことを確認してください:

$ objdump -p myprog
...
Version References:
  required from libc.so.6:
    0x09691a75 0x00 02 GLIBC_2.2.5

$ objdump -T myprog | grep realpath
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 realpath

詳細については、http://web.archive.org/web/20160107032111/http://www.trevorpounds.com/blog/?p=103 を参照してください。


残念ながら、@Sam のソリューションは私の状況ではうまく機能しません。しかし、彼のやり方に従って、私はそれを解決する独自の方法を見つけました.

これが私の状況です:

Thrift フレームワーク (RPC ミドルウェア) を使用して C++ プログラムを作成しています。動的リンクよりも静的リンクの方が好きなので、私のプログラムは libthrift.a にリンクされています libthrift.so の代わりに静的に .ただし、libthrift.a glibc に動的にリンクされており、私の libthrift.a 以来 glibc 2.15、私の libthrift.a を使用して私のシステム上に構築されています memcpy を使用 バージョン 2.14 の ([email protected]_2.14 ) glibc 2.15 によって提供されます。

しかし問題は、サーバー マシンに glibc バージョン 2.5 しかなく、[email protected]_2.2.5 しかないことです。 . [email protected]_2.14 よりもはるかに低い .もちろん、私のサーバー プログラムはそれらのマシンでは実行できません。

そして、私はこの解決策を見つけました:

<オール>
  • .symver を使用して [email protected]_2.2.5 への参照を取得する .

  • 自分の __wrap_memcpy を書く [email protected]_2.2.5 を呼び出すだけの関数

  • プログラムをリンクするときは、-Wl,--wrap=memcpy を追加してください gcc/g++ へのオプション。

  • ステップ 1 と 2 に含まれるコードはこちら:https://gist.github.com/nicky-zs/7541169


    Linux
    1. Ubuntu –パンゴエラーHarfbuzzバージョンが古すぎますか?

    2. Win-KeX バージョン 2.0

    3. 古い node.js バージョンをアンインストールまたはアップグレードするにはどうすればよいですか?

    1. 警告:静的ライブラリに対する共有ライブラリのリンクは移植可能ではありませんの意味は何ですか?

    2. .so ファイル内の古いシンボル バージョンへのリンク

    3. Qt アプリケーションのタイトル

    1. Fedora – Dnfに古いバージョンのパッケージをインストールさせる?

    2. リンクエラーに対する再配置R_X86_64_32S

    3. 今すぐ古い Windows バージョンを購入しても、無料でアップグレードできますか?