libc システム呼び出し、特に open、read、write、close などのファイル i/o 呼び出しをラップする必要があるプロジェクトに取り組んでいます。これをファイル操作の監視サービスとして使用するつもりです。
すべての呼び出しを正常にラップし、gedit でテキスト ファイルを開こうとすると、ラッパーは完全に正常に動作します。しかし、問題は、ラッパーがプリロードされているときに、Google Chrome と他のいくつかのアプリケーションを起動できないことです。特に Google chrome は無限の nanosleep ループに陥ります。以下のトレースを見ることができます。
デバッグ後、問題の原因となっているのは read および close システム コールであることがわかりました。読み取り用のラッパー関数を削除して閉じると、すべて正常に動作します。私にできることの 1 つは、Google Chrome のラッパーを無効にすることですが、誰かが同じ問題に直面し、回避策や解決策を見つけたかどうか知りたいです。私は他のラッパーの実装を見て、それらも試してみましたが、同じ問題が発生します。ここで非常に些細なことを見逃していますか?
set_tid_address(0x7f140cddad50) = 23827
set_robust_list(0x7f140cddad60, 24) = 0
rt_sigaction(SIGRTMIN, {0x7f140c867b50, [], SA_RESTORER|SA_SIGINFO, 0x7f140c873390}, NULL, 8) = 0
rt_sigaction(SIGRT_1, {0x7f140c867be0, [], SA_RESTORER|SA_RESTART|SA_SIGINFO, 0x7f140c873390}, NULL, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0
open("/dev/urandom", O_RDONLY) = 3
futex(0x7f140c8610a8, FUTEX_WAKE_PRIVATE, 2147483647) = 0
nanosleep({0, 2000001}, NULL) = 0
nanosleep({0, 2000001}, NULL) = 0
nanosleep({0, 2000001}, NULL) = 0
nanosleep({0, 2000001}, NULL) = 0
nanosleep({0, 2000001}, NULL) = 0
nanosleep({0, 2000001}, NULL) = 0
nanosleep({0, 2000001}, NULL) = 0
nanosleep({0, 2000001}, NULL) = 0
nanosleep({0, 2000001}, NULL) = 0
nanosleep({0, 2000001}, NULL) = 0
nanosleep({0, 2000001}, NULL) = 0
nanosleep({0, 2000001}, NULL) = 0
nanosleep({0, 2000001}, NULL) = 0
nanosleep({0, 2000001}, NULL) = 0
nanosleep({0, 2000001}, NULL) = 0
nanosleep({0, 2000001}, NULL) = 0
read() のラッパー関数は次のとおりです。
ssize_t read(int fd, void *buf, size_t count) {
ssize_t (*libc_read) (int df, void* buf, size_t count);
dlerror();
libc_read = (ssize_t (*) (int df, void* buf, size_t count))
dlsym(RTLD_NEXT, "read");
// If a dynamic link error occurred
if (dlerror() || (libc_read == NULL)) {
return EOF;
}
// Call the system function
size_t bytes_read = libc_read(fd, buf, count);
return bytes_read;
}