【发布时间】:2011-09-12 07:21:43
【问题描述】:
我正在尝试在 struct malloc_chunk 中放置一个头标签和一个脚标签,如下所示:
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 时,它通过 (mem2chunk) 将其转换为 0x9313004 并检查它是否对齐。由于我的字长为 4,因此与 0x9313010 的对齐检查是我遇到问题的地方。你能告诉我 Mem 指针(由 malloc 返回)是否需要绝对双字对齐。 (因为这里它可能不满足该标准,因为 malloc 返回的指针和块的开始之间的差异将是 12 字节而不是 8)。
-
为了永远 1. 问题,我只是在结构中添加了 1 个头标签,这样它就变成了
结构 malloc_shunk { INTERNAL_SIZE 脚标签; INTERNAL_SIZE prev_size; INTERNAL_SIZE 大小; INTERNAL_SIZE 头标签; } 现在 malloc 返回的指针和块的开始之间的差异将是 16,这将始终是双字对齐的。但是在这里我面临一个更大的问题,因为当第一个 malloc 被调用时,arena 被设置并且 bin 被初始化。这里的受害者的大小不会像正常情况下那样为零。问题在于,victim->size 实际上是存储“top”而不是“last_remainder”的地方。如果有任何其他方法/解决方法/解决方案,我想征求您的意见,以便我可以解决我目前面临的竞技场问题的初始化。
感谢和问候, 卡皮尔
【问题讨论】: