Jay*_*rod 8 c linux function-interposition dlsym
我目前工作的一个项目,我需要跟踪的几个系统调用和低级别的功能,如使用mmap,brk,sbrk.到目前为止,我一直在使用函数插入来执行此操作:我编写了一个与我正在替换的函数同名的包装函数(mmap例如),并通过设置LD_PRELOAD环境变量将其加载到程序中.我通过我加载的指针调用实际函数dlsym.
不幸的是,我想要包装的函数之一在sbrk内部使用dlsym,因此当我尝试加载符号时程序崩溃.sbrk在Linux中不是系统调用,所以我不能简单地使用syscall它来间接调用它.
所以我的问题是,如何在不使用相同名称的包装函数的情况下调用库函数dlsym?是否有任何编译器技巧(使用gcc)让我参考原始函数?
Eva*_*ran 14
看看ld的选择--wrap symbol.从手册页:
--wrap symbol使用符号的包装函数.任何对符号的未定义引用都将解析为"
__wrap_symbol".任何对"__real_symbol"的未定义引用都将被解析为符号.这可用于为系统功能提供包装器.包装函数应该被称为"
__wrap_symbol".如果它想调用系统函数,它应该调用"__real_symbol".这是一个简单的例子:
void *
__wrap_malloc (size_t c)
{
printf ("malloc called with %zu\n", c);
return __real_malloc (c);
}
Run Code Online (Sandbox Code Playgroud)
如果使用--wrap malloc将其他代码与此文件链接,则所有对"
malloc"的调用都将调用函数"__wrap_malloc".中调用"__real_malloc"
"__wrap_malloc"将调用真正的"malloc"功能.您可能还希望提供"
__real_malloc"函数,这样没有--wrap选项的链接就会成功.如果这样做,则不应将"__real_malloc" 的定义放在与" "相同的文件中__wrap_malloc; 如果这样做,汇编器可以在链接器有机会将其包装到"malloc"之前解析调用.
另一种选择是可能看看ltrace的来源,它或多或少都做同样的事情:-P.
这是一个想法.您可以让LD_PRELOAD'ed库更改PLT条目以指向您的代码.sbrk()从技术上讲,这个功能仍然可以从您的代码中自行调用.