【问题标题】:issue in putting custom fields in struct malloc_chunk将自定义字段放入 struct malloc_chunk 的问题
【发布时间】: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. 问题,我只是在结构中添加了 1 个头标签,这样它就变成了

    结构 malloc_shunk { INTERNAL_SIZE 脚标签; INTERNAL_SIZE prev_size; INTERNAL_SIZE 大小; INTERNAL_SIZE 头标签; } 现在 malloc 返回的指针和块的开始之间的差异将是 16,这将始终是双字对齐的。但是在这里我面临一个更大的问题,因为当第一个 malloc 被调用时,arena 被设置并且 bin 被初始化。这里的受害者的大小不会像正常情况下那样为零。问题在于,victim->size 实际上是存储“top”而不是“last_remainder”的地方。如果有任何其他方法/解决方法/解决方案,我想征求您的意见,以便我可以解决我目前面临的竞技场问题的初始化。

感谢和问候, 卡皮尔

【问题讨论】:

    标签: malloc glibc


    【解决方案1】:

    根据我所学到的,尽量不要修改结构 malloc_chunk。即使您必须确保顶部指针最初为 0,否则永远不会形成堆。它的 _int_malloc() 中的 sSYSMALLOC() 函数首先从内核中 MMAPs 一个更大的块。只有当 top 最初为 0 时才会调用它。

    【讨论】:

      猜你喜欢
      • 2016-01-20
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      • 2014-11-13
      • 2019-01-20
      • 1970-01-01
      • 2013-07-28
      • 2019-03-23
      相关资源
      最近更新 更多