我有一个提供函数func()的库:
return_type func(type arg);
有必要通过我自己的应用程序中的实现来覆盖它。可能是因为该库提供了一个弱符号func,而我的应用程序中的func符号却是一个强符号。 (这是我的理解。)
现在,我希望能够调用func的两种实现-库的实现和我自己的实现:
// The problem is that the names are the same.
func(); // Everything is OK, calling my implementation (in my application)
func(); // How can I call library's implementation now?
我可以调用我的实现,因为它会覆盖库中的实现。但是如何在库中调用实现?我该如何参考?
答案 0 :(得分:1)
如果函数在共享库中,则可以用dlopen
加载它们,并从dlsym
获取符号。然后,您可以为每个库中的函数使用不同的函数指针。
如果函数在静态库中,则需要修改静态库以更改名称。可以使用类似objcopy --prefix-symbols=foo_ foo.o
的方法来完成。不确定在这种情况下是否可以直接在.a
上完成操作,您可能需要扩展存档。
添加了前缀后,您将需要修改任何头文件,以使用宏或类似的名称来使用新名称。