问题标签 [dlopen]

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 投票
1 回答
209 浏览

c++ - 尝试加载自定义 mysql 插件时未定义的引用 - 如何调试?

我正在尝试编写自己的 MySQL 存储引擎,它使用键值存储作为后端。

我现在写了我的第一个版本,它实现了强制部分,我能够编译、链接和安装我的 MySQL 源实例。这样做之后,我尝试在 mysql 控制台中使用以下命令加载我的新插件:

我得到的错误如下:

现在我不知道如何调试这个问题。键值存储中的客户端库使用 -std=c++0x 编译器标志,我开始认为这可能是问题的一部分。但是当我检查 ldd 时,我的存储引擎链接到与 mysql 提供的其他引擎相同的 libstdc++ 版本,这些引擎可以毫无问题地加载。

如何找出这个问题来自哪里有什么技巧吗?

编辑:找不到的符号是

这看起来像是来自 libstdc++ (STL) 的东西,可能来自我对 std::set 的使用。这怎么可能发生?

0 投票
2 回答
1013 浏览

c++ - Solaris 进程如何读取自己的符号表?

我有一个 Solaris 进程,它是一个 C++ 应用程序,由ld几个.so库加载。该应用程序有一个函数,它在调用函数中获取返回地址,然后尝试确定所述调用函数的名称。

如果我使用dladdr(3)它,它并不总是将我期望看到的内容放在 Dl_info::dli_sname 中。看起来它返回的函数名称在指针值下方或指针值处不最近。如果我获取指针值并查看 的输出nm,我可以将该值与我期望的确切函数进行匹配。

我想知道是否有一种方法可以检索进程的符号映射并让它在不使用dladdr(3). 我特别有兴趣获得一个符号映射,不仅适用于可执行文件本身,还适用于.so它已加载的所有库。

我在 Solaris10/SPARC 上运行,我使用的是 gcc 4.2.x。

谢谢!

0 投票
2 回答
868 浏览

c - dlopen:是否可以捕获未解析的符号,在它们发生时“手动”解析它们?

是否可以在它们发生时捕获未解析的符号引用,以便调用函数以尝试根据需要解析符号?或者是否可以在运行时将新符号添加到动态符号表中,而无需创建库文件并对其进行 dlopen 操作?我在 GNU/Linux 上,使用 GCC。(对其他 Unix 的可移植性会很好,但不是关键问题。)

提前致谢!

编辑:我应该更详细地说明我正在尝试做的事情。我想为一种编程语言编写一个解释器,它预计将支持编译(dlopen'ed)和解释模块。我希望从编译模块到其他地方定义的函数的调用由链接器解析,以避免在每次调用时查找函数,但对解释代码的调用将无法解析。我想捕获这些调用,以便在需要时调用适当的解释函数(或在函数不存在时发出错误信号)。

0 投票
1 回答
533 浏览

unix - dlopen 和共享对象“指针”

是否可以成功调用dlopen()“指向”另一个共享对象的共享对象?例如,我想动态打开库/usr/lib/libpanel.so。然而,它不是一个真正的图书馆。相反,它“指向” /usr/lib/libpanelw.so

随着dlopen()我得到一个file too short错误。有什么方法可以成功加载这些类型的库?

(额外问题:这类库的实际术语是什么?)

0 投票
2 回答
136 浏览

c++ - 使用来自共享对象的应用程序对象

我现在有点困惑。昨天我有未定义的符号,即使我将 -rdynamic 与 g++ 一起使用。但现在我没有任何错误,这更令人不安。

为了解释一下我的情况,我想做一些像共享对象这样的插件。我还没有决定哪种方法最好。

A)我的共享对象都有一个名为 register 的函数,该函数将使用参数调用。这将是一个插件管理器。

B)我的共享对象将定义一个类,并将在加载时创建该类的实例。在该类的构造函数中,它将尝试从应用程序中获取静态单例并自动注册自己。

据我所知,到目前为止,我的第一次尝试并不是那么好。

主文件

主文件

二.cpp

在该示例中, S::shared 是我要共享的静态对象。对于这个简单的测试,我只使用一个 int 但在未来它将是一个类的实例。

我对案例 A) 的唯一尝试是段错误......我真的不知道我错过了什么。

