【问题标题】:Calling both weak and strong function symbol?调用弱函数和强函数符号?
【发布时间】:2019-09-24 22:51:09
【问题描述】:

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

我可以调用我的实现,因为它覆盖了库中的实现。但是我怎样才能调用库中的实现呢?怎么参考?

【问题讨论】:

  • 您应该查看 GNU ld 的 -wrap 选项,看看它是否可以帮助您

标签: c++ linux linker shared-libraries


【解决方案1】:

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

如果函数在静态库中,则需要修改静态库以更改名称。这可以通过objcopy --prefix-symbols=foo_ foo.o 之类的方式来完成。不确定这是否可以直接在 .a 上完成,在这种情况下,您可能需要展开存档。

添加前缀后,您将需要修改任何头文件以使用宏或类似的东西取新名称。

【讨论】:

  • 感谢您的回答!我有一个库和一个使用该库的应用程序。而且我无法修改库。我已经用我自己的函数(来自应用程序)覆盖了库的函数。但我也需要调用库的实现。
  • 是静态库还是共享库?
  • 该库有两种变体——静态和共享。所以我需要一个适用于静态库和共享库的解决方案。
猜你喜欢
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多