2011-03-05 41 views

回答

0

首先,必須有一種確定的方式來將待預加載的開放區域從默認開放區域中分離出來。這可以使用助手庫(必須動態加載)完成,該助手庫提供該特殊打開的另一個打包版本。通過預加載該庫的變體來替代該變體。

+0

我不知道我理解你的解決方案。你能更清楚嗎?非常感謝您的幫助 – lipika 2011-03-05 14:57:03

+0

使用不同的函數名稱進行打包。 – fpmurphy1 2011-03-05 15:46:37

+1

@lipika:想一想:如果要使用包裝「打開」,或者使用系統中的包裝,應該根據哪個標準來決定。一旦你發現了這一點,其餘的應該清楚。 – datenwolf 2011-03-05 16:29:50

1

在以下示例中使用函數插入與this answer類似。

該示例提供了一個調用原始write()的包裝函數write()。請注意,您不能直接調用原始的write(),因爲它將被解釋爲對包裝器的調用。在main()中使用函數指針說明了如何避免混淆你正在調用哪個write()

代碼: test.c的

#define _GNU_SOURCE 
#include <stdio.h> 
#include <string.h> 
#include <dlfcn.h> 

size_t write(int fd, const void *buf, size_t count) 
{ 
    static size_t (*write_func)(int, const void *, size_t) = NULL; 

    /* get reference to original (libc provided) write */ 
    if (!write_func) 
    { 
     write_func = (size_t(*)(int, const void *, size_t)) dlsym(RTLD_NEXT, "write"); 
    } 

    /* perform wrapper specific actions */ 
    /* ... */ 

    /* call original write() */ 
    return write_func(fd, buf, count); 
} 

int main(int argc, char *argv[]) 
{ 
    size_t (*wrap_write)(int, const void *, size_t); 
    size_t (*orig_write)(int, const void *, size_t); 
    char buf1[] = "write() wrapper called\n"; 
    char buf2[] = "orignial write() called\n"; 

    /* set pointer to write() wrapper to differentiate */ 
    wrap_write = write; 
    /* get reference to original (libc provided) write() */ 
    orig_write = (size_t(*)(int, const void *, size_t)) dlsym(RTLD_NEXT, "write"); 

    /* call write() wrapper */ 
    wrap_write(1, buf1, strlen(buf1));  
    /* call original write() */ 
    orig_write(1, buf2, strlen(buf2)); 

    return 0; 
} 

輸出:

$ GCC -Wall -Werror -ldl test.c的-o測試
$。/test
write()包裝程序調用
orignial寫()稱爲
$

相關問題