问题标签 [shared-libraries]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
8386 浏览

linux - 加载多个不同版本的共享库

我在 Linux 上有一个可执行文件,它加载libfoo.so.1(即 a SONAME)作为其依赖项之一(通过另一个共享库)。它还链接到另一个系统库,而后者又链接到系统版本libfoo.so.2. 结果,两者 libfoo.so.1都在执行期间被加载,并且libfoo.so.2本应从版本 1 的库中调用函数的代码最终会从版本 2 的较新系统库中调用(二进制不兼容)函数,因为某些符号保持不变。结果通常是堆栈粉碎和随后的段错误。

现在,链接到旧版本的库是一个封闭源代码的第三方库,我无法控制libfoo它编译的版本。假设剩下的唯一选择是重建一堆当前链接到的系统库libfoo.so.2以链接到libfoo.so.1.

有没有办法避免用链接到旧的本地副本替换系统库libfoo?我可以加载这两个库并让代码调用正确版本的符号吗?所以我需要一些特殊的符号级版本控制?

0 投票
1 回答
839 浏览

c++ - 如何指定库 X 必须静态链接?

我有一个与多个库链接的软件。它们都存在于动态 (.so) 和静态 (.a) 版本中。默认情况下,当使用 g++ 时,它会选择库的动态版本,这对我来说很好。

但是,其中之一绝对需要静态链接。我考虑过使用-static但后来它对所有这些都使用了静态版本,这不是我想要的。

如何指定库 X 必须静态链接,而其他库继续链接到 libs 的共享版本?

0 投票
3 回答
574 浏览

windows - 如何控制 Windows DLL 从应用程序导入哪些符号?

我正在尝试使用 MSVC 6(复古!)在 Windows 上构建一个共享库(DLL),我有一个特殊的链接问题需要解决。我的共享库必须访问一些全局状态,由加载应用程序控制。

概括地说,我所拥有的是:

应用程序.c:

shared_library.c:

更新- 我忘记了__declspec(dllexport) int __stdcall部分,但它在真实代码中)

如何设置 shared_library.dll 以便导出shared_library_method和导入use_private_value

请记住,A)我通常是一个 unix 程序员,并且 B)我在没有 Visual Studio 的情况下这样做;我们的自动化构建基础架构使用 makefile 驱动 MSVC。如果我省略了一些可以更容易回答问题的内容,请发表评论,我会尽快更新。

0 投票
3 回答
1216 浏览

shared-libraries - 如何使用 pkglib_LTLIBRARIES = test.la 仅构建 *.so

我正在使用自动工具来构建共享对象。

pkglib_LTLIBRARIES在我的 Makefile.am 中使用会导致构建libtest.laAND 。libtest.so

希望它构建/安装libtest.so

这可能吗?

0 投票
3 回答
430 浏览

unix - Unix 问题:自动识别本地安装库的路径

我在 Fedora Linux 机器上工作。

我在我的主目录下本地安装了大量的二进制文件和库。

我想设置我的系统,以便在那里安装软件的功能与(对我而言)相同,就好像 root 用户安装它时没有前缀一样。

我可以通过将该目录添加到我的 PATH 变量中来运行安装在 ~/local/bin 中的二进制文件,但是如何链接到 ~/local/lib 和 ~/local/lib64 中的库呢?

是否有类似于 LD_LIBRARY_PATH 变量但在编译而不是运行时找到库的东西?我不想担心通过 L~/local/lib 或通过 ./configure 脚本中的标志将路径显式传递给编译器。

0 投票
6 回答
79383 浏览

linux - 确定 Linux 中二进制文件的目标 ISA 扩展名(库或可执行文件)

我们有一个与在带有 Via C3 处理器的 Advantech POS 板上的(相当旧的)FC3 下运行的 Java 应用程序相关的问题。Java 应用程序有几个通过 JNI 访问的已编译共享库。

