Xlinker和syscall

虽然Xlinker和syscall两种没关系,但最近在工作中一起碰到了,琢磨了半天。 下面以笔试题的形式先考考读者:

1. 自己实现一组内存分配和释放函数。

要求能够替代之前的alloc/free/memalign函数。要求:

  • 不修改原始代码,只替换库;
  • debug 版本的时候,调用自己开发的库
  • release 版本,用标志库

2. 在应用程序如何调用底层的系统调用接口。

要求在应用程序直接调用系统调用,来提高性能。

3. 提示

3.1 问题1的提示

  1. 代码中可以通过typeof 定义新函数和之前的malloc/free函数接口和类型一致;
  2. GCC链接选择中可以通过 -Xlinker –wrap=malloc 指定链接到想要的库
  3. 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);