问题标签 [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 回答
118 浏览

c++ - 如何调用外部函数?

我有我正在尝试编写的代码,我有一个 void 函数,信息。

这个,我试图从我的主函数中调用一个单独的文件。我想使用 dlopen 打开一个 so 文件。我将如何调用该函数:信息。从我的其他文件?

我正在尝试使用

我的 info 函数出现未定义的引用错误。

0 投票
1 回答
326 浏览

dlopen - 数据格式化程序暂时不可用,将在“继续”后重试。(此时调用 dlopen 不安全。)对于 popupbutton

请原谅我可能提供的过多信息,但我希望它有所帮助....
其余控件工作正常,但只有 popupbutton 是导致麻烦的按钮类型。有人可以建议我一些解决方案吗?!

0 投票
1 回答
267 浏览

macos - 将动态库多次加载到多个独立范围中

我想将一个库多次动态加载到独立的范围内,以便每个实例都有自己的内存。那可能吗?

我想不是以便携的方式。dlopen在 POSIX/Unix/Linux 上可以和朋友一起吗?或者至少我现在关心 MacOSX 的具体情况(因此我以后可能在其他系统上也需要它)。


背景:我想使用的库不是为多线程安全而设计的。但是,如果每个线程只使用一个独立的 lib 实例,它应该可以正常工作。

更多背景:它是readlinelib。在那里添加多线程支持基本上意味着重写整个事情。

0 投票
1 回答
96 浏览

objective-c - lib vs MacOSX bundle:如何获取有关 proc 环境的一些信息,例如它是如何加载的

我有点胡说八道。

我有一些 ObjC 代码,它定义了一个带有__attribute__((constructor)) void init. 我将它静态链接到一些 MacOSX 应用程序。它还静态链接到其他一些 MacOSX 包。

在某个地方,我直接通过dlopen. 第一个问题:这与加载它有什么不同[[NSBundle bundleWithPath:[NSString stringWithUTF8String:path]] load]吗?

init中,我想获得一些关于进程环境的信息,例如这段代码是如何加载的。例如当前进程的二进制文件名(在任何情况下很可能是 Cocoa 应用程序)。也许更多。

0 投票
3 回答
4047 浏览

c - valgrind 给出错误但无法找到位置

valgrind一天前我才开始使用SO 本身的某人所建议的。它是一个了不起的工具,但今天我遇到了问题。它给出了以下错误:definitely lost bytes但无法判断错误的位置。

这是输出valgrind

错误到底在哪里???

实际上我xorauth.so在这里的命令中链接了文件,它在可选字段中填充了一些
身份验证数据,但它无法这样做。

运行命令后没有可选的身份验证数据出现在其位置,并且
valgrind还说definitely lost bytes但它没有说明问题出在哪里?
我也尝试了这种变化valgrind

我不明白这个输出我在文件夹中看不到任何名为 dl-error 等的文件。请告诉我解决问题的正确方法。

编辑: 正如建议的那样,我应该使用gcc选项-g来包含调试信息......但问题是我正在使用 make 命令,实际上这个实现不是由我完成的。它是一个标准的数据包生成器工具,并且有一些错误。我等不及要修复错误,所以尝试自己动手修复它,因为我的项目因此而陷入困境。所以请告诉我应该怎么做。是否有类似的开关make或者我有改变某处。因为我第一次面对这种情况,所以不知道make和makefile是如何工作的?如果需要,我可以在此处添加一些文件的内容。

sendip.c(第 575 行)

make 命令的输出

* Makefile 的内容:*

0 投票
1 回答
2050 浏览

glibc - 如何在 dlopen() 中拦截文件系统访问?

我想拦截 dlopen() 内部发生的所有文件系统访问。起初,这似乎是LD_PRELOAD-Wl,-wrap,将是可行的解决方案,但由于一些技术原因,我无法让它们工作:

  • ld.so 在处理 LD_PRELOAD 时已经映射了它自己的符号。拦截初始加载对我来说并不重要,但此时_dl_*工作函数已解决,因此未来的调用会通过它们。我认为LD_PRELOAD为时已晚。

  • 不知何故malloc绕过了上面的问题,因为malloc()ld.so 内部没有函数free(),它只是调用memset().

  • 文件系统工作函数,例如__libc_read(),包含在ld.so其中是静态的,所以我不能用-Wl,-wrap,__libc_read.

这可能都意味着我需要ld.so直接从源代码构建自己的,而不是将其链接到包装器中。那里的挑战是两者libc都是rtld-libc从同一来源构建的。我知道宏IS_IN_rtld是在构建时定义的rtld-libc,但是如何保证只有一个静态数据结构的副本,同时仍然导出公共接口函数?(这是一个 glibc 构建系统问题,但我还没有找到这些细节的文档。)

有没有更好的进入方法dlopen()

注意:我不能使用特定于 Linux 的解决方案,FUSE因为这是针对不支持此类东西的最小“计算节点”内核。

0 投票
3 回答
3401 浏览

c - dlopen and dlclose memory management in C appln

I use dlopen to load a dynamic library say "lib1.so" and call one exposed function say A1, A1 function allocate a dynamic memory of 100kb using malloc but not deallocate that, in the main function again I all dlclose. [dlopen, call function A1 , dlclose]

I repeate the step say 10 times, Purify report this as memory leak of 1000KB , valgrind reports Indirectly lost 1000KB.

Could you please suggest 100 KB * 10 times = 1000KB , Is a real memory leak? As I have called dlclose, so all memory allocated for dynamic libs are automaticaly freed when we call dlclose?

OS: Linux Programming lan : C

0 投票
2 回答
3370 浏览

c - 有没有办法找出进程中对动态库的引用数量?

有没有办法找出进程中对动态库的引用数量?即在一个应用程序中,许多模块可能已经使用 dlopen 加载了同一个库,当一个模块执行 dlclose 时,我们能否知道该库是真的被卸载了还是它的引用只是被递减了?

0 投票
2 回答
787 浏览

c++ - 多次打开/关闭共享库后的静态破坏顺序错误

我对 Linux 上的 C++ 共享库有一个奇怪的问题。

该过程两次加载和卸载我的库(这是设计使然,无法更改)。

  1. 在第一个 dlopen() 期间,我的库中的所有静态成员都以正确的顺序初始化。
  2. 然后,当第一个 dlclose() 被调用时,破坏也按预期进行,顺序与构造相反。
  3. 在第二次 dlopen() 期间,一切正常 - 构造顺序正确,与第一次相同。
  4. 但是在第二个 dlclose() 中,破坏的顺序突然被破坏了——析构函数的调用顺序与它们初始化的顺序相同,如果任何静态对象试图访问一个已经被破坏的对象,它通常会导致 SEGFAULT。
  5. dlopen()/dlclose() 的后续尝试完全重复第 3 步和第 4 步。

我试图用一个最小的例子重现这个问题,但没有成功——使用一个小的假共享库,一切都按预期工作。我的大型图书馆中有一些东西会导致第二个 dlclose() 受到破坏,而且它非常大。

我没有发现对 gcc(尝试 3.2/3.4/4.1.2)和 Linux 发行版(RHEL 4/5,SuSE 10)的依赖。在 Web 中搜索类似案例得到 0 个结果 - 没有类似的。

在实验过程中,我尝试在静态对象构造函数中嵌入一些对 atexit() 的调用,以查看 atexit() 处理程序的顺序是否受到影响,并发现确实如此。步骤 1/2/3 运行良好(dlopen/dlclose/dlopen),然后在第二个 dlclose 上 atexit 注册的处理程序的顺序不正确。

我真的不希望得到答案,但我非常感谢任何有关如何解决问题的建议。

先感谢您,

安德鲁·谢蒂宁

PS 更新 - 我在 GLIBC 的 atexit() 中调试了代码,发现我遇到了一个错误 - 实际上是一个非常简单的错误。它已在 GLIBC 2.4 中修复,我不幸使用 GLIBC 2.3.4

0 投票
2 回答
3799 浏览

c - 如何在 C 中查看 Linux 内存映射信息?

我正在用 C 动态加载一些 Linux 库。我可以使用

信息

(见1)。

但是,我找不到任何信息来获取库的大小。

我发现的唯一一件事是必须阅读

/proc/[pid]/maps

文件并解析它以获取相关信息(参见2)。有没有更优雅的方法?