Можно условно заменить функцию во время выполнения на 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 вызовет мою реализацию вместо оригинала, как и мой пример выше, кроме управляемых во время выполнения.
Были предложения по подключению вызова путем перезаписывания оригинала с помощью инструкции перехода, но я надеялся на то, что не требует топания в исполняемой памяти, например, возможно, было что-то, что я мог бы назвать в динамическом компоновщике «повторно связать» функцию после запуска программы и указать ее где-то еще?
Возможно, мне что-то не хватает: почему вы не можете просто использовать указатель на функцию? – Ezra
Я не уверен, почему указатель функции не сработает для вас, но вы также можете [* hook *] (http://en.wikipedia.org/wiki/Hooking) эту функцию. самый простой способ - просто написать команду перехода или вызова в начале функции. – AusCBloke
Я хочу заменить реализацию функции, содержащейся в динамической библиотеке, загруженной ОС, так что что-то, вызывающее эту функцию, вызывает мою реализацию. Если вы хотите перехватить функцию exit(), например, указатели на функции не будут этого делать. – Karl