2013-05-21 4 views
2

Можно условно заменить функцию во время выполнения на C (в частности, функцию в динамически загруженной библиотеке)?Условно замена функции C во время выполнения

Я знаю, что вы можете использовать LD_PRELOAD или просто сделать функцию с тем же именем, таких как:

// Silly example intercepting exit 
typedef void (*exit_func)(int code); 

void exit(int code) 
{ 
    exit_func orig_exit = (exit_func)dlsym(RTLD_NEXT, "exit"); 

    NSLog(@"EXIT CALLED WITH CODE %d!!!!", code); 

    orig_exit(code); 
} 

Однако, можно условно заменить функцию, во время выполнения, после загрузки программы и работает?

if(some_condition) 
{ 
    swap_impementations(exit, my_exit); 
} 

Edit: Это несколько похоже на Is it possible to swap C functions? но конкретно я пытаюсь перехватить вызов функции из другой библиотеки, которая была загружена операционная система.

Это означает, что, например, я должен перехватить функцию exit() из stdlib, ANY call to exit() из ANYWHERE вызовет мою реализацию вместо оригинала, как и мой пример выше, кроме управляемых во время выполнения.

Были предложения по подключению вызова путем перезаписывания оригинала с помощью инструкции перехода, но я надеялся на то, что не требует топания в исполняемой памяти, например, возможно, было что-то, что я мог бы назвать в динамическом компоновщике «повторно связать» функцию после запуска программы и указать ее где-то еще?

+0

Возможно, мне что-то не хватает: почему вы не можете просто использовать указатель на функцию? – Ezra

+1

Я не уверен, почему указатель функции не сработает для вас, но вы также можете [* hook *] (http://en.wikipedia.org/wiki/Hooking) эту функцию. самый простой способ - просто написать команду перехода или вызова в начале функции. – AusCBloke

+0

Я хочу заменить реализацию функции, содержащейся в динамической библиотеке, загруженной ОС, так что что-то, вызывающее эту функцию, вызывает мою реализацию. Если вы хотите перехватить функцию exit(), например, указатели на функции не будут этого делать. – Karl

ответ

0

Используйте указатель функций для этой цели.

Смежные вопросы