【发布时间】:2015-03-22 03:21:57
【问题描述】:
有没有办法在linux的GCC编译的C程序中设置堆起始地址?在 x86_64 系统中,我的测试程序将堆地址设置为 4 字节引用地址(小于 FFFFFFFF)。我想将此设置为 8 字节引用地址以进行某些测试(> FFFFFFFF)。 GCC 是否提供任何设置堆起始地址的方法?
【问题讨论】:
标签: c gcc elf heap-memory
有没有办法在linux的GCC编译的C程序中设置堆起始地址?在 x86_64 系统中,我的测试程序将堆地址设置为 4 字节引用地址(小于 FFFFFFFF)。我想将此设置为 8 字节引用地址以进行某些测试(> FFFFFFFF)。 GCC 是否提供任何设置堆起始地址的方法?
【问题讨论】:
标签: c gcc elf heap-memory
您可以使用sbrk() 间接地做到这一点:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
sbrk(0xFFFFFFFF);
printf("%p\n", malloc(1));
return 0;
}
这是通过在一开始就“分配”0xFFFFFFFF 字节来实现的,这样malloc() 可以分配的下一个地址是更高的地址。
【讨论】:
malloc-s 正在使用越来越多的mmap。实际上,sbrk 甚至堆启动在今天并没有太多使用(特别是因为它不是多线程友好的)
sbrk() 将有效地保留从略高于零到超过 0xFFFFFFFF 的所有虚拟地址。所以 mmap() 与否, malloc() 将别无选择,只能按照 OP 的要求返回高地址。你有反例吗?我尝试将上面代码中的 malloc() 大小更改为几兆字节,使其使用 mmap(),但地址甚至更高,从未低于 0xFFFFFFFF。