4

コマンド

gcc main.c -o main
ldd main

収率

linux-gate.so.1 => (0x00f67000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00b7d000)
/lib/ld-linux.so.2 (0x00ae5000)

libc.so.6 がメモリにマップされるアドレスを変更することは可能ですか? たとえば、代わりに libc.so.6 を 0xb0000000 にマップします。

Xubuntu 32 ビットを実行しています: Linux 3.2.0-23-generic i686 i686 i386 GNU/Linux

4

1 に答える 1

2

そのライブラリのロードアドレス(「ベースアドレス」と呼ばれます)を変更できるprelinkユーティリティ(wikiページ)があります。

プレリンクがどのように機能するかについての情報があります: http://www.acsu.buffalo.edu/~charngda/e ​​lf.html

このプレリンクは何をしますか? 動的ライブラリがメモリにロードされると、動的ライブラリのベース アドレスがユーザー プログラムのアドレス空間の実際のアドレスに変更されます。もちろん、ld.so は GNU_PRELINKED タグを認識し、ダイナミック ライブラリをこのベース アドレスにロードします (mmap の最初の引数が優先アドレスであることを思い出してください。もちろん、これはオペレーティング システムによって異なります)。

通常、動的ライブラリは位置に依存しないコード、つまり -fPIC コンパイラ コマンドライン オプションとしてビルドされるため、ベース アドレスは 0 です。たとえば、通常の libc.so には次のような ELF プログラム ヘッダーがあります ( readelf -lcommand )...

によると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

于 2012-10-24T01:12:11.927 に答える