我想拦截 dlopen() 内部发生的所有文件系统访问。起初,这似乎是LD_PRELOAD或-Wl,-wrap,将是可行的解决方案,但由于一些技术原因,我无法让它们工作:
ld.so 在处理 LD_PRELOAD 时已经映射了它自己的符号。拦截初始加载对我来说并不重要,但此时
_dl_*工作函数已解决,因此未来的调用会通过它们。我认为LD_PRELOAD为时已晚。不知何故
malloc绕过了上面的问题,因为malloc()ld.so 内部没有函数free(),它只是调用memset().文件系统工作函数,例如
__libc_read(),包含在ld.so其中是静态的,所以我不能用-Wl,-wrap,__libc_read.
这可能都意味着我需要ld.so直接从源代码构建自己的,而不是将其链接到包装器中。那里的挑战是两者libc都是rtld-libc从同一来源构建的。我知道宏IS_IN_rtld是在构建时定义的rtld-libc,但是如何保证只有一个静态数据结构的副本,同时仍然导出公共接口函数?(这是一个 glibc 构建系统问题,但我还没有找到这些细节的文档。)
有没有更好的进入方法dlopen()?
注意:我不能使用特定于 Linux 的解决方案,FUSE因为这是针对不支持此类东西的最小“计算节点”内核。