Переопределение функции C ++ с динамической загрузкой - PullRequest
1 голос
/ 02 февраля 2011

У меня есть Программа A, в которой реализована функция Foo. Программа A может динамически загружать dll во время выполнения.

В настоящее время я пишу Программу B, которая скомпилирована в dll, поэтому Программа A может загрузить ее.

Что я хотел бы сделать, так это как-то «переопределить» функцию Foo в Программе B, поэтому, когда она вызывается из Программы A, вызывается другой код от кода, реализованного в Программе A.

Найдена справочная тема о функциях трамплина: http://en.wikipedia.org/wiki/Trampoline_%28computers%29

Мой вопрос: возможно ли это? Как?

Спасибо, krisy

Редактировать: у меня есть исходный код Программы A, но мне не разрешено изменять это. Так что переопределение структуры программы A не может быть и речи: - (

Редактировать: Мне нужно - желательно - кроссплатформенное решение с открытым исходным кодом (или, по крайней мере, должно работать в системах Linux)

Ответы [ 4 ]

1 голос
/ 02 февраля 2011

Это возможно только в том случае, если функция, которую вы хотите переопределить, будет жить во внешней dll, общей для программы A и B.

Реализация функции внутри Программы A и ее переопределение в DLL для Программы.В это не будет работать, потому что функция уже определена.Динамический компоновщик будет перепривязывать только неопределенные функции.

Любое решение всегда будет взломом.

Лучше использовать указатели функций или правильный дизайн классов и создать архитектуру, которая решает вашу проблему вчистый путь.

0 голосов
/ 02 февраля 2011
void Foo(void) {
  if (globalPointerToFooInDLL != NULL) {
    return globalPointerToFooInDLL();
  }
  elseDoSomethingElse();
}

или вызовите Foo через какой-либо указатель все время и переопределите этот указатель при загрузке DLL.

Detours перезаписывает исходные функции в процессе выполненияЭто, конечно, тоже вариант, но это просто еще одна форма самоизменяющегося кода со всеми проблемами, из-за которых самоизменяющийся код вышел из моды.

0 голосов
/ 02 февраля 2011

другой простой способ - использовать указатель на функцию, и модуль A попросит B получить указатель на функцию и вызвать его.

Этот метод в основном используется в C для имитации полиморфизма, но я предлагаю вамиспользовать наследование, если вы используете C ++;

0 голосов
/ 02 февраля 2011

Вы можете использовать Объезд , чтобы сделать это.

Edit: LD_PRELOAD может помочь вам сделать то же самое. (Пример взят из Что такое трюк LD_PRELOAD? )

$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...