代码之家  ›  专栏  ›  技术社区  ›  Stefano Borini

如何在Linux上重新实现(或包装)syscall函数?

  •  31
  • Stefano Borini  · 技术社区  · 14 年前

    One way to do this is to use LD_PRELOAD 加载接管open()入口点的(用户创建的)共享对象库。

    然后,用户生成open()例程获取指向glibc函数的指针 open() dlsym()

    打开() 静态包装。我该怎么做?我猜机制是一样的,但我也猜在用户定义的 打开() 还有libc 打开()

    请分享任何其他技巧来达到同样的目的。

    2 回复  |  直到 7 年前
        1
  •  61
  •   Giuseppe Cardone    14 年前

    您可以使用 ld man ld :

    --wrap symbol 对符号使用包装函数。任何未定义的引用 symbol 将决定 __wrap_symbol

    任何未定义的引用 __real_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;
    }
    

    testapp.c :

    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        free(malloc(1024)); // malloc will resolve to __wrap_malloc
        return 0;
    }
    

    然后编译应用程序:

    gcc -c malloc_wrapper.c
    gcc -c testapp.c
    gcc -Wl,-wrap,malloc testapp.o malloc_wrapper.o -o testapp
    

    结果应用程序的输出将是:

    $ ./testapp
    Malloc: 1024 bytes @0x20d8010
    
        2
  •  3
  •   Paul Rubel    14 年前

    符号是由链接器按照您在命令行中列出它们的顺序来解析的,因此如果您在标准库之前列出了您的库,那么您就很谨慎了。对于gcc,您需要指定

    gcc <BLAH> -nodefaultlibs <BLAH BLAH> -lYOUR_LIB <OTHER_LIBS>
    

    这样你的图书馆将首先被搜索和发现。