我想为了记录调用而覆盖对各种API的某些函数调用,但我也可能希望在将数据发送到实际函数之前对其进行操作.
例如,假设我getObjectName
在源代码中使用了一个名为数千次的函数.我想暂时覆盖此函数,因为我想更改此函数的行为以查看不同的结果.
我创建了一个像这样的新源文件:
#include <apiheader.h>
const char *getObjectName (object *anObject)
{
if (anObject == NULL)
return "(null)";
else
return "name should be here";
}
Run Code Online (Sandbox Code Playgroud)
我像往常一样编译所有其他源代码,但是在链接API的库之前我首先将它链接到此函数.这工作正常,但我显然不能在我的重写函数中调用真正的函数.
是否有一种更简单的方法来"覆盖"一个函数而不会链接/编译错误/警告?理想情况下,我希望能够通过编译和链接一个或多个额外的文件来覆盖该函数,而不是通过链接选项或改变我的程序的实际源代码.
以下是我的应用程序的上下文:我正在使用嵌入式系统,该系统使用来自不同设备的RAM.微控制器内部RAM(128kB)中的一部分是外部RAM(1MB).这些存储器映射到微控制器的地址空间,但是在非连续区域中.
内部RAM用于系统堆栈,任务堆栈和堆.外部RAM用于静态分配的数据(池,缓冲区和所有" static ...
"内容)
我正在尝试实现一个简单的内存管理结构,并且作为其中的一部分能够创建一个分配器,它可以使用分配算法,operator new
但使用另一个内存源,而不是系统堆,而是其他地方的内存区域.你知道这是否可行?
使用的一个示例可以是保留100kB的外部RAM并创建一个分配器来管理它,然后将其分配给需要该内存的指定任务.
static const uint8_t* ramBase = reinterpret_cast<uint8_t*>(0x80000000);
static const uint32_t ramAreaSize = 0x19000; //100kB
BufferAllocator allocator(ramBase, ramAreaSize);
//...
//Assuming operator new is overloaded to use BufferAllocator
MyObject * obj = new (allocator) MyObject(some, parameter);
//...
Run Code Online (Sandbox Code Playgroud)
问题是:如何(如果这是可能的话)我可以实现BufferAllocator
以便operator new
用来管理原始内存区域?
void* BufferAllocator::allocate(uint32_t bytes)
{
//I would like to write something like this
//and so let the responsibility to manage this memory area to "new"
//so I don't have to reimplement …
Run Code Online (Sandbox Code Playgroud) 我想重写目标文件,以便将大多数函数的地址更改为无操作函数。我怎样才能做到这一点?
更多上下文:在 C++ 中,我想默认自动模拟所有函数。从打电话a()
和a() {}
打电话b()
到b() {}
真正a()
打电话replacement() {}
和b()
也打电话(相同)replacement() {}
。
到目前为止我考虑过的事情:
objcopy --redefine-syms=filename
- 这改变了符号的名称,而不是它的地址。--wrap
参数 - 这需要__wrap_NameOfWrappedThing
为我想要包装的每个东西编译一个不同的符号,并且通常看起来它不能很好地缩放。