c и LD_PRELOAD. открытые и open64 вызовы перехватываются, но не stat64

Я сделал небольшую общую библиотеку, которая пытается перехватить открытые, open64, stat и stat64 вызовы sys. Когда я экспортирую LD_PRELOAD и запускаю sqlplus oracle, я могу видеть следы вызовов open и open64, но никаких следов вызовов stat и stat64. Общая библиотека представляет собой один файл c со всеми определениями вызовов sys в нем. Почему происходит перехват некоторых системных вызовов, а другие нет? Спасибо за вашу помощь.

    Поскольку GNU libc реализует open() и open64() как и следовало ожидать (т.е. они представляют собой просто динамически связанные символы, которые можно подключить к LD_PRELOAD ), но делает что-то особенное с stat() и stat64() .

    Если вы посмотрите на символы, экспортированные libc (например, с nm -D /libc/libc.so.6 ), вы увидите, что на самом деле они не предоставляют символы stat или stat64 !

    Вызовы этих функций завершаются – либо во время компиляции (если возможно) встроенными функциями в , либо (в противном случае) статически связанные определения, предоставленные libc_nonshared.a .

    Фактически динамически связанные функции, которые __xstat() являются __xstat() или __xstat64() ; и они берут дополнительный первый аргумент – целое число, которое является номером версии, указывающим макет struct stat , ожидаемый вызывающим. Попробуйте подключить их вместо этого.

    (objective всего этого – позволить динамически связанным libc поддерживать двоичные файлы, которые используют различные несовместимые макеты struct stat и определения бит в mode_t ; если вы посмотрите в /usr/include/sys/stat.h вы найдете комментарий к этому эффекту. fstat() , fstat64() , lstat() , lstat64() и mknod() также затрагиваются одинаково.)