当前位置: 首页 > 面试题库 >

没有dlsym的Linux中的函数插入

益光亮
2023-03-14
问题内容

我目前工作的一个项目,我需要跟踪的几个系统调用和类似的低层次功能的使用mmapbrksbrk。到目前为止,我一直在使用函数插入进行此操作:我编写了一个与要替换的函数同名的包装函数(mmap例如,),并通过设置LD_PRELOAD环境变量将其加载到程序中。我通过加载的指针调用实函数dlsym

不幸的是,我要包装的函数之一由sbrk内部使用dlsym,因此当我尝试加载符号时程序崩溃。sbrk在Linux中不是系统调用,因此我不能简单地使用syscall它来间接调用它。

所以我的问题是,如何在不使用同名包装函数的情况下调用库函数dlsym?是否有任何编译器技巧(使用gcc)可以让我引用原始功能?


问题答案:

参见ld的option --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);
}

如果您使用–wrap malloc将其他代码与此文件链接,则所有对“ malloc”的调用都会调用函数“ __wrap_malloc”。在
__wrap_malloc”中对“ __real_malloc”的调用将调用真实的“ malloc”函数。

您可能还希望提供一个“ __real_malloc”函数,以便不带–wrap选项的链接将成功。如果这样做,则不应将“
__real_malloc” 的定义与“ ”放在同一文件中__wrap_malloc;如果您这样做,则汇编程序可能会在链接程序有机会将其包装到“
malloc”之前解决该调用。

另一个选择是可能查看ltrace的源,或多或少地执行相同的操作:-P。

这是个主意。您可以让您LD_PRELOAD的ed库将PLT条目更改为指向您的代码。sbrk()从技术上来说,这仍然可以从您的代码天然地调用该函数。



 类似资料:
  • 问题内容: 我想在Linux中打开不带X的OpenGL上下文。有什么办法吗? 我知道集成英特尔图形卡硬件是可能的,尽管大多数人的系统中都装有Nvidia卡。我想要一个适用于Nvidia卡的解决方案。 如果除了通过集成的Intel硬件没有别的方法,我想知道如何使用这些硬件是可以的。 X11协议本身太大且太复杂。它提供的鼠标/键盘/平板电脑输入多路复用对于现代程序来说太过淡了。我认为这是阻止Linux

  • 我正在尝试设置共享内存段以容纳字符串数组。例如,以下数组 string Example[]={“This is”,“An Example”,“of Strings”}; 然后,我尝试调用shmget,以便获得预留适当数量的os共享内存。 通读手册会指出shmget()返回一个“shmid”。同样,什么是shmid,是int、字符串、指针还是某种特殊类型,这是我标识共享内存段的方式吗?另外,如果sh

  • 问题内容: 在这个问题中,我有一个使用Python生成器的无尽序列。但是相同的代码在Python3中不起作用,因为似乎没有功能。该功能的等效功能是什么? 问题答案: 在Python 3中,使用代替。 内置函数还可以在Python 2.6或更高版本中使用。

  • 我在尝试创建一个函数时遇到了麻烦。我想把数字转换成一周中指定的日子。例如:1='星期一',2='星期二',3='星期三',4='星期四',5='星期五',6='星期六',0='星期日' 下面是我编写函数的尝试,但我得到了一个错误,我还认为一定有一种方法可以循环它。我只是不知道怎么做。

  • 问题内容: 只有最后一部分(我的意思是我仅对此有问题) 当我编译它时,我没有合适的构造函数错误。为什么是这样??顺便说一下,Spirtokouto类的目的是要增加一个计数值(权重)。我可以将一个班级扩展到> 1个班级吗? 问题答案: Box类有两个构造函数:,但它们都不带四个参数,而您要用四个参数来调用它,因此请更改此参数: 对此: 调用必须首先在构造函数中进行。 我可以将一个班级扩展到 > 1个

  • 本文向大家介绍Python 没有main函数的原因,包括了Python 没有main函数的原因的使用技巧和注意事项,需要的朋友参考一下 毫无疑问 Python 中没有所谓的 main 入口函数,但是网上经常看到一些文章提“Python 的 main 函数”、“建议写 main 函数”…… 有些人是知情的,他的意图可能是模仿那些正宗的 main 函数,但还有不少人明显是被误导了(或自己误解了),就写