Я сделал небольшую общую библиотеку, которая пытается перехватить открытые, open64, stat и stat64 вызовы sys. Когда я экспортирую LD_PRELOAD и запускаю oracle sqlplus, я могу видеть следы открытых и open64 вызовов, но никаких следов вызовов stat и stat64. Общая библиотека представляет собой один файл c со всеми определениями вызовов sys в нем. Почему происходит перехват некоторых системных вызовов, а другие нет? спасибо за вашу помощь.
C и LD_PRELOAD. открытые и 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()
также влияют одинаково).