问题标签 [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 投票
4 回答
4576 浏览

c - Function interposition in Linux without dlsym

I'm currently working on a project where I need to track the usage of several system calls and low-level functions like mmap, brk, sbrk. So far, I've been doing this using function interposition: I write a wrapper function with the same name as the function I'm replacing (mmap for example), and I load it in a program by setting the LD_PRELOAD environment variable. I call the real function through a pointer that I load with dlsym.

Unfortunately, one of the functions I want to wrap, sbrk, is used internally by dlsym, so the program crashes when I try to load the symbol. sbrk is not a system call in Linux, so I can't simply use syscall to call it indirectly.

So my question is, how can I call a library function from a wrapper function of the same name without using dlsym? Is there any compiler trick (using gcc) that lets me refer to the original function?

0 投票
5 回答
19635 浏览

c++ - C++ 中 dlsym() 和 dlopen() 的替代方案

我有一个应用程序,其中一部分使用共享库。这些库在编译时链接。
在运行时,加载程序期望共享对象在 中LD_LIBRARY_PATH,如果没有找到整个应用程序崩溃并出现错误“无法加载共享库”。请注意,不能保证客户端将拥有该库,在这种情况下我想要应用程序留下合适的错误消息,独立部分也应该正常工作。

为此,我正在使用dlsym()dlopen()使用共享库中的 API。这样做的问题是,如果我在 API 中有很多函数,我必须单独使用dlsym()和 ptrs 访问它们,这在我的情况下会导致内存损坏和代码崩溃。

有没有其他选择?

0 投票
3 回答
461 浏览

c++ - 使用 C 动态加载例程的问题

我有一个由用 C++ 编写的不同模块组成的应用程序。
其中一个模块用于处理 SunGrid Engine 上的分布式任务。它使用 DRMAA API 来提交和监控网格作业。如果客户端不支持网格,则应使用本地计算机

API libdrmaa.so 的共享对象在编译时链接并在运行时加载。
如果使用我的应用程序的客户端有这个“.so”一切都很好,但如果客户端没有那个,应用程序退出加载共享库失败。
为了避免这种情况,我将 API 调用替换为使用 dlsym() 和 dlopen() 获得的函数指针。现在,如果对 dlopen 的调用没有成功并且我的目标已经实现,我可以使用本地计算机而不是网格。
现在的问题是应用程序现在可以成功运行小型测试用例,但是对于较大的测试用例,它会引发分段错误,而使用动态加载的相同代码可以正常工作。

使用 dlsym() 和 dlopen() 时我是否遗漏了什么?
有没有其他方法可以实现相同的目标?

任何帮助,将不胜感激。

谢谢,

0 投票
3 回答
845 浏览

php - 使用 dlsym 进行库插入

我正在编写一个插入库来跟踪 libc 中某些库函数的使用情况,例如 open()、close()、connect() 等。它通常在大多数应用程序上运行良好。但是,当我使用 PHP 进行尝试时,特别是使用 PHP 的 MySQL 模块时,没有跟踪该模块内对 libc 的任何函数调用(因此没有 connect()、没有 socket() 等)。'strace' 告诉我系统调用了 socket()、connect() 等。在模块和libmysqlclient.so.16.0.0上运行'file'表示它们都是动态链接的。所以这应该不是静态链接引起的问题。可能是什么问题?

我正在使用 Fedora 11 64 位版本。

谢谢你。

0 投票
4 回答
7546 浏览

c++ - 与 dlopen/dlsym 一起使用时 dynamic_cast 失败

介绍

让我为这个冗长的问题提前道歉。它尽可能短,不幸的是,它不是很短。

设置

我定义了两个接口,A和B:

然后,我有一个共享库“testc”构造 C 类的对象,实现 A 和 B,然后传递指向它们的 A 接口的指针:

最后,我有第二个共享库“testd”,它以 aA*作为输入,并尝试将其转换为 a B*,使用dynamic_cast

最后,我有主应用程序,A*在库之间传递 's:

问题

如果我构建我的主应用程序,链接到“testc”和“testd”库,一切都会按预期工作。但是,如果我将主应用程序修改为不链接到“testc”和“testd”,而是在运行时使用dlopen/加载它们dlsym,那么会dynamic_cast失败。

我不明白为什么。有什么线索吗?

附加信息

  • 使用 gcc 4.4.1、libc6 2.10.1 (Ubuntu 9.10) 测试
  • 可用的示例代码
0 投票
5 回答
1949 浏览

c++ - C/C++ 动态加载未知原型的函数

我正在编写一种运行时系统/解释器,我需要做的一件事是调用位于外部库中的 c/c++ 函数。

在 linux 上,我使用这些dlfcn.h函数打开一个库,并调用位于其中的函数。问题是,当使用dlsysm()返回的函数指针时,需要在调用之前将其转换为适当的类型,以便知道函数参数和返回类型,但是如果我在库中调用一些任意函数,那么显然我不会在编译时知道这个原型。

所以我要问的是,有没有办法调用一个动态加载的函数并传递它的参数,并在知道它的原型的情况下检索它的返回值?

到目前为止,我得出的结论是,没有简单的方法可以做到这一点,但我发现的一些解决方法是:

  • 确保我要加载的所有函数都具有相同的原型,并为这些函数提供某种排序机制来检索参数和返回值。这就是我目前正在做的事情。

  • 使用 inline asm 将参数压入堆栈,并读取返回值。如果可能的话,我真的想避免这样做!

如果有人有任何想法,那将不胜感激。

编辑:

我现在找到了我正在寻找的东西:

http://sourceware.org/libffi/

“一个可移植的外部函数接口库”

(尽管我承认我本来可以在原始问题中更清楚!)

0 投票
3 回答
1445 浏览

c++ - 使用 dlsym 的 Ansi C 补丁在 linux 下编译正常,但在 Mac Os X 上失败

我已经构建了一个小补丁来附加到某个应用程序并跟踪某些函数的调用。其中,malloc() 和 open()。我正在使用 dlsym 来存储指向原始符号的指针并用我自己的替换函数名。它可以在 linux 下完美地编译和工作。这是代码:

然后,我使用以下指令编译它,创建一个 pi.so。

然后,我使用 LD_PRELOAD 指令将其注入任何应用程序。

它在 Linux 下运行得非常好!但是当我回到家并尝试在 Mac 下使用 GCC 编译它时,它无法编译并且 LD_PRELOAd 指令不起作用。我应该改变什么?非常感谢。

0 投票
2 回答
12345 浏览

c++ - 为 LD_PRELOAD 设置我的库会使某些进程产生加载程序错误

当我尝试运行我只有执行权限的脚本时出现以下错误:

uname: symbol lookup error: /home/dumindara/random/sotest/a.out: undefined symbol: dlsym

这是在我将LD_PRELOAD环境变量设置为/home/dumindara/random/sotest/a.out.

a.out有一个测试malloc功能,并在内部调用dlsym

运行时我没有遇到这个问题ls。大多数进程确实给出了这个错误。为什么会发生这种情况,我该怎么做才能让它发挥作用?

0 投票
3 回答
4245 浏览

c++ - 如何使用动态加载的函数(dlopen)操作/返回数据?

我花了几天时间阅读和重新阅读我在该主题上找到的每个教程,并花了几个小时(甚至几天)在 SO 上浏览相关问题,但我仍然无法让以下工作。如果这是重复的,请接受我的道歉:很可能我已经多次看到并重新阅读了重复的问题,但无法理解答案与我的问题的相关性。有了这个...

我正在尝试为我的应用程序实现插件架构。插件作为库编译和安装。在运行时,应用程序然后使用 dlopen() / dlsym() 加载并链接到插件的功能。
这个想法是插件(库)将实现一组函数以将数据返回到主应用程序,或操作从应用程序传递的数据。

为了测试这个想法,我尝试实现一个函数(在插件内部),它将返回插件本身的(人类可读的)名称(作为 std::string)。我认为这将是一件简单的事情开始...... :-/

这是我到目前为止得到的:

我尝试了许多不同的组合,包括一种看起来更直接(但效果不佳)的组合,其中返回了插件名称:

我知道我很接近:代码编译并且应用程序停止崩溃;)
但是,我有一个空白空间,我希望看到实际的插件名称。

