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

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

Ответ 1

Поскольку 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() также влияют одинаково).