【发布时间】:2014-06-23 18:00:10
【问题描述】:
我正在设计一个小型实用程序来帮助构建系统。这个想法是该实用程序将启动每个编译器的每个实例并输出编译器在编译期间打开的所有文件的日志。比如:
track-files cc -c -o foo.o foo.c
然后track-files 执行cc 并输出cc 打开的所有.h(和其他)文件。但是cc 可能是任何编译器(甚至是解释器,或者只是进行某种文本转换的程序)。
Paul D Smith's Advanced Auto-Dependency tutorial 中描述了类似的想法,并归因于 Han-Wen Nienhuys。
在 Linux、FreeBSD、Solaris 和 HPUX 上,我想我可以使用 LD_PRELOAD。在 AIX 上我可以使用LDR_PRELOAD,在 OSX 上我可以使用DYLD_INSERT_LIBRARIES。在大多数这些系统上,如果 LD_PRELOAD 之类的技巧不起作用,我也可以使用 strace。
我不知道如何继续的一个操作系统是 Windows。我一直在环顾四周,到目前为止,我发现的一切似乎……都不令人满意。
LD_PRELOAD equivalent for Windows to preload shared libraries 的唯一答案建议使用 AppInit_DLL,但指出它们在 Vista 之后已被弃用和/或禁用(因为它们已损坏)。
interposers on Windows 上已接受的答案指向 Microsoft Research 的 Detours,但这是专有的(并且他们为 64 位支持收取大笔费用(10000 美元!!!),所以这将使我的实用程序对几乎每个人都毫无价值(包括我)。另一个答案提到了一种叫做 WinAPI Override 的东西,但这显然是 32 位的。
肯定有一些可靠的、非专有的、程序化的方式可以在 Windows 上执行此操作。也许是一些跟踪 API?我很乐意仅支持更新版本的 Windows(例如 Windows 7 和 8)。
【问题讨论】:
-
this 之类的东西也许就是您要找的东西?我没有听说过它只有 32 位,但我想你只能用 64 位程序挂钩 64 位进程(同样适用于 32 位)。
-
当然可以,因为Process Monitor可以做到;我认为使用文件系统过滤器驱动程序。
标签: windows build hook system-calls trace