предотвращение циклических ссылок "ld -wrap" - PullRequest
4 голосов
/ 20 июля 2010

Я использую опцию "-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

1 Ответ

1 голос
/ 20 июля 2010

Как сказал Натон, должна быть возможность обернуть вызовы read () только для определенных объектных файлов. Не уверен насчет linux, но в Windows перенос импортированной функции в DLL не повлияет на эту импортированную функцию в других модулях, поэтому размещение Bar в отдельной DLL с развернутым read () решит проблему.

...