静态和动态链接同一个库

发布于 2024-07-30 04:59:43 字数 277 浏览 6 评论 0原文

我有一个程序静态链接到一个库 (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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

心安伴我暖 2024-08-06 04:59:43

是的,这个配置是可以的。

在回答有关系统如何知道如何使用符号的问题时,请记住所有链接都在构建时发生。 构建完成后,就不是“符号”的问题了,只是调用不同地址的不同函数而已。

构建 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文