Via C3 处理器应该与 i686 兼容。前段时间在具有相同处理器的 MiniItx 板上安装 Ubuntu 6.10 后,我发现前面的说法并非 100% 正确。由于缺少C3处理器中设置的i686的一些特定和可选指令,Ubuntu内核在启动时挂起。在使用 i686 优化时,GCC 编译器默认使用 i686 集的 C3 实现中缺少的这些指令。在这种情况下,解决方案是使用 i386 编译版本的 Ubuntu 发行版。

Java 应用程序的基本问题是 FC3 发行版是通过从另一台 PC(这次是 Intel P4)的 HD 映像克隆而安装在 HD 上的。之后,该发行版需要进行一些黑客攻击才能使其运行,例如用 i386 编译版本替换一些软件包(例如内核)。

问题是工作一段时间后系统完全挂起,没有任何痕迹。我担心某些 i686 代码会留在系统中的某个位置,并且可以随时随机执行(例如从挂起模式恢复后或类似的情况)。

我的问题是:

  • 是否有任何工具或方法可以找出二进制文件(可执行文件或库)需要哪些特定架构扩展?file没有提供足够的信息。
0 投票
6 回答
69561 浏览

tomcat - 如果它们位于两个 Web 应用程序中,Tomcat 是否会将相同的库文件两次加载到内存中?

我在tomcat/webapps文件夹下有两个应用程序。

两个应用程序共享相同的库。例如存储在tomcat/webapps/App1/WEB-INF/lib.

两个库是否都在内存中加载了两次?

我应该把这些共享库放进去tomcat/server/lib吗?

0 投票
3 回答
3750 浏览

linux - 是否有任何工具可以检查交叉编译的 .so 文件中的符号?

我有一个应用程序在启动时将 .so 文件加载为插件,使用dlopen()

构建环境在 x86 硬件上运行,但应用程序正在针对另一个平台进行交叉编译。

如果我可以(作为自动构建过程的一部分)进行检查以确保 .so 文件和应用程序的组合中没有任何未解析的符号,而无需实际部署应用程序,那就太好了。

在我编写脚本来使用 的输出测试符号之前nm,我想知道是否有人知道已经这样做的实用程序?


编辑1:稍微改变了描述——我不只是试图测试.so中的符号,而是结合几个.so和应用程序本身——即。在应用程序加载所有 .so 之后,是否还会有未解析的符号。

正如答案中所建议的那样(感谢 Martin v. Löwis 和 tgamblin),nm将很容易识别单个文件中丢失的符号,但不容易识别在其他加载的模块之一中已解决哪些符号。

0 投票
3 回答
1843 浏览

c++ - 在 C++ 中的 Shared Lib (so) 内的共享内存中创建一个对象

是否可以在链接到此代码的每个人之间共享一个“上帝”实例,以放置在共享对象中?

假设我在每个函数的开头都进行了锁同步,并且考虑到上帝本身可以 new/malloc 其他东西,但那些东西永远不会自己返回给调用者(上帝 malloc 仅供内部使用),什么是最简单的这样做的方式,如果可能的话。

如何将其扩展到链接到此共享库的任意数量的程序?

0 投票
2 回答
8375 浏览

gcc - 从 LD 隐藏共享对象中的符号

我有两个第三方库偶尔会导出相同的符号名称。加载可执行文件时,ld通常会选择错误的文件,结果导致我崩溃。我不能对这些库的内容做太多,所以可能有一种方法可以指导ld如何找到正确的实施方式?

操作系统 - Solaris 10,我的程序是由 autoconf/autotools/gcc 构建的,冲突的库是libclntsh(Oracle 驱动程序的一部分)和 OpenLDAP。不幸的是,我不能使用 Oracle 的 LDAP 客户端实现——它缺少 OpenLDAP 的许多功能。

编辑:链接如下:libclntsh.so->A.so->MAIN<-B.so<-libldap_r.so