问题标签 [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.
c - dlsym 和参数检查
我正在用 C 编写一个插件应用程序,我正在使用 dlopen/dlsym 动态加载某些函数的“实现”。例如,我有以下指向函数的指针
我使用以下代码加载实现:
“插件”通过以下方式定义 cti_create
所以它定义了一个整数参数,但一切正常,没有错误。问题是:用 dlsym 加载符号时是否可以进行一些参数类型验证?如何强制加载的符号具有我期望的签名?
dynamic-linking - dlopen/dlsym:获取函数指针时出错
我试图通过使用 dlopen 和 dlsym 来获取函数指针,但是我无法让它正常工作。尝试进行 dlsym 调用时失败。以下是我的代码。
请问有什么帮助吗?
c - C动态链接到共享库抑制/处理“无法打开共享对象文件”致命错误,并继续链接
我想链接到 C 中的共享库。(在 Linux 上)
我想压制或处理:
“加载共享库时出错:libxxxx.so:无法打开共享对象文件:没有这样的文件或目录”
并继续加载链接到下一个可能会解析左侧未解析符号的库。
我猜应该使用 gcc/ld/dlsym 选项,但无法理解如何......
有人有线索吗?
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 的链接过程(如下所示),它似乎正在工作
输出:
谁能解释一下后台发生了什么?提前致谢。
c++ - 函数指针:*(void**) (&fun) = dlsym(lib, "fun") 它是如何工作的?
我正在使用 dlsym 填充函数指针,它是调用的成员变量。像下面
现在如果我分配
它给出了错误
通过互联网我发现
有人可以告诉我这种转换/转换是如何在这里发生的吗?
c++ - 使用 dlopen() 和 dlsym() 从 C++ 中的 .so 库中获取对象
我正在尝试在 Linux 下的 Qt 应用程序中加载 .so 文件。这是使用 dlopen() 和 dlsym() 的基本功能。但是我需要从 .so 库中获取多个字符串列表,因此我尝试为两者使用一个通用的 .h 文件,但我无法从主应用程序访问该对象。
这是我到目前为止所拥有的:
扩展模块.h
模块文件.cpp
主文件
hello() 函数完美无缺,但我无法让 ext_get() 正常工作(/external.so:未定义符号:_ZN9ExtModuleC1Ev)。我必须从 .so 库中检索多个列表,但我不知道这是否是正确的方法。此外,正如您可能已经猜到的那样,我不是特别熟练的程序员。任何建议将不胜感激。
感谢您的任何帮助。
c - 函数原型 dlsym 的 C typedef
我正在向 LD_PRELOAD 编写一个共享库并拦截来自现有库(在 linux 中)的一些调用。
我有大约 50 多个不同的函数原型和属性声明要编写,我希望代码尽可能短,因为函数原型非常大。
我遇到的问题如下:假设我想拦截对 doStuff(int, void*) 的所有调用
我有以下代码:
头文件:
C 文件
好的,现在这工作正常,但我想替换标题中的以下行:
有类似的东西:
但后来我得到
'doStuff' 重新声明为不同类型的符号
因为它是在真正的库中声明的......但是......它与当前的语法没有问题......我必须重新编写参数......如果我取消对 typedef 的引用:
然后extern doStuffPrototype doStuff;
工作,但dlSym_doStuff = (doStuffPrototype) dlSym(lib_ptr, "doStuff");
不编译...
我尝试了很多事情:这可能吗?
c++ - 使用 dlsym 加载 so 文件,无法加载库
我正在实现一个从 .so 文件加载插件的 API。要加载它们,我正在使用 dlsym() 函数。为了检查它是否有效,我已经实现了一个测试插件(如下)并且为了让事情变得更容易,我只加载了“初始化”功能。要编译我的代码,我首先使用以下命令创建 .so 文件:
之后我运行 plugin_manager.cpp 如下:
但是在运行 a.out 并输入正确的文件名后,我收到一个错误,我无法加载 .so 文件。有谁知道如何解决这个问题?
plugin_manager.cpp
plugin_interface.h
test_plugin.cpp
c++ - 让目标文件符号成为可执行文件中的动态符号
我有几个从构建系统中吐出的目标文件(来自 C++)。它们有几个extern "C"
我想在程序中使用的链接符号,并且可以通过dlopen
/dlsym
从其他地方访问。
当使用 gcc 编译成可执行文件时,这些符号未列出使用nm -D <executable-here>
(即 afaik 它们不是动态符号)。
如何让它们在编译后的可执行文件中作为动态符号公开?
我可以更改目标文件和可执行文件的构建标志,但是更改 C++ 文件在最终可执行文件中的结束方式(即不首先将它们变成目标文件)是困难的。
(GCC 4.8, ld 2.24)
编辑:我遇到了这个问题,这可能是我要问的,也可能不是,但我不完全确定。 在静态二进制文件上使用 dlsym
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。
有人能帮我吗?