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

c - dlsym 和参数检查

我正在用 C 编写一个插件应用程序,我正在使用 dlopen/dlsym 动态加载某些函数的“实现”。例如,我有以下指向函数的指针

我使用以下代码加载实现:

“插件”通过以下方式定义 cti_create

所以它定义了一个整数参数,但一切正常,没有错误。问题是:用 dlsym 加载符号时是否可以进行一些参数类型验证?如何强制加载的符号具有我期望的签名?

0 投票
1 回答
4759 浏览

dynamic-linking - dlopen/dlsym:获取函数指针时出错

我试图通过使用 dlopen 和 dlsym 来获取函数指针,但是我无法让它正常工作。尝试进行 dlsym 调用时失败。以下是我的代码。

请问有什么帮助吗?

0 投票
1 回答
553 浏览

c - C动态链接到共享库抑制/处理“无法打开共享对象文件”致命错误,并继续链接

我想链接到 C 中的共享库。(在 Linux 上)

我想压制或处理:

“加载共享库时出错:libxxxx.so:无法打开共享对象文件:没有这样的文件或目录”

并继续加载链接到下一个可能会解析左侧未解析符号的库。

我猜应该使用 gcc/ld/dlsym 选项,但无法理解如何......

有人有线索吗?

0 投票
1 回答
1192 浏览

gcc - RTLD_NEXT 无法正常工作

我使用下面的测试代码减少了我的问题,

主文件

2.cc

1.cc

将 1.cc 编译成 lib1.so 并将 2.cc 编译成 lib2.so 如下所示,

以上步骤将生成 lib1.so、lib2.so 和 a.out。这里的问题是在运行可执行文件 a.out 时,使用 dlsym(RTLD_NEXT) 时无法查找原始的“fread”符号。

输出是,

但是如果改变 lib2.so 的链接过程(如下所示),它似乎正在工作

输出:

谁能解释一下后台发生了什么?提前致谢。

0 投票
2 回答
1341 浏览

c++ - 函数指针:*(void**) (&fun) = dlsym(lib, "fun") 它是如何工作的?

我正在使用 dlsym 填充函数指针,它是调用的成员变量。像下面

现在如果我分配

它给出了错误

通过互联网我发现

有人可以告诉我这种转换/转换是如何在这里发生的吗?

0 投票
2 回答
3565 浏览

c++ - 使用 dlopen() 和 dlsym() 从 C++ 中的 .so 库中获取对象

我正在尝试在 Linux 下的 Qt 应用程序中加载 .so 文件。这是使用 dlopen() 和 dlsym() 的基本功能。但是我需要从 .so 库中获取多个字符串列表,因此我尝试为两者使用一个通用的 .h 文件,但我无法从主应用程序访问该对象。

这是我到目前为止所拥有的:

扩展模块.h

模块文件.cpp

主文件

hello() 函数完美无缺,但我无法让 ext_get() 正常工作(/external.so:未定义符号:_ZN9ExtModuleC1Ev)。我必须从 .so 库中检索多个列表,但我不知道这是否是正确的方法。此外,正如您可能已经猜到的那样,我不是特别熟练的程序员。任何建议将不胜感激。

感谢您的任何帮助。

0 投票
1 回答
1237 浏览

c - 函数原型 dlsym 的 C typedef

我正在向 LD_PRELOAD 编写一个共享库并拦截来自现有库(在 linux 中)的一些调用。

我有大约 50 多个不同的函数原型和属性声明要编写,我希望代码尽可能短,因为函数原型非常大。

我遇到的问题如下:假设我想拦截对 doStuff(int, void*) 的所有调用

我有以下代码:

头文件:

C 文件

好的,现在这工作正常,但我想替换标题中的以下行:

有类似的东西:

但后来我得到

'doStuff' 重新声明为不同类型的符号

因为它是在真正的库中声明的......但是......它与当前的语法没有问题......我必须重新编写参数......如果我取消对 typedef 的引用:

然后extern doStuffPrototype doStuff;工作,但dlSym_doStuff = (doStuffPrototype) dlSym(lib_ptr, "doStuff");不编译...

我尝试了很多事情:这可能吗?

0 投票
1 回答
1559 浏览

c++ - 使用 dlsym 加载 so 文件,无法加载库

我正在实现一个从 .so 文件加载插件的 API。要加载它们,我正在使用 dlsym() 函数。为了检查它是否有效,我已经实现了一个测试插件(如下)并且为了让事情变得更容易,我只加载了“初始化”功能。要编译我的代码,我首先使用以下命令创建 .so 文件:

之后我运行 plugin_manager.cpp 如下:

但是在运行 a.out 并输入正确的文件名后,我收到一个错误,我无法加载 .so 文件。有谁知道如何解决这个问题?

plugin_manager.cpp

plugin_interface.h

test_plugin.cpp

0 投票
1 回答
3502 浏览

c++ - 让目标文件符号成为可执行文件中的动态符号

我有几个从构建系统中吐出的目标文件(来自 C++)。它们有几个extern "C"我想在程序中使用的链接符号,并且可以通过dlopen/dlsym从其他地方访问。

当使用 gcc 编译成可执行文件时,这些符号未列出使用nm -D <executable-here>(即 afaik 它们不是动态符号)。

如何让它们在编译后的可执行文件中作为动态符号公开?

我可以更改目标文件和可执行文件的构建标志,但是更改 C++ 文件在最终可执行文件中的结束方式(即不首先将它们变成目标文件)是困难的。

(GCC 4.8, ld 2.24)

编辑:我遇到了这个问题,这可能是我要问的,也可能不是,但我不完全确定。 在静态二进制文件上使用 dlsym

0 投票
1 回答
464 浏览

c - 动态链接 LibCURL 时出错

我正在尝试动态链接 libcurl,但在 easy_performing 时出现 Segfault。
以下是全局范围声明:

然后我动态链接它:

在这一点上它不会退出或失败。
所以这里是节目开始的地方。当像这样设置 curlopts 时,我没有收到错误:

但是,当easy_performing我得到段错误:

我很确定这个错误很容易执行,但我决定继续生成一个 core_dump。当我 gdb 这个核心时,我实际上在 easy_init 上得到了一个错误:

程序以信号 11 终止,分段错误。#0 0x00007f3d2f9cd3f8 在 curl_easy_init () 来自 curlapp

任何人都知道这里可能出了什么问题?

提前致谢!


[编辑]

我已经删除了 curl_easy_perform 块并且程序运行正常。我不确定它失败是因为 curl_easy_perform() 还是仅仅因为在这个函数中发生了事情。换句话说,它可能意味着 'init' 和 'setopts' 仅适用于 easy_perform。(这只是一个猜测)

[编辑2]

更改 dlsym 块:

在函数调用中:

但是我仍然在 curl_easy_init() 处遇到 Segfault。
有人能帮我吗?