我已經編寫了open()
系統調用的包裝並使用LD_PRELOAD
環境變量預加載它。我只想要程序的一些功能使用修改的open()
而其他人會使用原始的。在兩個程序中分離函數不是一個可以調用另一個的選項。如何做呢?預加載我的庫的一些功能,同時使用LD_PRELOAD的其他人使用原件
2
A
回答
0
首先,必須有一種確定的方式來將待預加載的開放區域從默認開放區域中分離出來。這可以使用助手庫(必須動態加載)完成,該助手庫提供該特殊打開的另一個打包版本。通過預加載該庫的變體來替代該變體。
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寫()稱爲
$
相關問題
- 1. 使用換,同時或一些其他順序功能
- 2. 使用相同的功能加載其他圖像卸載另一個圖像
- 3. 我不能使用PHP的strip_tags功能與其他功能
- 4. 帶文件功能的LD_PRELOAD
- 5. 使用其他功能
- 6. 其他功能後加載javascript功能
- 7. 使用其他功能的數據
- 8. 如何在一些其他功能中使用變量?
- 9. LD_PRELOAD加載的事件
- 10. 加載外部HTML文件的div和使用其JS功能
- 11. Spring MVC的 - 入門同時使用jQuery加載功能
- 12. 爲什麼`使用System.Linq`將功能添加到其他庫
- 13. 如何使功能響應同步與其他功能的其他語句
- 14. 使用不同功能加載數據
- 15. 加載使用其他共享庫的共享庫
- 16. 如何創建其他人可能使用的Maven倉庫?
- 17. 使用值加載其他CONFIG文件
- 18. 當我使用highcharts時,我的DataTable失去了他的功能。
- 19. 實體框架使用來自其他存儲庫的功能
- 20. php使用類功能,查詢其他類中的數據庫
- 21. 是否使用Linux的功能禁用LD_PRELOAD
- 22. 使用Typescript調用其他組件在Angular 2中的功能
- 23. 如何檢查是否使用LD_PRELOAD預先加載了linux共享庫
- 24. Flex - 使用香草預載器來加載其他資產?
- 25. 多功能的搜索表單使用功能,如果其他
- 26. 預先加載使用功能NHibernate/NHibernate的與自動映射
- 27. 如何使用陣列從一個功能,其他功能
- 28. 與模擬輸入功能一起使用其他功能
- 29. 爲什麼我的一些視圖有效,其他人不使用setRetainInstance(boolean retain)?
- 30. 使用jQuery篩選與其他人相同的一個div
我不知道我理解你的解決方案。你能更清楚嗎?非常感謝您的幫助 – lipika 2011-03-05 14:57:03
使用不同的函數名稱進行打包。 – fpmurphy1 2011-03-05 15:46:37
@lipika:想一想:如果要使用包裝「打開」,或者使用系統中的包裝,應該根據哪個標準來決定。一旦你發現了這一點,其餘的應該清楚。 – datenwolf 2011-03-05 16:29:50