问题标签 [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.
linker - 如何以编程方式列出 ELF 共享库符号
在我的 C 共享库中,我想 dlopen() 另一个共享库并检索该库具有的导出符号列表。
有没有一种方法可以在不运行 nm/objdump 的情况下以编程方式做到这一点?
作为第二个问题:如何检索在 dlopen() 之后加载第二个库的基地址 - 不知道任何符号的名称(所以我不能运行 dlsym!)并且不读取 /proc/self/maps?
我尝试了以下方法:
这打印
“基本地址是 0x6862696c”
但是,图书馆并不在那里:
[ /proc/pid/maps 输出:]
有人建议 l_addr 不是实际的库基地址,而是可执行头的偏移量 - 但我不确定如何找到该头地址。
c - 使用 dlopen 访问 POSIX 函数
POSIX 2008 引入了几个文件系统函数,它们在确定文件路径时依赖于目录描述符(我说的是-at
函数,例如openat
, renameat
,symlinkat
等)。我怀疑是否所有 POSIX 平台都支持它(好吧,至少最新版本似乎支持),我正在寻找一种方法来确定平台是否支持这些功能。当然可以使用autoconf
和朋友进行编译时确定,但我正在寻找一种可能性来确定实现是否支持动态-at
功能。
我想到的第一个是dlopen()
//组合dlsym()
;dlclose()
至少我已经成功地从/usr/libc.so.6
共享库中加载了必要的符号。但是,libc 在不同的平台上可能(或者是?)命名不同。是否有找到 libc 的标准位置列表?至少在 Linux 上/lib/libc.so
似乎不是共享库的符号链接,而是ld
脚本。如果支持 POSIX 函数,是否存在其他一些在运行时检查的方法?提前致谢!
c - C - c 函数 open() 在哪个库(.so 文件)中,我如何为任意函数找到它?
如何找到函数 open() 所在的库?比如,包含该函数的实际“xxxxxx.so”文件的名称?另外,是否有一个地方我通常可以为其他功能获取此信息?
c - 使用 dlsym() 在静态链接库中查找变量
我们有一个链接多个静态库的程序,这些静态库可能会也可能不会定义许多符号,具体取决于编译选项。在 OS X 上,我们使用dlsym(3)
NULL 句柄来获取符号地址。但是,在 Linux 上,dlsym(3)
总是返回 NULL。
考虑一个简单的程序(以下来源),它链接到一个包含函数和变量的静态库,并尝试打印它们的地址。我们可以检查程序是否包含符号:
但是,当程序运行时,两者都无法定位:
使用 glibc 的实现,我们在 Linux 上尝试做的事情是否可行dlsym(3)
?
生成文件
(对不起空格)
libtest.h
libtest.c
测试.c
c - POSIX 对 C 中指针类型的限制
背景
POSIX 标准为C 语言添加了很多库函数和其他标识符。在dlsym()
函数的描述中,它说(我强调):
概要
描述
dlsym () 函数应获取符号的地址(函数标识符或数据对象标识符)...
C 标准不保证函数指针可以转换为 a void *
,甚至不保证指针的大小相同。这有效地增加了对 C 类型系统的额外限制。
问题
我的问题是这样的:
- 对于 C 类型系统的这种限制是否有规范性参考,还是只能从某些库函数的描述中推导出来?
- POSIX 甚至可以在一个系统上实现吗?
sizeof (function pointer) > sizeof (void *)
参考
- C11 标准(最终公开草案):n1570
- The Open Group的 POSIX 标准:POSIX.1-2008
- POSIX
dlsym()
函数
c++ - 使用 C 应用程序加载的 C++ 插件中的 C++ 库
我有一个用 C++ 编写的库(.so)。如果我这样做,nm mylib.so
我会得到00000000000029a0 T _ZN4Bits7fromMemEPhl
(除其他外)。
另一方面,我有一个用 C 编写的应用程序,它加载了一些用 C++ 编写的插件(dlopen、dlsym 等)。
如果我尝试从我的 c++ 插件中使用我的 lib,我会得到undefined symbol: _ZN4Bits7fromMemEPhl
. 为什么?
编辑:
这就是我编译插件的方式:
这就是我编译我的主应用程序的方式:
编辑:
问题很清楚。出于某种原因,我的库(cpp-bitstring)没有链接到我的插件。我缺少的代码在哪里?
c++ - 将共享库与 dlopen 一起使用 - 共享对象找不到加载程序导出的符号
所以,我有一个我正在尝试运行的示例。
头文件.h
主文件
它是用以下makefile编译的
然后,我想使用我自己的 registerfunc ,它的编写方式如下:
主.h:
主文件
生成文件:
当我以这种方式编译它并运行 a.out (第一个 main 的输出)时,我得到:
但是,如果我使用以下命令编译 a.out 和 test.so:
然后我通过以下回溯(gdb -ex run a.out)遇到分段错误:
这让我有点难过,至于如何让 test.so 调用由它的被调用者定义的东西。能否请你帮忙?
c - 有没有办法防止 dlsym (module, "functionName") 每个函数?
我有一个共享库(更准确地说是 PKCS#11 模块),我想编写一个可以加载库并使用它的应用程序。
目前我正在使用 dlsym 像这样:
但该库确实有大约 68 个函数。我想真正的问题是:我真的必须为每个功能都这样做吗?是否有一个包含所有函数列表的结构?也许我只是用错了 dlsym ...
c - 如何打印 dlsym() 变量?
我编写自己的库:
当我想打印我的系统名称时:
我得到类似的东西:
我认为这是由于我的 char a 类型错误造成的。当我在一个文件中对其进行测试时,分配给 dlsym 的字符可以正常工作。
生成文件:
c++ - 如何在共享库中调用 atexit?
在共享库中,函数 func1() 具有 atexit(terminate_global) 并且此共享库没有“属性((constructor))”和“属性((destructor))”。
因此,程序流程如下:
1) 应用程序使用 dlopen 加载共享库。
2) 应用程序使用 dlsym 调用 func1()。
3) func1() 有 atexit(terminate_global)。
4) func1() 返回。
5) 应用程序调用 dlclose 取消分配库。
在上述步骤中,我没有发现在卸载库时调用了 atexit()。那么,如果在取消分配共享库时必须调用 atexit(),那么正确的方法应该是什么?我应该使用属性((constructor)) 和属性((destructor)) 函数属性导出例程,以便可以调用 atexit 注册函数吗?