我想在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个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”的地方。如果有任何其他方式/解决方法/解决方案,我想问你的意见,这样我就可以完成我目前面临的竞技场问题的初始化。
谢谢和问候, 卡皮尔
答案 0 :(得分:0)
从我学到的东西,尽量不要修改malloc_chunk结构。即使你必须确保顶部指针最初为0,否则永远不会形成堆。它是_int_malloc()中的sYSMALLOC()函数,它首先从内核MMAP中获取更大的块。仅当top最初为0时才会调用它。