【发布时间】:2020-04-18 07:23:41
【问题描述】:
我正在编写自己的 malloc 并使用 LD_PRELOAD 技巧来使用它。我需要能够为对堆的每次内存访问执行自定义功能,包括读取和写入(性能不是问题,功能是目标)。
例如,对于一些类似的代码
int x = A[5];
我希望能够捕获来自(A + 5) 的读取,而不是从该内存位置读取,而是返回我自己的自定义值以存储在x 中。
我目前的想法是:
-
mprotect离开,处理生成的 SIGSEGV 并在处理程序中做我需要做的事情。据我所知,我可以访问void *si_addr中的错误地址,但我不确定如何区分读取和写入 - 即使我确实做到了,我也不知道如何处理写入,因为我不知道要在处理程序中写入的值。 - 调整 gcc 以专门处理内存访问。根据我的阅读,理解 gcc 代码需要一段时间,除非它的 IR/抽象程序集方便地隔离内存加载/存储,否则我不确定这有多实用。
欢迎提出任何建议。
【问题讨论】:
-
如果没有内核支持和对编译器代码生成器的普遍修改,我看不出它是如何在本机工作的。我估计这项任务非常艰巨。实现支持所需语义的虚拟机可能更容易,但如果您必须从头开始,这仍然是一项艰巨的工作。
-
如果不限于LD_PRELOADing,还可以动态重写将要执行的代码,就像valgrind的memcheck和Sun的dbx的memory access checking一样。