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

linker - 如何以编程方式列出 ELF 共享库符号

在我的 C 共享库中,我想 dlopen() 另一个共享库并检索该库具有的导出符号列表。

有没有一种方法可以在不运行 nm/objdump 的情况下以编程方式做到这一点?

作为第二个问题:如何检索在 dlopen() 之后加载第二个库的基地址 - 不知道任何符号的名称(所以我不能运行 dlsym!)并且不读取 /proc/self/maps?

我尝试了以下方法:

这打印

“基本地址是 0x6862696c”

但是,图书馆并不在那里:

[ /proc/pid/maps 输出:]

有人建议 l_addr 不是实际的库基地址,而是可执行头的偏移量 - 但我不确定如何找到该头地址。

0 投票
1 回答
357 浏览

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 函数,是否存在其他一些在运行时检查的方法?提前致谢!

0 投票
1 回答
711 浏览

c - C - c 函数 open() 在哪个库(.so 文件)中,我如何为任意函数找到它?

如何找到函数 open() 所在的库?比如,包含该函数的实际“xxxxxx.so”文件的名称?另外,是否有一个地方我通常可以为其他功能获取此信息?

0 投票
1 回答
2312 浏览

c - 使用 dlsym() 在静态链接库中查找变量

我们有一个链接多个静态库的程序,这些静态库可能会也可能不会定义许多符号,具体取决于编译选项。在 OS X 上,我们使用dlsym(3)NULL 句柄来获取符号地址。但是,在 Linux 上,dlsym(3)总是返回 NULL。

考虑一个简单的程序(以下来源),它链接到一个包含函数和变量的静态库,并尝试打印它们的地址。我们可以检查程序是否包含符号:

但是,当程序运行时,两者都无法定位:

使用 glibc 的实现,我们在 Linux 上尝试做的事情是否可行dlsym(3)

 生成文件

(对不起空格)

libtest.h

libtest.c

测试.c

0 投票
1 回答
978 浏览

c - POSIX 对 C 中指针类型的限制

背景

POSIX 标准为C 语言添加了很多库函数和其他标识符。在dlsym()函数的描述中,它说(我强调):

概要

描述

dlsym () 函数应获取符号的地址(函数标识符或数据对象标识符)...

C 标准不保证函数指针可以转换为 a void *,甚至不保证指针的大小相同。这有效地增加了对 C 类型系统的额外限制。

问题

我的问题是这样的:

  • 对于 C 类型系统的这种限制是否有规范性参考,还是只能从某些库函数的描述中推导出来?
  • POSIX 甚至可以在一个系统上实现吗? sizeof (function pointer) > sizeof (void *)

参考

0 投票
1 回答
104 浏览

c++ - 使用 C 应用程序加载的 C++ 插件中的 C++ 库

我有一个用 C++ 编写的库(.so)。如果我这样做,nm mylib.so我会得到00000000000029a0 T _ZN4Bits7fromMemEPhl(除其他外)。

另一方面,我有一个用 C 编写的应用程序,它加载了一些用 C++ 编写的插件(dlopen、dlsym 等)。

如果我尝试从我的 c++ 插件中使用我的 lib,我会得到undefined symbol: _ZN4Bits7fromMemEPhl. 为什么?

编辑:

这就是我编译插件的方式:

这就是我编译我的主应用程序的方式:

编辑:

问题很清楚。出于某种原因,我的库(cpp-bitstring)没有链接到我的插件。我缺少的代码在哪里?

0 投票
1 回答
1226 浏览

c++ - 将共享库与 dlopen 一起使用 - 共享对象找不到加载程序导出的符号

所以,我有一个我正在尝试运行的示例。

头文件.h

主文件

它是用以下makefile编译的

然后,我想使用我自己的 registerfunc ,它的编写方式如下:

主.h:

主文件

生成文件:

当我以这种方式编译它并运行 a.out (第一个 main 的输出)时,我得到:

但是,如果我使用以下命令编译 a.out 和 test.so:

然后我通过以下回溯(gdb -ex run a.out)遇到分段错误:

这让我有点难过,至于如何让 test.so 调用由它的被调用者定义的东西。能否请你帮忙?

0 投票
2 回答
144 浏览

c - 有没有办法防止 dlsym (module, "functionName") 每个函数?

我有一个共享库(更准确地说是 PKCS#11 模块),我想编写一个可以加载库并使用它的应用程序。

目前我正在使用 dlsym 像这样:

但该库确实有大约 68 个函数。我想真正的问题是:我真的必须为每个功能都这样做吗?是否有一个包含所有函数列表的结构?也许我只是用错了 dlsym ...

0 投票
1 回答
363 浏览

c - 如何打印 dlsym() 变量?

我编写自己的库:

当我想打印我的系统名称时:

我得到类似的东西:

我认为这是由于我的 char a 类型错误造成的。当我在一个文件中对其进行测试时,分配给 dlsym 的字符可以正常工作。

生成文件:

0 投票
1 回答
2025 浏览

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 注册函数吗?