静态和动态链接同一个库
我有一个程序静态链接到一个库 (libA.2.0.a
),也动态链接到另一个库 (libB.so
)。 libB.so
还动态链接到旧版本的 libA (libA.1.0.so
)。
这个配置可以吗? 如果是这样,系统如何知道将 libA.2.0.a
中的符号用于我的程序,并将 libA.1.0.so
中的符号用于 libB .so
?
I have a program that's statically linking to a library (libA.2.0.a
) and also dynamically links to another library (libB.so
). libB.so
also dynamically links to an older version of libA (libA.1.0.so
).
Is this configuration possible? And if so, how does the system know to use the symbols from libA.2.0.a
for my program and the symbols from libA.1.0.so
for libB.so
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
是的,这个配置是可以的。
在回答有关系统如何知道如何使用符号的问题时,请记住所有链接都在构建时发生。 构建完成后,就不是“符号”的问题了,只是调用不同地址的不同函数而已。
构建 libB.so 时,它会设置到 libA.1.0.so 的链接。 它不知道也不关心使用它的其他应用程序会做什么,它只知道如何映射自己的函数调用。
构建应用程序本身时,应用程序链接到 libB.so。 应用程序完全不知道 libB.so 调用什么。 该应用程序还静态链接到 libB.so 不关心的库。
一个问题是:如果 libA 使用静态变量,则 libB.so 可以访问一组静态变量,而应用程序可以访问一组不同的、独立的静态变量。
Yes, this configuration is possible.
In answer to your question as to how the system knows how to use the symbols, remember that all of the links happen at build time. After it's been built, it isn't a question of "symbols", just calls to various functions at various addresses.
When building libB.so, it sets up it's links to libA.1.0.so. It does not know or care what other applications that use it will do, it just knows how to map its own function calls.
When building the application itself, the application links to libB.so. Whatever libB.so calls is completely unknown to the application. The application also statically links to a library, which libB.so does not care about.
One gotcha: if libA uses static variables, there will be one set of statics accessible to libB.so, and a different, independent set of statics accessible to the application.