如果我想克隆一个库并只更改一个函数,比如memcpy或memmove,并且有一个已经构建的可执行链接到它用于调试/探索,正确的方法是什么?
我猜我需要用我的修改重新编译整个库,但是有没有另一种方法来做到这一点?
我知道有像malloc钩子这样的东西,但这似乎是malloc的特殊情况。我很好奇valgrind和gdb是如何在另一个程序中做到这一点的,如果有人有这方面的资源的话。
对于那些好奇我为什么要这样做的人,目的是为了实验音乐。我这样做是为了使内存操作静音,因此memcpy/memmove将正常工作,但访问的数据也将发送到声卡。我知道还有其他方法可以做到这一点(我已经做了一些其他方法),但目前我有兴趣专注于memcpy/memmove,所以如果你能将你的答案限制在这个焦点上,我将不胜感激。
您可以使用LD_LIBRARY_PATH
使程序加载与通常不同的共享对象库。但是,如果您只想替换一个函数(或几个)而不是整个库,您可以使用LD_PRELOAD
使链接器(ld.so)在早期加载特定的共享对象,并且您的程序将使用其中的符号(函数),而不是在通常的位置查找它们。