代码之家  ›  专栏  ›  技术社区  ›  walkerlala

编译/链接时强制将指定函数链接到指定库

  •  3
  • walkerlala  · 技术社区  · 7 年前

    open() 系统调用以添加一些功能,以便在用户使用 打开() 系统调用,我可以收集一些数据。基本上,我在做这样的事情:

    int open(int fd, int flags, ...)  //(1)
    {
        // add some functionalities here
    
        return open(...); // (2), return the original open system call
    }
    

    显然,这行不通,因为它会调用无限循环……所以我想知道是否可以强制链接器将某些函数链接到某个指定的动态库,这样它就不会导致无限循环。在上面的示例中,将(2)处的“open()”系统调用链接到标准库将是完美的。

    至于现在,因为我将LD\U预加载设置为:

    export LD_PRELOAD=/path/to/my_open.so
    

    打开() 打开() 给我的 my_open.so .这对我来说也是一样的 :当链接器尝试链接 在(2),它还将尝试将其链接到我的 打开()

    2 回复  |  直到 7 年前
        1
  •  2
  •   alinsoar    7 年前

    链接动态符号的详细算法见 man ld.so .

    open@@VERSION 。这有助于同时保留不同版本的libc。也许你想保留自己的图书馆 LD_LIBRARY_PATH

    See here for details .

        2
  •  1
  •   Florian Weimer    7 年前

    open 使用 dlsym (RTLD_NEXT, "open") 打开 LD_PRELOAD 图书馆

    fakeroot cwrap ,看看他们是如何处理的。