Я перехватывал несколько функций в своем коде, и до сегодняшнего дня он работал довольно красиво, а затем я столкнулся с ошибкой из-за функции обратного вызова.
Скажем ..
Если я сделаю что-то вроде
puts("Hi!\n");
прекрасно работает. Я могу зацепить это.
Но если я сделаю это ...
typeof(puts) *fptr = puts;
fptr("Hi \n");
Захват не работает?
Я использую OSX env и ищу символы для подключения.
Может кто-нибудь подсказать мне, что не так с функциями обратного вызова и что я должен делать, чтобы подключить алгоритм перехвата?
РЕДАКТИРОВАТЬ: Я сделал еще несколько отладок, если со следующей информацией кто-нибудь, кто может высказать свое мнение.
Я думаю, это может быть источником проблемы?
bool Hook(const char *name, void *impl) {
...
void **EntryInAdressTable = find(name);
if(EntryInAdressTable) {
*EntryInAdressTable = impl;
}
}
...
}
Итак, что здесь происходит, я меняю запись в таблице адресов для соответствующего символа с моей реализацией, а в моей реализации я вызываю оригинальную функцию.
Итак, я предполагаю, что если мы используем функцию обратного вызова, это означает, что мы ссылались непосредственно на адрес функции, не проходя через таблицу адресов, и поэтому перехваченный метод не вызывается.
Я прав в этом? Если да, то может ли кто-нибудь предложить мне какой-нибудь обходной путь?