我试图用malloc
拦截LD_PRELOAD
电话。我想通过将malloc
更改为shm_open
后跟mmap
将所有内存分配移动到共享内存。我该怎么做?
malloc
的LD_PRELOAD工作正常。我可以拦截每个malloc
电话。然而,在截获的shm_open
中调用malloc
失败是因为shm_open
需要链接librt
链接到libdl
,而LD_PRELOAD需要dlsym
。有一个递归的插入。我想过创建一个包装共享内存分配的静态库。然后从截获的malloc
中调用它。但librt
无法动态链接。
我该怎么做?
一般来说,你不能。
如果你想插入像malloc
这样的低级函数,最好的办法就是只使用较低级别的直接系统调用。
使用任何更高级别的东西,比如shm_open
,很快就会遇到麻烦。即使shm_open
今天没有使用librt
和dlopen
,也没有什么可以阻止它明天这样做(并打破你精心构造的卡片屋)。
除了明显的直接递归问题,还可能存在“初始化顺序”问题(例如shm_open
可能需要malloc
和librt
已初始化,这在调用第一个malloc
时无法保证)。