プリロードされたライブラリとして、特定のプロセスのすべてのファイル関連関数をオーバーライドしようとしていました。プリロードされたライブラリとしてコンパイルするこのコードがあり、プロセスを実行して標準出力を確認します。
#include <stdio.h>
#include <dlfcn.h>
FILE *(*original_fopen)(const char*, const char*) = NULL;
FILE *fopen(const char *path, const char *mode) {
printf("In our own fopen, opening %s\n", path);
fflush(stdout);
if (!original_fopen) {
original_fopen = (FILE * (*)(const char*, const char*))dlsym(RTLD_NEXT, "fopen");
}
return (*original_fopen)(path, mode);
}
これはでコンパイルできますg++ -Wall -fPIC -shared -o hooks.so hooks.cpp -ldl
次に、fifos を使用するプログラムを次のように使用します。
LD_PRELOAD=hooks.so ./prog
問題は、プログラムが何らかの理由で libio/iofopen.c の関数 _IO_new_fopen を使用しているように見えることです。1. fopen を強制的に使用する方法はありますか? この機能を最初に使用するようになったのはどのような経緯でしたか? または2.上書きできますか?同じ署名を試しましたが、うまくいきませんでした..
更新:コールバックが呼び出されるアプリケーションのいくつかの場所から、これはいくつかのインクルードであり、それをオーバーライドする方法が必要であると確信しています..しかし、どのように?