我有一个应用程序(A),它调用第三方共享库(C)。我想编写一个自己的库(B),拦截A对C的调用,在某些情况下用自己的代码替换调用,在某些情况下执行一些额外的处理,然后调用C中匹配的函数,有些情况下则直接将调用转发给C。
该应用程序是开源的,因此我可以更改每个调用站点以调用B中的同名函数,然后在需要时调用相应的C函数,但这将是很多工作,并且会使合并上游更改变得困难。我没有第三方库的源代码。如果它是仅头文件,则可以使用命名空间来实现此目标,但我不确定当我自己的库和第三方库似乎都需要定义完全相同的符号时该怎么做。
这种方法是否可行?我主要针对OS X,但希望它也适用于Linux,最终也适用于Windows。
该应用程序是开源的,因此我可以更改每个调用站点以调用B中的同名函数,然后在需要时调用相应的C函数,但这将是很多工作,并且会使合并上游更改变得困难。我没有第三方库的源代码。如果它是仅头文件,则可以使用命名空间来实现此目标,但我不确定当我自己的库和第三方库似乎都需要定义完全相同的符号时该怎么做。
这种方法是否可行?我主要针对OS X,但希望它也适用于Linux,最终也适用于Windows。
--wrap
选项,这是实现你想要的一种方式。从ld参考手册中描述的--wrap symbol
:"为symbol使用包装器函数。对symbol的任何未定义引用都将解析为__wrap_symbol。对__real_symbol的任何未定义引用都将解析为symbol。这可用于为系统函数提供包装器。" - kaylum#define
来重定向库函数调用?例如#define strchr mystrchr
。 - Weather Vane