问题标签 [dlsym]

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 回答
858 浏览

c++ - 为什么这个动态库加载代码可以和 gcc 一起工作?

背景:

我发现自己承担着将 C++ GNU/Linux 应用程序移植到 Windows 的艰巨任务。此应用程序所做的一件事是在特定路径上搜索共享库,然后使用 posix dlopen() 和 dlsym() 调用动态地从中加载类。我们有充分的理由以这种方式加载,我不会在这里讨论。

问题:

要动态发现由 C++ 编译器使用 dlsym() 或 GetProcAddress() 生成的符号,必须使用 extern "C" 链接块来解开它们。例如:

此代码是完全有效的 C++,可在 Linux 和 Windows 上的众多编译器上编译和运行。但是,它不能与 MSVC 一起编译,因为“返回类型不是有效的 C”。我们想出的解决方法是更改​​函数以返回指向列表的指针而不是列表对象:

我一直在尝试为 GNU/Linux 加载程序找到一个最佳解决方案,该解决方案既可以与新函数和旧旧函数原型一起使用,也可以至少检测何时遇到不推荐使用的函数并发出警告。如果代码只是在尝试使用旧库时出现段错误,这对我们的用户来说是不合适的。我最初的想法是在调用 get_list 期间设置一个 SIGSEGV 信号处理程序(我知道这很恶心 - 我愿意接受更好的想法)。因此,为了确认加载旧库会出现段错误,我认为它会使用旧函数原型(返回列表对象)通过新加载代码(需要指向列表的指针)运行库,令我惊讶的是刚刚工作。我的问题是为什么

下面的加载代码适用于上面列出的两个函数原型。我已经确认它可以在 Fedora 12、RedHat 5.5 和 RedHawk 5.1 上使用 gcc 版本 4.1.2 和 4.4.4。使用带有 -shared 和 -fPIC 的 g++ 编译库,并且可执行文件需要与 dl (-ldl) 链接。

0 投票
5 回答
5797 浏览

c++ - 如何在运行时检测符号是否被剥离?

在我的 C++ 程序中,如何在运行时以编程方式检测符号是否已通过 Linux 上的“strip”gnu 开发工具被剥离?

我想要一个函数定义,如果剥离则返回 true,否则返回 false。

在“main()”上使用 dlsym() 可以可靠地检测到这一点吗?

0 投票
2 回答
1431 浏览

c - C --> malloc --> dlsym

我曾经dlsym()调用我的 malloc 版本,而不是默认库 malloc:

现在经过一段时间,可能是一个计时器左右,我想恢复到 malloc 的原始版本(libc 库 malloc)。我怎样才能做到这一点?

提前致谢。

0 投票
3 回答
1237 浏览

c - 如何让这个简单的 C 测试程序加载模块工作?

我打算在 linux 上使用 dlopen 和 dlsym 来使这两个源文件工作:

和:

但是当我编译第一个时,它一直说:

main.c:9:错误:需要左值作为赋值的左操作数

编辑:我尝试添加一个演员,并使其成为一个函数指针,但现在它说: main.c:(.text+0x1f): undefined reference to dlopen' main.c:(.text+0x2b): undefined reference todlsym'

0 投票
1 回答
1311 浏览

dlsym - 使用 dlsym 加载命名的未导出符号?

是否可以使用从框架加载命名的未导出符号dlsym

我尝试导入的符号有一个名称,在框架内引用它。这是我需要调用的函数。

我正在尝试以通常的dlopen+dlsym方式执行此操作,但是当我尝试加载未导出的符号时,dlsym返回一个NULL指针。

0 投票
2 回答
1103 浏览

c++ - C++ 中的工厂模式:自动生成显式 createInstance()-Method

我在编写 C++ 框架时遇到了问题,即用户使用它的开销应该比使用它的可能少。用户可以通过创建一个包含类的共享库来将他们的工作发布到框架,该类由框架的 BaseClass 派生并实现 extern "C" createInstance() 方法以返回其派生类的实例。所以框架可以通过dlsym()通过共享库调用createInstance-Method来访问用户类。

在框架中:

我的问题:是否可以生成UserXcreateInstance()-方法,在每个用户库中都是多余的,这样用户就不必考虑了?

我认为模板+宏是可能的,但我还没有找到一种方法来做到这一点......

我在想的另一种方法是通过 dlsym 和适当的名称修饰直接调用任何用户类的构造函数。(我从配置文件中知道任何命名空间+类名)但我认为这不是一个合适的解决方案,特别是构造函数调用与常规函数调用不同......但非常有趣......

0 投票
2 回答
2268 浏览

linux - dlsym 如何从剥离的二进制库中成功导入函数?

dlsym 可以从剥离的二进制文件中导入函数,这很奇怪。

谁能告诉我为什么/如何?

0 投票
1 回答
379 浏览

c - Dlsym:从不同大小的整数转换为指针

我真的很讨厌在这里问问题。但是我一直在查看其他一些帖子,并且诸如此类的解决方案似乎不起作用。这可能是我对语法的误解。

我正在改进我的一些旧代码。问题中的函数循环通过一些加载的模块并运行一个函数。当我在 x86 上时,这段代码运行得非常好,但是跳转到 64 位把一切都搞砸了。

我收到以下警告:

当然,我的程序段错误。我知道这只是一个铸造问题,但我不知道一个简单且可移植的解决方案。如果您需要更多信息,请告诉我。谢谢。

0 投票
2 回答
765 浏览

c - 使用 Swig 结合 C 和 TCL

我一直在关注使用 Swig 将 C 与 TCL 结合起来的教程。该教程似乎工作正常,但最后我遇到了一个我无法解决的错误。情况如下:

我关注的教程是: http ://www.swig.org/tutorial.html 。

我有一个名为 test.c 的文件:

和另一个名为 test.i:

然后我使用以下命令行参数来准备正确的文件:

最后我尝试使用以下方法加载它:

这是我收到以下错误的地方:

据我所知,我没有偏离教程。谁能告诉我我是怎么得到这个错误的,更重要的是如何摆脱它?

提前致谢!

0 投票
0 回答
288 浏览

mmap - 使用 dlsym 跟踪 mmap

我正在尝试测量一些程序 mmap 有多少内存。我正在使用以下代码:

stats 是一些保存统计信息的全局变量。我将此代码转换为共享对象并与之链接。对于某些程序,它可以工作,但是对于某些程序,在 mmap1 中打印一次,然后在 mmap1 中再次打印,然后什么也没有发生(程序在这一点上卡住,直到我杀死它,从未到达 mmap2。

我阅读了有关 dlsym 的信息,但找不到导致此问题的问题。我很想从更有经验的人那里来。谢谢。