我想拦截 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
因为这是针对不支持此类东西的最小“计算节点”内核。