c++ - 在运行时捕获来自程序的调用并将它们映射到其他调用

标签 c++ c linux theory

一个程序通常依赖于多个库,有时也可能依赖于其他程序。我查看 Wine 之类的项目,并思考它们如何弄清楚程序正在调用什么?

在 Linux 环境中,使用什么方法来了解可执行文件在运行时进行了哪些调用,以便捕获并将它们映射到其他调用?

非常感谢任何代码片段或对资源的引用以供额外阅读:)

最佳答案

在 Linux 上,您正在寻找 LD_PRELOAD 环境变量。这将在程序请求任何内容之前加载您的库。如果您提供的函数定义与目标程序加载的函数定义相匹配,那么您的版本将被调用。

然而,您无法真正检测到程序调用了哪些函数。但是,您可以获取共享库中的所有功能并实现所有这些功能。您并没有真正捕捉这些功能,您只是在重新实现它们。

像 Wine 这样的项目在某些情况下会这样做,但不是在所有情况下。他们还重写了一些动态库。所以当 Win32 加载一些 DLL 时,它实际上是在加载 Wine 版本而不是 native 版本。这本质上与用您自己的函数替换函数的概念相同。

查找 LD_PRELOAD 以获取更多信息。

关于c++ - 在运行时捕获来自程序的调用并将它们映射到其他调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4464431/

相关文章:

c++ - 在 C++ 中运行 CMD 行使用变量(不是字符串文字)作为参数

c++ - 如何将 Arduino 的模拟输入读数从草图转换为 .WAV

c - C语言中反转字符串的TCP程序给出一半的结果

c++ - Mac 和 Linux 上 C++11 异步行为的差异

c++ - Linux共享内存只允许读访问

c - 实现 FastCGI++ 库的守护进程的正确 Lighttpd 配置是什么?

c++ - 使用 wxNotebook 时如何检索页面 ID?

c++ reinterpret_cast、虚拟和模板好吗?

java - MicroEJ UART 和其他 GPIO 中断与 STM32F746G-DISCO

c# - 打印断言错误后使应用程序正常关闭