到目前为止,我阅读的所有教程都非常快速地介绍了双向传递数据的机制:plugin <=> Application. 我正在尝试使用“简单”std::string 做什么,我希望稍后使用更复杂的对象(即插件函数将通过引用获取对象并更改其某些属性)。教程或多或少都停留在使用 dlsym() 创建指针的地方,并且没有提供太多关于如何使用该指针的示例。

那么,如何做到这一切呢?

另一个相关的问题:我是否使用了一个通用的标头,我将同时与应用程序和插件一起使用,以及在哪里定义函数调用签名?我将如何做到这一点,这将如何帮助?

0 投票
2 回答
6347 浏览

ios - 在 iOS 中使用 dlsym 按名称调用函数

我不能在 iOS 中按名称调用函数吗?我有一个名为getstring. 我这样称呼它:

当它执行时,responseFiled.text设置为dlsym(...): symbol not found。这意味着dlopen有效但无效dlsymnm我使用并看到存在的二进制文件中的符号_getstring。我检查了手册dlsym它说我不应该在名称中添加下划线。无论如何添加它并不能解决问题。我究竟做错了什么?

我在这里问过一个关于在 Objective-C 中按名称调用函数的类似问题,然后在 Mac 上按照答案成功尝试,所以这个问题似乎是 iOS 特有的。