Не удается подключить функцию обратного вызова? - PullRequest
3 голосов
/ 27 октября 2011

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

Скажем ..

Если я сделаю что-то вроде

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;
    }
}
 ...
}

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

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

Я прав в этом? Если да, то может ли кто-нибудь предложить мне какой-нибудь обходной путь?

Ответы [ 2 ]

0 голосов
/ 17 мая 2012

Если мы перехватим, посмотрев в таблицу символов и заменив адрес функции там, соответствующий вводу символов, будет работать, пока мы выполняем вызов функции, используя ввод символов в таблице символов. Если мы будем использовать адрес функции напрямую (функция обратного вызова), он не будет работать.

0 голосов
/ 27 октября 2011

Если вы используете LD_PRELOAD для перехвата своих функций, когда вы берете указатель на puts, указатель предположительно связан с версией, о которой знает компоновщик, когда вы ссылаетесь, в стандартной библиотеке и не ' не перезаписывается, когда ваша предустановленная библиотека появляется. Я не могу придумать способ обойти это.

...