そのライブラリのロードアドレス(「ベースアドレス」と呼ばれます)を変更できるprelink
ユーティリティ(wikiページ)があります。
プレリンクがどのように機能するかについての情報があります: http://www.acsu.buffalo.edu/~charngda/e lf.html
このプレリンクは何をしますか? 動的ライブラリがメモリにロードされると、動的ライブラリのベース アドレスがユーザー プログラムのアドレス空間の実際のアドレスに変更されます。もちろん、ld.so は GNU_PRELINKED タグを認識し、ダイナミック ライブラリをこのベース アドレスにロードします (mmap の最初の引数が優先アドレスであることを思い出してください。もちろん、これはオペレーティング システムによって異なります)。
通常、動的ライブラリは位置に依存しないコード、つまり -fPIC コンパイラ コマンドライン オプションとしてビルドされるため、ベース アドレスは 0 です。たとえば、通常の libc.so には次のような ELF プログラム ヘッダーがあります ( readelf -l
command )...
によるとman prelink
、指定されたライブラリを指定されたアドレスにリベース (再配置) する prelink ユーティリティのオプションがあります。
-r --reloc-only=ADDRESS
事前リンクの代わりに、指定された共有ライブラリを指定されたベース アドレスに再リンクするだけです。
あなたが望む変化を達成するのprelink --reloc-only=0x7896000 libc.so.6
に十分なはずです。
PS: libc のローカル コピーでこの再配置を行い、次の方法でパスを指定できます。export LD_LIBRARY_PATH=/path/to/your/rebased/copy:$LD_LIBRARY_PATH