Я использую опцию "-wrap" в GNU ld для перехвата вызовов в приложениях, но столкнулся со сценарием, в котором код, реализующий оболочку, косвенно вызывает функцию-оболочку, создавая циклическую ссылку.
Пример
Цель состоит в том, чтобы обернуть вызовы чтения, которые происходят в программе Foo. Этот код может быть перекомпилирован / перекомпонован, но не изменен.
Программа Foo
main() {
...
read(fd, buf, size);
...
}
Оболочка здесь будет перехватывать вызовы чтения libc в программе Foo при использовании "-wrap read".
Упаковочный
extern int __real_read(...);
int __wrap_read(...) {
bar();
__real_read(...);
}
Однако библиотечная панель, вызываемая из оболочки, должна использовать функцию read () libc, не проходя через оболочку (таким образом вызывая циклическую зависимость).
Библиотечный бар
void bar(void) {
read(fd, buf, size)
}
Изменение всех обернутых подпрограмм в панели библиотек для использования __real_read () невозможно, поскольку уровень косвенных указаний, которые существуют при дополнительных вызовах внешних библиотек в панели библиотек, является произвольным.
Флаги избегания
Одним из способов решения этой проблемы является использование флагов для каждого потока, чтобы предотвратить повторное считывание упакованных данных, происходящих из панели библиотек при повторном входе в библиотеку. Хотя я предпочел бы не использовать это решение, я также открыт для предложений о том, как реализовать это с минимальным изменением кода в библиотеках оболочки и панели.
Идеальное решение
??? Вот почему я задаю вопрос:)
Спасибо ...
-n