[FreeBSD-users-jp 95921] Re: LD_PRELOAD がうまくいかない
Tomoaki AOKI
junchoon @ dec.sakura.ne.jp
2016年 8月 10日 (水) 11:30:05 UTC
青木@名古屋です。
lddに-aオプションを付けないとLD_PRELOADで読み込んだ(バイナリのELF
ヘッダに埋め込まれていない)ライブラリは表示されないようです。
実行結果(ソースやビルド手順は岡部さんと同じなので省略)
% ldd random_num
random_num:
libc.so.7 => /lib/libc.so.7 (0x800821000)
% ldd -a random_num
/home/junchoon/scratch/tmp/random_num:
libc.so.7 => /lib/libc.so.7 (0x800821000)
% ./random_num
55440290
1924551685
541495487
2026454476
1677237165
1454698439
15359984
457230254
972406818
890853262
% LD_PRELOAD=./unrandom.so ldd ./random_num
./random_num:
libc.so.7 => /lib/libc.so.7 (0x800a22000)
% LD_PRELOAD=./unrandom.so ldd -a ./random_num
/home/junchoon/scratch/tmp/random_num:
libc.so.7 => /lib/libc.so.7 (0x800a22000)
./unrandom.so:
libc.so.7 => /lib/libc.so.7 (0x800a22000)
% LD_PRELOAD=./unrandom.so ./random_num
42
42
42
42
42
42
42
42
42
42
ログインシェルが(t)cshでないためsetenvコマンドが存在しないのでコマンド
ラインに違いがありますが、実行形式1個動かすだけであれば実質的に差は
無い筈です。(岡部さんも同様?)
LD_PRELOADで読み込んだライブラリは、実際の使用順によらずELFヘッダに
記録されているものの後に表示されてしまうようです。
stable/11, r303807にKarl Denninger氏のZFS過剰スワップ対策パッチ及び
近々(恐らくstable/11だけに)MFCされる筈のいくつかのzfs関連パッチを
当てた状態のamd64環境です。
On Wed, 10 Aug 2016 09:44:21 +0900
岡部 勝幸 <HGC02147 at nifty.com> wrote:
> 岡部です。
>
> 9.3-RELEASEではなく10.3-STABLEですが、LD_PRELOADの設定反映されますよ。
> ソースの方に綴り間違え等ありませんか?
>
> 以下、試した内容です。
>
> > % cat random_num.c
> > #include <stdio.h>
> > #include <stdlib.h>
> > #include <time.h>
> >
> > int
> > main(int argc, char **argv)
> > {
> > srand(time(NULL));
> > int i = 10;
> > while (i--)
> > printf("%d\n", rand());
> > return 0;
> > }
> >
> > % cc -o random_num random_num.c
> > % ./random_num
> > 2016130939
> > 2115726213
> > 976251671
> > 1086788223
> > 1301263032
> > 354334582
> > 329183349
> > 666688777
> > 1616105446
> > 511080472
> > % cat unrandom.c
> > #include <stdlib.h>
> >
> > int
> > rand(void)
> > {
> > return 42;
> > }
> >
> > % cc -shared -fPIC -o unrandom.so unrandom.c
> > % LD_PRELOAD=./unrandom.so ./random_num
> > 42
> > 42
> > 42
> > 42
> > 42
> > 42
> > 42
> > 42
> > 42
> > 42
> > % LD_PRELOAD=./unrandom.so ldd ./random_num
> > ./random_num:
> > libc.so.7 => /lib/libc.so.7 (0x800a21000)
> > %
>
> ----
> 岡部 勝幸
>
> On 2016/08/07 12:09, User Ribbon wrote:
> > 実行時に動的ライブラリを差し替える手段として、LD_PRELOAD 環境変数
> > があります。使用例としては、
> >
> > https://siguniang.wordpress.com/2015/05/15/override-functions-with-ld_preload/
> >
> > などがあります。
> > FreeBSDでも動くと思っててストしてみたのですが動きませんでした。
> >
> > 上記URLにあるサンプルプログラムを使い、
> >
> > setenv LD_PRELOAD ./unrandom.so
> >
> > をしたあと、
> > %ldd random_num
> > としても、
> > random_num:
> > libc.so.7 => /lib/libc.so.7 (0x800a1b000)
> >
> > となり、LD_PRELOAD した結果が反映されません。
> > 動作環境は
> > FreeBSD bsd09-64 9.3-RELEASE-p43 FreeBSD 9.3-RELEASE-p43 #0: Sat May 28 00:19:32 UTC 2016
> > です。
> >
> > 何かほかに設定しないと動かないのでしょうか。
> >
> > ribbon
>
> _______________________________________________
> freebsd-users-jp at freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/freebsd-users-jp
> To unsubscribe, send any mail to "freebsd-users-jp-unsubscribe at freebsd.org"
>
--
青木 知明 [Tomoaki AOKI] <junchoon at dec.sakura.ne.jp>
freebsd-users-jp メーリングリストの案内