Как перехватить доступ к файловой системе внутри dlopen()?

Я хочу перехватить весь доступ к файловой системе, который происходит внутри 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, поскольку оно предназначено для минимальных ядер "вычислительных узлов", которые не поддерживают такие вещи.

6
задан Jed 8 October 2011 в 20:29
поделиться