//到目前为止的结果(今天)

0 投票
2 回答
766 浏览

c - 当我有 20.0 时,highgui 抱怨它需要 >=17.0.0

这是一种丑陋的,但我被困住了,所以它是这样的:

我正在编写一个使用opencv(highgui和其他部分)并最终由ffmpeg(libavfilter)加载的动态库(此后称为'mylib.dylib')。该库编译得很好。但是当我尝试从 ffmpeg 中 dlopen() dylib 时,我收到以下错误:

但是,当我运行otool -L /usr/local/lib/libpng15.15.dylib时, 我得到以下信息:

上次我查了一下,20.0.0 比 17.0.0 晚,这是 highgui 说的它需要的。

我想这可能是一个架构问题(我在运行 Lion 的 Mac 上,所以我遇到了很多关于 i386/x86_64 的问题),但是在所有库上运行“文件”显示一切(highgui、libpng、 mylib) 是Mach-O 64 位动态链接共享库 x86_64

我想也许有一些其他版本的 libpng 隐藏在我的系统某处,但 dlopen 错误特别指向 /usr/local/lib/libpng15.15.dylib

很明显,我在这里遗漏了一些东西——诚然,我不是这些动态库如何链接的专家。因此,如果我忘记包含一些相关信息,请原谅。

更新 我忘了提到——当我通过 XCode 运行 ffmpeg(没有 dlopen 错误)时,lib 工作正常,这让我相信它可能与 XCode 设置的环境变量有关,而我不是。

谢谢!

解决方案 1. 别傻我使用的是 MAMP,因为我通过 php 脚本调用 ffmpeg,所以它使用了自己的一组 dylib,其中(惊喜)包括 libpng 16.0.0

0 投票
2 回答
2670 浏览

c++ - Ld 神奇地覆盖了静态链接的符号

几天来,我们正在处理非常奇怪的问题。

我什至无法理解它是如何发生的——当第三方(MATLAB)程序使用我们的共享库时,它会以某种方式用它自己的符号覆盖我们的一些符号(准确地说是增强)。这些符号是静态链接的并且(!!)本地的。

这是交易 - 我们使用 boost 1.47,MATLAB 有 boost 1.40。目前,库调用 segfaults 从我们的库调用到他们的 boost(正则表达式)。

所以,这就是魔法:

  • 我们没有库依赖,ldd:
  • 没有 Cxx 符号(我们的公共符号是 POC C 以实现二进制兼容性)从我们的库 nm 中导出:
  • 尽管如此,它还是利用了他们的推动力。如何?Stacktrace(路径切割):

众所周知,MATLAB 仅使用 RTLD_NOW 标志进行 dlopen。

各位,请跟我一起思考。现在我迫切地不想解决这个问题,而是简单地了解 ld&elf 的行为。

编辑:附加的小问题:我是如何理解的,没有特殊的链接器选项,linux .so 库中的符号永远不会通过地址链接?所以即使是静态链接的本地符号也在运行时解析?

0 投票
2 回答
1022 浏览

dlopen - mac 上的 RTLD_FIRST 是否可以在 Linux 上完成 RTLD_DEEP_BIND 的工作?

我对 Linux 上的 RTLD_DEEP_BIND 的理解是,如果您的主程序中有一个函数 A(),并且在动态链接库(称为 lib)中有两个函数 A() 和 B(),其中 B 定义为:

然后对 B() 的调用总是会从库中调用 A 。这是 RTLD_FIRST 在 Mac 上所做的工作吗?抱歉 - 我对文档感到困惑。

0 投票
2 回答
1489 浏览

c++ - 静态与动态库

我已阅读有关静态和动态库的信息。我的问题有点具体

dlopen dlclose:

这是动态链接库的行为。

我的问题是如果我链接库 libUtlities

当我运行 EXE 时,libUtlities 将在我第一次使用那里的功能之前加载到内存中

1.那么是静态链接还是动态链接。?

0 投票
1 回答
457 浏览

macos - SIMBL 插件无法加载框架

在控制台上,我收到以下错误:

该文件FScriptAnywhere.bundle/Contents/Frameworks/FScript.framework/Versions/A/FScript存在。因此,我不明白错误/问题。

任何的想法?