将自定义字段放在struct malloc_chunk中的问题

时间:2011-09-12 07:21:44

标签: malloc glibc

我想在struct malloc_chunk中添加head-tag和foot标签,如下所示:

  struct malloc_shunk {
       INTERNAL_SIZE prev_size;
       INTERNAL_SIZE size;
       }

这就是我所做的:

1

  struct malloc_shunk {
       INTERNAL_SIZE foot_tag;
       INTERNAL_SIZE prev_size;
       INTERNAL_SIZE size;
       }

在将head_tag放入malloc_chunk之前,我只添加了foot_tag并编译了glibc。我做了一个小测试程序,从系统中取出了60个字节,然后释放它。你可以看到malloc正常返回,自由抱怨,说“无效指针”。返回的指针malloc是0x9313010。这使得指向malloc_chunk开头的指针为0x9313004。 所以当free通过0x9313010时,它将它转换为0x9313004到(mem2chunk)并检查它是否对齐。由于我的单词大小为4,因此使用0x9313010进行对齐检查是我遇到问题的地方。你能告诉我Mem指针(由malloc返回)是否需要绝对双字对齐。 (因为它可能不满足该标准,因为malloc返回的指针和块的开始之间的差异在这里将是12个字节,而不是8个。)

  1. 要发生这个问题,我只是在结构中添加了1个head-tag,以便它成为

    struct malloc_shunk {        INTERNAL_SIZE foot_tag;        INTERNAL_SIZE prev_size;        INTERNAL_SIZE大小;        INTERNAL_SIZE head_tag;        } 现在,malloc返回的指针和chunk的开始之间的差异将是16,它将始终是双字对齐的。但在这里我面临一个更大的问题,因为第一个malloc被称为竞技场的时间是设置并且箱子被初始化。这里受害者的人数并不是零,因为在正常情况下应该是这样。问题是,受害者 - >尺寸实际上是存储“顶部”而不是“last_remainder”的地方。如果有任何其他方式/解决方法/解决方案,我想问你的意见,这样我就可以完成我目前面临的竞技场问题的初始化。

  2. 谢谢和问候, 卡皮尔

1 个答案:

答案 0 :(得分:0)

从我学到的东西,尽量不要修改malloc_chunk结构。即使你必须确保顶部指针最初为0,否则永远不会形成堆。它是_int_malloc()中的sYSMALLOC()函数,它首先从内核MMAP中获取更大的块。仅当top最初为0时才会调用它。