Я работаю над проектом, который требует упаковки системных вызовов libc, в частности файловых вызовов ввода-вывода, таких как открытие, чтение, запись, закрытие и т. Д. Я собираюсь использовать это в качестве службы мониторинга для файловых операций.
Я успешно завернул все вызовы, и программа-оболочка прекрасно работает, когда я пытаюсь открыть текстовый файл с помощью gedit.Но проблема в том, что я не могу запустить Google Chrome и несколько других приложений, когда оболочка предварительно загружена.Google Chrome, в частности, идет в бесконечную петлю наноспящего.Вы можете увидеть следующую строчку.
После отладки я обнаружил, что причиной являются проблемы с системными вызовами read и close.Когда я удаляю функции-оболочки для чтения и закрытия, все работает нормально.Одна вещь, которую я могу сделать, это отключить упаковщик для 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;
}