с и LD_PRELOAD. вызовы open и open64 перехвачены, но не stat64 - PullRequest
10 голосов
/ 30 марта 2011

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

1 Ответ

18 голосов
/ 30 марта 2011

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

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

Обращения к этим функциям упакованы - либо во время компиляции (если возможно) встроенными функциями в <sys/stat.h>, либо (если это не так) статически связанными определениями, предоставленными libc_nonshared.a.

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

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

...