代码之家  ›  专栏  ›  技术社区  ›  Jay Conrod

无dlsym的Linux中的函数插入

  •  8
  • Jay Conrod  · 技术社区  · 15 年前

    我目前正在做一个项目,我需要跟踪几个系统调用和低级功能的使用,比如 mmap , brk , sbrk . 到目前为止,我一直在使用函数插入来完成这项工作:我编写了一个与要替换的函数同名的包装函数( MMAP 例如),我通过设置 LD_PRELOAD 环境变量。我通过一个我加载的指针调用实数函数 dlsym .

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

    所以我的问题是,如何不使用 DLSIM ?有没有编译器技巧(使用gcc)让我引用原始函数?

    4 回复  |  直到 13 年前
        1
  •  14
  •   Evan Teran Benoît    13 年前

    见LD的选择 --wrap 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 “相反。这个 呼叫中的“uuu real_malloc”
    马蹄莲 “会说真的 “ 马洛克 “函数。

    您可能希望提供 “ __real_malloc “功能也一样,所以 没有--wrap选项的链接 会成功的。如果你这样做,你 不应该把定义 “ 阿尔法 “在同一个文件中 “ 马蹄莲 “如果你这样做,那么 汇编程序可以在 链接器有机会将其包装到 “马洛克”。

    另一种选择是可能查看ltrace的源代码,它或多或少地做了相同的事情:-p。

    不过,这里有个主意。你可以把你的 LD_PRELOAD 'ed library更改plt条目以指向您的代码。这个你技术上 sbrk() 函数仍然可以自然地从代码中调用。

        2
  •  2
  •   Alex Brown    15 年前

    您可以使用以下工具来不引人注意地检查函数调用:

    • GDB
    • 微量元素
    • 系统抽头

    这些工具允许监视器程序在调用函数时通知您,并允许您询问参数。

    主要区别在于:

    • GDB是交互式的,但功能强大
    • ltrace易于使用,但只能打印函数名
    • SystemTap不是交互式的,但它可以非常快,而且功能强大。
        3
  •  0
  •       15 年前

    如果您使用glibc运行一个主机系统,libc有一些内部的后端到运行时动态链接器,我以前使用过它。如果我没记错的话,我想它叫做“libc-dlsym”。(要检查,“$readelf-s/usr/lib/libc.a_grep dlsym”应该有帮助。)将其声明为具有与dlsym相同参数和返回值的外部链接函数,并使用它包装dlsym本身。

        4
  •  0
  •   Patrick Schlüter    13 年前

    truss 不在你的系统上工作?它在Solaris上非常适合这种情况。

    推荐文章