我有一个调用第三方共享库(C)的应用程序(A)。我想编写一个自己的(B)库,以拦截从A到C的调用,在某些情况下用我自己的代码替换这些调用,在某些情况下进行一些额外的处理,然后在C中调用匹配函数,然后在在某些情况下,只需将调用直接转发给C。
该应用程序是开源的,因此我可以更改每个调用站点,以在B中调用一个类似名称的函数,然后在需要时调用C中的相应函数,但这将需要很多工作,并且需要合并上游的更改。应用困难。我没有第三方库的源代码。如果它仅是标题,那么我可以使用名称空间来实现此目的,但是当我的库和第三方库似乎都需要定义完全相同的符号时,我不确定如何去实现它。
有什么办法可以使这项工作成功吗?我主要针对OS X,但希望它能在linux上使用,然后在Windows上也能使用。
您可以使用LD_PRELOAD指向您自己的共享库。使用LD_PRELOAD,将调用共享库中的所有函数,而不是其他库中具有相同名称的函数。
如果要注入代码然后调用原始函数,则需要调用dlsym从第三方库中获取原始函数。
这里有一些示例:https : //rafalcieslak.wordpress.com/2013/04/02/dynamic-linker-tricks-using-ld_preload-to-cheat-inject-features-and-investigate-programs/