新城@筑波大学情報です。こんにちは。

In article <hojtti$nfh$1@speranza.aioe.org>
        tesigana@diary.ocn.ne.jp (tesigana@diary.ocn.ne.jp) writes:
> > この問題を誤魔化すような方法は、ないでしょうか。たとえば、
> > chflags を実行しないようにするとか。
> 空の chflags 関数を作って ELF ライブラリにして、
> それを環境変数 LD_PRELOAD に指定する、
> というのはどうですか。 

なるほど。その手がありましたね。試してみた所、うまく行きまし
た。ありがとうございました。

動的リンクライブラリを置換える方法としては、次の Web ページ
を参考にしました。

    http://d.hatena.ne.jp/eagletmt/20080726/1217085814

実際に作ったのは、次のような C のプログラムです。

------------------------------------------------------------
% cat chflags.c
/*
 * fake chflags(2) and fchflags(2) to run port on NFS
 */

#include <sys/stat.h>
#include <unistd.h>

int
chflags(const char *path, __uint32_t flags)
{
  return( 0 );
}

int
fchflags(int fd, __uint32_t flags)
{
  return( 0 );
}

int
lchflags(const char *path, __uint32_t flags)
{
  return( 0 );
}
% 
------------------------------------------------------------

Makefile も作ってみました。cc -shared -fPIC -o chflags.dylib 
chflags.c でいいんですけれど。

------------------------------------------------------------
% cat Makefile
#
#
#

all:    chflags.dylib

chflags.dylib: chflags.c
        $(CC) -shared -fPIC -o $@ $<

% 
------------------------------------------------------------

うちでは、できあがったものを 
/usr/local3/lib/dummy-chflags/chflags.dylib に置きました。

------------------------------------------------------------
% ls -l /usr/local3/lib/dummy-chflags/chflags.dylib
-rwxr-xr-x  1 root  admin  4304  3 29 12:31
/usr/local3/lib/dummy-chflags/chflags.dylib
% nm /usr/local3/lib/dummy-chflags/chflags.dylib
0000000000000000 t __mh_dylib_header
0000000000000ecb T _chflags
0000000000000edd T _fchflags
0000000000000eee T _lchflags
                 U dyld_stub_binder
%
------------------------------------------------------------

シェルスクリプトを作りました。

------------------------------------------------------------
% cat /usr/local3/bin/run-no-chflags 
#!/bin/sh

export DYLD_INSERT_LIBRARIES=/usr/local3/lib/dummy-chflags/chflags.dylib
export DYLD_FORCE_FLAT_NAMESPACE=YES

$@
% 
------------------------------------------------------------

このシェルスクリプトは、次のように、引数に実行したいコマンド
を与えて使います。
------------------------------------------------------------
# run-no-chflags port activate pstree
--->  Activating pstree
# 
------------------------------------------------------------

In article <hojtti$nfh$1@speranza.aioe.org>
        tesigana@diary.ocn.ne.jp (tesigana@diary.ocn.ne.jp) writes:
> BSD 系でこの技が使えるか分かりませんが…

やってみると、MacOSX でもこのくらいなら比較的簡単でしたね。
引数を変えながら同じ名前の関数を呼ぶとかしようとすると、また
面倒なのかもしれませんけれど。

\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報       \\