ルートなしでプロセスを隠すか、ファイルシステムパスにマウントする方法はありますか?実際のファイルシステムには影響せず、プロセス自体とその子にのみ影響を与える必要がありますか?
少し奇妙なユースケースですが、通常のOSXシステムのように、OSXビルドサーバーから何かをビルドする必要があります。しかし、残念ながら、ビルドを台無しにするいくつかのライブラリがインストールされており、/usr/local/{include,lib}
コンピュータへのrootアクセス権がありませんでした。だから/usr/local
走っている間一時的に隠したいですconfigure
。make
書き込み権限がないため、/usr/local
実際に変更することはできません。
答え1
いいえ、自分で行う方法はありません。chflags hidden
物を隠すために使用できます。発見者ただし、これはコマンドラインには影響しません。
回避策は設定スクリプトによって異なります。それ可能表示するだけでもPATH
わかりますが/usr/local
、確認するハードコードされたディレクトリのリストがある可能性があります/usr/local
。前者を変更するには(PATH
- に基づいて)パスを調整できます。後者の場合、唯一の効果的な方法はconfigure
スクリプトを修正することです。
ハードコーディングされたリストが表示されるのは、アドインがシステムの残りの部分と同じ検索パスを使用しない可能性があるためです。たとえば、さまざまなBSDポートなどを使用できます/usr/pkg
。/usr/local
部分的に依存関係パッケージツールは、ビルドスクリプトでこれらのパス名を設定します。ただし、ポートシステムの一部として構築されていないプログラムは、ユーザーの注意をほとんど払うことなく構築するためにこれらの場所でアイテムを見つける必要があります。
OSX のデフォルト検索パスを無視するには、ld
次のマニュアルページから始めます。
検索パス
ld
使用するライブラリまたはフレームワークを検索するためのディレクトリのリストを保持します。これ基本図書館の検索パスは次のとおりです。/usr/lib
それから/usr/local/lib
。これ-L
オプションは新しいライブラリ検索パスを追加します。デフォルトのフレームワーク検索パスは次のとおりです。/Library/Frameworks
それから/System/Library/Frameworks
。 (注:以前は/Network/Library/Frameworks
デフォルトパスの末尾にあります。その機能が必要な場合は、明示的に追加する必要があります。-F/Network/Library/Frameworks
)。これ-F
オプションは新しいフレームワーク検索パスを追加します。これ-Z
オプションは削除する標準検索パス。これ-syslibroot
オプションは、すべての検索パスにプレフィックスを追加します。
ld
オプションの前にプレフィックスを付けてオプションを渡します-Wl
(スペースが必要な場合はコンマを使用)。あなたの目的に合わせてスクリプトを作成します。
-Z
検索パスを削除するには- 使用する必要があるセクションをもう一度追加してください。
-L
このclang
オプションは-v
詳細情報を表示します翻訳者たとえば、次を使用してディスプレイ-v
に渡されます。ld
-Wl,-v
リンカーの詳細。
たとえば、次のようになります。
#!/bin/sh
clang -Wl,-Z -L/usr/lib -F/Library/Frameworks -F/System/Library/Frameworks "$@"
clang
マニュアルには文書化されていませんが、簡単な確認-Z
でリンカーに簡単なオプションを渡すことがわかります。一方、clang
ドキュメントオプション(主にgcc互換性のため)は、インクルードディレクトリのさまざまなカテゴリの検索を抑制しますか?
-nostdinc
Do not search the standard system directories or compiler
builtin directories for include files.
-nostdlibinc
Do not search the standard system directories for include files,
but do search compiler builtin include directories.
-nobuiltininc
Do not search clang's builtin directory for include files.
埋め込みファイルの検索パスを表示するオプションはありませんが、プリプロセッサを実行してこれを推測できます。
スクリプトが機能してスクリプトを実行すると、スクリプト名をconfigure
設定できます。たとえば、次のようになります。CC
./configure CC=cc-system
私はしばらくこの作業をしてきましたが、この特定の組み合わせは必要ありませんでした(参照コンパイララッパー)。
答え2
プロセスが協力している(つまり、隠された問題を意図的に解決しようとしない)、動的にリンクされた実行可能ファイルであると仮定すると、次のようになります。DYLD_PRELOAD
(これは他のほとんどのUnixバリアントで呼び出されるOSXの名前です。LD_PRELOAD
)ファイル検索機能を含むライブラリをロードし、いくつかの結果を偽造します。
ここあなたが望むほとんどすべてを行うコードの例です。プログラムが表示したくないファイルにアクセスする方法によっては、他の機能をオーバーライドする必要があるかもしれませopen
んaccess
。
答え3
したがって、実際には特定のディレクトリを非表示にしたくないので、スクリプトがそのconfigure
ディレクトリ内の特定のファイルを見つけることができないようにするだけです。
これを行う最も簡単な方法は、おそらくconfigure.ac
エディタで開き、埋め込みファイルやライブラリを検索しないように編集してからスクリプトを/usr/local
再生成することです。または最終的にはシェルスクリプトなので、直接編集することもconfigure
できます。configure
しかし、これはスクリプトが生成されるため、もう少し複雑です。
答え4
ビルド用に選択したライブラリとconfigure
スクリプトを設定する方法に応じて、configure
ライブラリを提供する「外部パッケージ」を使用しないように指示するか、別のパスで検索して使用を無効にすることができます。
これを行う方法はconfigure
通常次のとおりです。
$ ./configure --without-PACKAGE
パッケージの使用を無効にします。または
$ ./configure --with-PACKAGE=PATH
PACKAGE
ライブラリを提供する「外部パッケージ」で、インストールパッケージPATH
のプレフィックスパスである別のパスを指定してインストールしてください。
別の解決策は、ターゲットマシンと同じ構成で仮想マシンを設定し、そこに構築することです。