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

时间:2019-05-07 09:45:49

标签: c++ linux linker shared-libraries

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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