【问题标题】:Supplying different library/function at link time在链接时提供不同的库/函数
【发布时间】:2011-08-05 16:06:36
【问题描述】:

如果我想克隆一个库并只更改一个函数,比如 memcpy 或 memmove,并有一个已经构建的可执行链接到它以进行调试/探索,那么正确的方法是什么?

我猜我需要用我的修改重新编译整个库,但是还有其他方法吗?
我知道有诸如 malloc 钩子之类的东西,但这似乎是 malloc 的一个特例。 我很好奇 valgrind 和 gdb 如何在另一个程序中执行此操作的具体细节,如果有人有相关资源的话。

我对 mac 和 linux 解决方案感兴趣。在 linux 上,我之前使用过 LD_LIBRARY_PATH - 除了库名称相同之外,我还需要做这一切吗?我将如何在 mac 上执行此操作?

对于那些好奇我为什么要这样做的人,目的是为了实验音乐。我这样做是为了处理内存操作,因此 memcpy/memmove 将正常工作,但访问的数据也将发送到声卡。我知道还有其他方法可以做到这一点(我已经做了一些其他方法),但目前我对专注于 memcpy/memmove 很感兴趣,所以如果你能将你的答案限制在这个焦点上,我将不胜感激。

【问题讨论】:

    标签: c debugging dynamic-linking c-libraries


    【解决方案1】:

    您可以使用LD_LIBRARY_PATH 使程序加载与通常不同的共享对象库。但是,如果您只想替换一个(或几个)函数而不是整个库,则可以使用LD_PRELOAD 使链接器(ld.so)尽早加载特定的共享对象,您的程序将使用符号(函数)在那里而不是在通常的地方寻找它们。

    【讨论】:

    • 酷。只要我的签名匹配一切都可以吗?
    • 要清楚这些是危险的水域,也许不是“一切”都会“正常工作”,但是,只要签名匹配,就有希望它会按您的预期工作,只是要小心因为显然有些库可能不喜欢替换它们的函数(如果你的函数有不同的副作用或其他)。至于链接器是如何找到函数的,值得注意的是它只是通过(损坏的)名称,而不依赖于类型签名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多