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

无dlsym的Linux函数插入

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

    我目前正在进行一个项目,需要跟踪几个系统调用和低级函数的使用情况,例如 mmap , brk , sbrk 内存映射 LD_PRELOAD dlsym .

    不幸的是,我想包装的一个函数, ,所以当我尝试加载符号时,程序崩溃了。 sbrk 不是Linux中的系统调用,所以我不能简单地使用 syscall 间接地称呼它。

    dlsym

    4 回复  |  直到 17 年前
        1
  •  14
  •   Evan Teran    15 年前

    参见ld选项 --wrap symbol

    __wrap_symbol “.任何未定义 参考“ __real_symbol 被解析为符号。

    这可用于提供 系统功能的包装器。这 " “.如果它想打电话 " ".

    下面是一个简单的例子:

    void *
    __wrap_malloc (size_t c)
    {
        printf ("malloc called with %zu\n", c);
        return __real_malloc (c);
    }
    

    如果你将其他代码与此链接 呼叫“ malloc “将呼叫 __wrap_malloc “相反 在中调用“__real_malloc”
    " __包装_分配 " 内存分配 “功能。

    您可能希望提供 " __real_malloc 会成功的。如果你这样做,你 不应该把定义 " __real_malloc " __包装_分配 汇编器可能会在之前解析该调用 “马洛克”。

    不过,这里有一个想法。你可以有你的 LD_PRELOAD 'ed库更改PLT条目以指向您的代码。从技术上讲,这就是你 sbrk() 函数仍然可以从代码中自然调用。

        2
  •  2
  •   Alex Brown    17 年前

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

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

    主要区别在于:

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

    如果你用glibc运行一个主机系统,libc有一些我之前使用的运行时动态链接器的内部后端。如果我没记错的话,我认为它被称为“__libc_dlsym”。(要检查,“$readelf-s/usr/lib/libc.a|grepdlsym”应该会有所帮助。)将其声明为具有与dlsym相同的参数和返回值的外部链接函数,并使用它来包装dlsym本身。

        4
  •  0
  •   Patrick Schlüter    15 年前

    是否 truss

    推荐文章