在使用 glibc 时,我尝试使用sbrk使用负参数来减少数据段,并发现了一个最奇怪的行为。
\n我首先使用malloc,然后free使用它,然后使用 减少数据段sbrk,然后malloc再次使用与第一个相同的大小。
问题是,如果malloc大小(两个malloc大小相同)足够小(32k,或八个 4k 页),那么一切都可以正常工作。但是当我增加一点malloc- free-malloc大小(到九个 4k 页)时,我会得到核心转储。更奇怪的是,当我将大小提高malloc到超过mmap阈值(128k)时,我会得到调整中止行为。
C代码:
\n#define _GNU_SOURCE 1\n#include <stdio.h>\n#include <malloc.h>\n#include <unistd.h>\n\n// set MMAP_ALLOC_SIZE to 8 4k-pages it will work, \n// set it to 9 4k-pages it raises a \'segmentation fault (core dumped)\'\n// set it to 33 4k-pages it raises a \'break adjusted to free malloc space\' …Run Code Online (Sandbox Code Playgroud)