Я хочу перехватить весь доступ к файловой системе, который происходит внутри dlopen(). Сначала кажется, что LD_PRELOAD
или -Wl,-wrap,
были бы жизнеспособными решениями, но у меня возникли проблемы с их реализацией по некоторым техническим причинам:
ld.so уже отобразил свои собственные символы к тому времени, когда обрабатывается LD_PRELOAD. Для меня не критично перехватывать начальную загрузку, но рабочие функции _dl_*
разрешены в это время, поэтому будущие вызовы проходят через них. Я думаю, что LD_PRELOAD
слишком поздно.
Каким-то образом malloc
обходит вышеуказанную проблему, потому что malloc()
внутри ld.so не имеет функциональной free()
, он просто вызывает memset()
.
Рабочие функции файловой системы, например, __libc_read()
, содержащиеся в ld.so
, статичны, поэтому я не могу перехватить их с помощью -Wl,-wrap,__libc_read
.
Все это может означать, что мне нужно собрать свой собственный ld.so
непосредственно из исходников, вместо того, чтобы подключать его в обертку. Проблема в том, что и libc
и rtld-libc
собраны из одного и того же исходного текста. Я знаю, что макрос IS_IN_rtld
определяется при сборке rtld-libc
, но как я могу гарантировать, что существует только одна копия статических структур данных, при этом экспортируя функцию публичного интерфейса? (Это вопрос к системе сборки glibc, но я не нашел документации по этим деталям.)
Есть ли лучшие способы проникнуть внутрь dlopen()
?
Примечание: я не могу использовать решение, специфичное для Linux, например FUSE
, поскольку оно предназначено для минимальных ядер "вычислительных узлов", которые не поддерживают такие вещи.