con*_*roy 6 c++ linux linker gcc
我有一个程序,通过从一些plugin_name.so动态加载一个函数来实现一个插件系统(像往常一样).
但反过来我有一个静态的"帮助器"库(让我们称之为helper.a),它的功能既可以从主程序中使用,也可以在插件中使用main函数.它们不必以任何方式互操作,它们只是文本操作等的辅助函数.
这个程序一旦启动就无法重新加载或重新启动,这就是为什么我期望从插件中获得新的"帮助"功能,而不是主程序.
所以我的questin是..是否有可能强制.so中的这个"插件功能代码"使用(静态链接?)一个不同的(也许是更新的)"helper"版本而不是主程序?
怎么可以这样做?也许通过静态链接或以其他方式将helper.a添加到plugin_name.so?
Nick Meyer的答案在Windows和AIX上是正确的,但默认情况下在其他所有UNIX平台上都不太可能是正确的.
在大多数UNIX平台上,运行时加载器维护一个单一的所有符号的名称空间,因此,如果你定义foo_helper在a.out中,还plugin.so,然后调用foo_helper无论从,到运行时加载器(通常是从可见的第一个定义a.out),默认情况下使用对于这两个电话.
此外,由于foo_helper可能无法导出a.out(因此可能对运行时加载程序不可见),因此图片很复杂,除非您使用-rdynamicflag或其他一些共享库引用它.换句话说,事情可能看起来像尼克描述的那样起作用,然后你将一个共享库添加到a.out链接行,并且它们不再以这种方式工作.
在ELF平台(例如Linux)上,您可以很好地控制符号可见性和绑定.见的描述-fvisibility=hidden,并-rdynamic在GCC手册页,并-Bsymbolic在连接手册页.
大多数其他UNIX平台也有一些方法来控制符号绑定,但这必然是特定于平台的.