问题标签 [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.
c++ - 如何调用外部函数?
我有我正在尝试编写的代码,我有一个 void 函数,信息。
这个,我试图从我的主函数中调用一个单独的文件。我想使用 dlopen 打开一个 so 文件。我将如何调用该函数:信息。从我的其他文件?
我正在尝试使用
我的 info 函数出现未定义的引用错误。
dlopen - 数据格式化程序暂时不可用,将在“继续”后重试。(此时调用 dlopen 不安全。)对于 popupbutton
请原谅我可能提供的过多信息,但我希望它有所帮助....
其余控件工作正常,但只有 popupbutton 是导致麻烦的按钮类型。有人可以建议我一些解决方案吗?!
macos - 将动态库多次加载到多个独立范围中
我想将一个库多次动态加载到独立的范围内,以便每个实例都有自己的内存。那可能吗?
我想不是以便携的方式。dlopen
在 POSIX/Unix/Linux 上可以和朋友一起吗?或者至少我现在关心 MacOSX 的具体情况(因此我以后可能在其他系统上也需要它)。
背景:我想使用的库不是为多线程安全而设计的。但是,如果每个线程只使用一个独立的 lib 实例,它应该可以正常工作。
更多背景:它是readline
lib。在那里添加多线程支持基本上意味着重写整个事情。
objective-c - lib vs MacOSX bundle:如何获取有关 proc 环境的一些信息,例如它是如何加载的
我有点胡说八道。
我有一些 ObjC 代码,它定义了一个带有__attribute__((constructor)) void init
. 我将它静态链接到一些 MacOSX 应用程序。它还静态链接到其他一些 MacOSX 包。
在某个地方,我直接通过dlopen
. 第一个问题:这与加载它有什么不同[[NSBundle bundleWithPath:[NSString stringWithUTF8String:path]] load]
吗?
在init
中,我想获得一些关于进程环境的信息,例如这段代码是如何加载的。例如当前进程的二进制文件名(在任何情况下很可能是 Cocoa 应用程序)。也许更多。
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 的内容:*
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
因为这是针对不支持此类东西的最小“计算节点”内核。
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
c - 有没有办法找出进程中对动态库的引用数量?
有没有办法找出进程中对动态库的引用数量?即在一个应用程序中,许多模块可能已经使用 dlopen 加载了同一个库,当一个模块执行 dlclose 时,我们能否知道该库是真的被卸载了还是它的引用只是被递减了?
c++ - 多次打开/关闭共享库后的静态破坏顺序错误
我对 Linux 上的 C++ 共享库有一个奇怪的问题。
该过程两次加载和卸载我的库(这是设计使然,无法更改)。
- 在第一个 dlopen() 期间,我的库中的所有静态成员都以正确的顺序初始化。
- 然后,当第一个 dlclose() 被调用时,破坏也按预期进行,顺序与构造相反。
- 在第二次 dlopen() 期间,一切正常 - 构造顺序正确,与第一次相同。
- 但是在第二个 dlclose() 中,破坏的顺序突然被破坏了——析构函数的调用顺序与它们初始化的顺序相同,如果任何静态对象试图访问一个已经被破坏的对象,它通常会导致 SEGFAULT。
- 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