Ste*_*ini 31 c linux libc system-calls
假设我想完全接管open()系统调用,可能包装实际的系统调用并执行一些日志记录.一种方法是使用LD_PRELOAD加载(用户自制的)共享对象库,该库接管open()入口点.
然后,用户制作的开放()例程获得的指针的glibc函数open()由dlsym()荷兰国际集团它,并调用它.
然而,上面提出的解决方案是动态解决方案.假设我想open()静态链接我自己的包装器.我该怎么办?我猜机制是一样的,但我也猜测用户定义open()和libc 之间会有一个符号冲突open().
请分享任何其他技术以实现相同的目标.
Giu*_*one 61
您可以使用提供的包装功能ld.来自man ld:
--wrap symbol使用符号包装函数.任何未定义的引用都symbol将被解析为__wrap_symbol.任何未定义的引用都
__real_symbol将被解析为symbol.
因此,您只需使用__wrap_包装函数的前缀以及__real_何时调用实际函数.一个简单的例子是:
malloc_wrapper.c:
#include <stdio.h>
void *__real_malloc (size_t);
/* This function wraps the real malloc */
void * __wrap_malloc (size_t size)
{
void *lptr = __real_malloc(size);
printf("Malloc: %lu bytes @%p\n", size, lptr);
return lptr;
}
Run Code Online (Sandbox Code Playgroud)
测试应用testapp.c:
#include <stdio.h>
#include <stdlib.h>
int main()
{
free(malloc(1024)); // malloc will resolve to __wrap_malloc
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后编译应用程序:
gcc -c malloc_wrapper.c
gcc -c testapp.c
gcc -Wl,-wrap,malloc testapp.o malloc_wrapper.o -o testapp
Run Code Online (Sandbox Code Playgroud)
生成的应用程序的输出将是:
$ ./testapp
Malloc: 1024 bytes @0x20d8010
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15693 次 |
| 最近记录: |