so文件:从意图不同的另一个so文件调用函数

4
假设我的可执行文件MyApp对so文件boost-system.so进行动态链接。我进行了编译,一切都很好,我对boost-system功能的调用也按照预期工作。
一段时间后,我意识到需要链接到另一个so文件SomeAPI.so。但是,SomeAPI.so已经静态链接到了旧版本的buggy的boost-system.a,并且具有与“我的”boost-system完全相同的函数名称。现在,所有调用(来自MyApp和SomeAPI)都将转到SomeAPI静态链接的版本(或者我的boost-system版本,取决于链接顺序,这两种情况对我都不好)。
我希望MyApp的调用能够去到我的boost-system版本,而SomeAPI则使用其静态链接的boost-system.a函数。在Windows上,这就是它的工作方式。
我知道为什么会出现这种情况,但是否有其他解决方法,除了将“我的”boost-system名称空间重命名为本地名称?

你所描述的是广泛使用库的静态链接的主要陷阱。我也很想知道是否有一个干净的解决方案。你是否尝试在你的应用程序中静态链接boost? - Patrik Beck
1
我认为实现这一点的唯一方法就是重新构建SomeAPI.so,使其不与boost-system.so进行静态链接。 - Mats Petersson
1
我非常确定可以使用链接脚本来构建SomeAPI.so,以便不导出boost-system.a的符号(gcc之前添加了属性支持来实现相同的效果,但在您的设置中,链接器脚本可能更容易)。我认为,但不确定,即使链接了boost-system.so,也可以确保从boost-system.a中使用符号用于SomeAPI.so。 - AProgrammer
@PetrBudnik,如果我没记错的话,boost-system.so的符号只能通过dlsym获得,可能不是期望的方式。 - AProgrammer
您可以创建自己的SomeAPI.so,其中只包含虚拟函数。如果您使用C(而不是C ++),则所有函数都可以是“void xxx(void)”。该文件应仅包含“好”的函数,而不是您要从其他.so文件中获取的函数。然后,您链接到此SomeAPI.so文件并删除/重命名该文件。 - Martin Rosenau
显示剩余2条评论
1个回答

1
使用LD版本脚本来隐藏您不希望其他.so文件看到的函数名称。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接