调用弱函数符号和强函数符号?

Calling both weak and strong function symbol?

本文关键字:函数 符号 调用      更新时间:2023-10-16

我有一个提供函数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?

我可以调用我的实现,因为它覆盖了库中的实现。但是如何在库中调用实现呢?我该如何参考它?

如果函数位于共享库中,则可以使用dlopen加载它们并从dlsym获取符号。然后,您可以为每个库中的函数使用不同的函数指针。

如果函数位于静态库中,则需要修改静态库以更改名称。这可以通过类似的东西来完成objcopy --prefix-symbols=foo_ foo.o.不确定在这种情况下是否可以直接在.a上执行此操作,您可能需要扩展存档。

添加前缀后,您需要修改任何头文件以使用宏或类似内容采用新名称。