[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 メーリングリストの案内