Я сделал небольшую общую библиотеку, которая пытается перехватывать системные вызовы open, open64, stat и stat64. Когда я экспортирую LD_PRELOAD и запускаю Oracle sqlplus, я вижу следы вызовов open и open64, но не вижу следов вызовов stat и stat64. Общая библиотека представляет собой один файл c со всеми определениями вызовов sys. Почему бывает так, что одни системные вызовы перехватываются, а другие нет? Спасибо за вашу помощь.
c и LD_PRELOAD. вызовы open и open64 перехвачены, но не stat64
Ответы (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()
также затрагиваются таким же образом.)
__xstat64
и __fxstat64
.)
- person Matthew Slattery; 31.03.2011
stat64()
, обрабатывать 64-битные иноды.
- person Aaron D. Marasco; 19.08.2016