在链接时提供不同的库/功能

时间:2011-04-14 15:45:18

标签: c debugging dynamic-linking c-libraries

如果我想克隆一个库并只更改一个函数,比如memcpy或memmove,并且为了调试/探索目的而有一个已经构建的可执行文件链接,那么这样做的正确方法是什么?

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

我对mac和linux解决方案感兴趣。在linux上我之前使用过LD_LIBRARY_PATH - 这是我需要做的所有事情,除了库名相同吗?我将如何在Mac上执行此操作?

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

1 个答案:

答案 0 :(得分:1)

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