実行可能ファイル内のどのシンボルが、望ましくないバージョンの 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