c и LD_PRELOAD. вызовы open и open64 перехвачены, но не stat64

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


person klayme    schedule 29.03.2011    source источник


Ответы (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() также затрагиваются таким же образом.)

person Matthew Slattery    schedule 29.03.2011
comment
Привет Мэтью. Спасибо за вашу помощь. Но я только что заметил, что проблема не перехвата вызовов бывает только с функциями, у которых в качестве параметра есть struct stat64. Это работает для fstat, но не для fstat64 или stat64. Может ли это быть проблемой в моем определении функции? Или мне перехватить __xstat64 и __fxstat64? Спасибо еще раз. - person klayme; 30.03.2011
comment
@klayme: Пожалуйста, и спасибо, что приняли ответ - значит ли это, что у вас все в порядке? (Я думаю, что правильно перехватывать __xstat64 и __fxstat64.) - person Matthew Slattery; 31.03.2011
comment
Это прекрасно сработало для меня в сочетании с источником на tcm.phy.cam .ac.uk/sw/inodes64.html . Они не патчят 64-битные версии, а только объявляют интерфейс. Я также исправил их, чтобы позволить 32-битному компилятору, который правильно вызывал stat64(), обрабатывать 64-битные иноды. - person Aaron D. Marasco; 19.08.2016