2012-11-04 77 views
1

我需要在運行時將Mac OS進程中的函數引用更改爲在我自己的自定義dylib中定義的自定義函數。我保留了與原始相同的新功能簽名。 例如,我需要將「打開」功能更改爲「myopen」功能。在Mac OS中更改函數引用在運行時進程

我試過處理__LINKEDIT段來獲取動態符號表和字符串表。 我用下列指針, 1. VMAddrress從__LINKEDIT段, 2. mach_header和vmaddr_slide從 「_dyld_register_func_for_add_image」 回調, 3. symoff和stroff從symtab_command。

但是我無法獲取__LINKEDIT段中提到的符號表和字符串表。 有人可以對此有所瞭解嗎? 在此先感謝。

回答

0

如果有問題的函數是一個庫函數,而不是靜態編譯到可執行文件中,則不需要執行任何操作 - 您可以使用函數插入。具體來說,它添加到您的庫:

// The attribute creates a Mach-O Section in your library - q.v. libgmalloc.dylib for 
    // a nice example 
    static const interpose_t interposing_functions[] \ 
     __attribute__ ((section("__DATA, __interpose"))) = { 
      { (void *)my_open, (void *)open }, 
      { (void *)my_close, (void *)close }, // .. etc 
     }; 


int my_open(const char *path, int flags, mode_t mode) 
{ 

    int rc; 
    // Prolog - do something before open 

    rc = open(path, flags, mode); // call real open 

    // Epilog - record rc, etc..  

    return rc; 
} 

有在OS X的內部可顯然,雖然根據S.O網站的政策,我們不能將您鏈接到他們爲您提供樣品,有幾個優秀的書籍。也就是說,上面的代碼片段應該可以工作。請記住,這不會對其他dylib執行的打開調用起作用(儘管也有更復雜的方式來獲取它)