为什么不';当我提供自己的malloc和free时,我不会得到链接错误吗?
我正在尝试实现一个简单的fit first内存管理算法。所以我有一个自己的C文件为什么不';当我提供自己的malloc和free时,我不会得到链接错误吗?,c,libc,C,Libc,我正在尝试实现一个简单的fit first内存管理算法。所以我有一个自己的C文件 void* malloc(size_t) 及 使用gcc生成.out文件时,我预期会出现链接错误,因为它会与现有的标准实现冲突。但是我的文件链接很好 请帮助我理解。根据我的经验,对自定义malloc和free进行唯一命名是标准做法,例如内核malloc、kmalloc和内核free、kfree。如果您正在编写自己的函数,我建议为您的函数指定一个单独的名称 您计划如何分配内存?大多数情况下,您应该围绕mall
void* malloc(size_t)
及
使用gcc生成.out
文件时,我预期会出现链接错误,因为它会与现有的标准实现冲突。但是我的文件链接很好
请帮助我理解。根据我的经验,对自定义malloc和free进行唯一命名是标准做法,例如内核malloc、kmalloc和内核free、kfree。如果您正在编写自己的函数,我建议为您的函数指定一个单独的名称 您计划如何分配内存?大多数情况下,您应该围绕malloc函数来提供自定义功能,但最终还是以某种形式使用malloc。在我看来,这是您应该采取的路线,因此我不会太匆忙地处理内置的malloc和free函数,除非您有充分的理由(或强烈的愿望)这样做。将它们命名为同一名称会影响这一点 ,只是让你感觉到你在看什么 我希望出现链接错误,因为它将与现有的标准实现冲突 您的期望是错误的:大多数UNIX libc实现都支持使用其他malloc。为此,他们将
malloc
、realloc
、free
等放入一个单独的对象文件中,或将每个文件放入自己的对象文件中
然后,链接器可以自由地用您的实现替换libc.a
中的malloc.o
。您可以阅读链接器使用的算法。一旦理解了算法,就应该清楚为什么链接自己的malloc
和free
不会导致链接错误
UNIX共享库是专门为模拟归档库而设计的,因此,尽管使用libc.so
链接时没有出现链接错误的详细信息有所不同,但其精神是相同的
但是,您还没有完成。将任何中等复杂的程序与您的实现链接可能会崩溃,因为当您更换
malloc
时,您还需要实现realloc
,并且可能需要calloc
和memalign
和posix_memalign
。否则,您将得到一个混合的实现,当有人将realloc
ed指针传递到您的free
,事情很可能会爆炸。我认为使用链接顺序以这种方式“覆盖”例程是可以接受的做法,因此默认情况下没有链接错误/警告,但是它真的运行你的代码吗?GCC的malloc和free内置项可能会覆盖您的。@IBY:好的观点-OP可能需要-fno-builtin
或-fno-builtin-malloc-fno-builtin-free
来确保调用他的例程。那么,您在哪个系统上?如果这是在linux上,那么glibc中的malloc/etc是弱符号,这意味着您可以用自己的符号覆盖它们。看这里:
void free(void*)