フルパスが存在しないディレクトリパスを偽造してください。

フルパスが存在しないディレクトリパスを偽造してください。

ソースファイルなどへの絶対パスを参照するビルドシステムを使用しています。別のツールチェーンを使用してビルドをテストするには、VMまたはchrootにsrcディレクトリをマウントします。問題は、私のホストのsrcディレクトリパスが非常に複雑であり(たとえば、/a/b/c/d/src)、インストールされているパスと一致する必要があることです。

私のsrcディレクトリを/mnt/srcと同じ場所にマウントしたいのですが、最終的には/mnt/srcに/a/b/c/d/srcシンボリックリンクを作成するか、単にマウントする必要があります。ロードポイントは次のとおりです。 /a/b/c/d/srcに直接設定してください。

ファイルシステムに/a/b/c/dがあると乱雑に感じられ、しばしば/a/b/c/d(または親ディレクトリ)にファイルを作成する権限がない場合があります。私のビルドシステムを癒すためにこのパスを偽にする方法はありますか?

ベストアンサー1

最善の解決策は、ソースパスとインストールパスが同じではないとビルドシステムに通知することですが、私はそうすることはできません。

最も簡単な方法は、簡単にコピーできるパスでソースパスをソートすることです。たとえば、/var/tmp/mybuildビルドシステムがあまりにも面倒でない場合は、ファイルがある場所へのシンボリックリンクを作成するだけで十分です。ビルドシステムが標準シンボリックリンクを必要とする場合は、次のようにすることができます。バインドマウント代わりに。 binfsを使用すると、root権限は必要なく、ファイルを表示したい場所への書き込み権限だけが必要です。

ソースシステムで作業できない場合は、他の方法は次のとおりです。特定のファイルアクセスをリダイレクトする動的ライブラリをプリロードします。。これは、実行されるすべての実行可能ファイルが動的にリンクされていると仮定します。リンクされた例のコードは、特定のファイルでこれを行う方法を示しています。パスが特定のプレフィックスで始まるすべてのファイルをリダイレクトするように調整できます。変える

if (!strcmp(path, FROM)) {
    path = TO;
}
return ret;

(テストされていない)のようなものを通して

char *other_path = NULL;
if (!strncmp(path, FROM, strlen(FROM))) {
    other_path = malloc(strlen(path) - strlen(FROM) + strlen(TO) + 1);
    if (other_path == NULL) return -ENOENT; // return NULL in fopen
    memcpy(other_path, TO, strlen(TO));
    memcpy(other_path + strlen(TO), path + strlen(FROM), strlen(path) - strlen(FROM) + 1);
    path = other_path;
}
free(other_path);
return ret;

おすすめ記事