Xlinker和syscall
雖然Xlinker和syscall兩種沒關係,但最近在工作中一起碰到了,琢磨了半天。 下面以筆試題的形式先考考讀者:
1. 自己實現一組內存分配和釋放函數。
要求能夠替代之前的alloc/free/memalign函數。要求:
- 不修改原始代碼,只替換庫;
- debug 版本的時候,調用自己開發的庫
- release 版本,用標誌庫
2. 在應用程序如何調用底層的系統調用接口。
要求在應用程序直接調用系統調用,來提高性能。
3. 提示
3.1 問題1的提示
-
代碼中可以通過typeof 定義新函數和之前的malloc/free函數接口和類型一致;
-
GCC鏈接選擇中可以通過 -Xlinker --wrap=malloc 指定鏈接到想要的庫
-
GCC鏈接選擇中可以通過-Xlinker --undefined=__wrap_malloc忽略沒有定義的函數;
-Xlinker --wrap=malloc -Xlinker --undefined=wrap_malloc -Xlinker --wrap=free -
Xlinker --undefined=__wrap_free -Xlinker --wrap=memalign -Xlinker --undefined=wrap_memalign -lpthread -laio -lfuse`
3.2 問題2的提示
頭文件:
#include <sys/syscall.h>
部分關鍵代碼:
#define UTEX_WAIT 0
#define UTEX_WAKE 1
#define utex(...) syscall(SYS_utex, ##__VA_ARGS__)
ret = utex(&cond->signalledCnt, UTEX_WAKE, 1, NULL, NULL, 0);