一个程序通常依赖于多个库,有时也可能依赖于其他程序。我查看 Wine 之类的项目,并思考它们如何弄清楚程序正在调用什么?
在 Linux 环境中,使用什么方法来了解可执行文件在运行时进行了哪些调用,以便捕获并将它们映射到其他调用?
非常感谢任何代码片段或对资源的引用以供额外阅读:)
最佳答案
在 Linux 上,您正在寻找 LD_PRELOAD 环境变量。这将在程序请求任何内容之前加载您的库。如果您提供的函数定义与目标程序加载的函数定义相匹配,那么您的版本将被调用。
然而,您无法真正检测到程序调用了哪些函数。但是,您可以获取共享库中的所有功能并实现所有这些功能。您并没有真正捕捉这些功能,您只是在重新实现它们。
像 Wine 这样的项目在某些情况下会这样做,但不是在所有情况下。他们还重写了一些动态库。所以当 Win32 加载一些 DLL 时,它实际上是在加载 Wine 版本而不是 native 版本。这本质上与用您自己的函数替换函数的概念相同。
查找 LD_PRELOAD 以获取更多信息。
关于c++ - 在运行时捕获来自程序的调用并将它们映射到其他调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4464431/