在C程序中设置堆的起始地址?

在C程序中设置堆的起始地址?,c,gcc,elf,heap-memory,C,Gcc,Elf,Heap Memory,有没有办法在linux中的GCC编译C程序中设置堆开始地址?在x86_64系统中,我的测试程序将堆地址设置为4字节引用地址(小于FFFFFF)。我想将其设置为8字节的引用地址,以便进行一些测试(>FFFFFFFF)。GCC是否提供了设置堆开始地址的方法 您可以使用sbrk()间接地执行此操作: #包括 #包括 #包括 内部主(空) { sbrk(0xFFFFFF); printf(“%p\n”,malloc(1)); 返回0; } 这是通过在一开始就“分配”0xFFFFFF字节来实现的,因此m

有没有办法在linux中的GCC编译C程序中设置堆开始地址?在x86_64系统中,我的测试程序将堆地址设置为4字节引用地址(小于FFFFFF)。我想将其设置为8字节的引用地址,以便进行一些测试(>FFFFFFFF)。GCC是否提供了设置堆开始地址的方法

您可以使用
sbrk()
间接地执行此操作:

#包括
#包括
#包括
内部主(空)
{
sbrk(0xFFFFFF);
printf(“%p\n”,malloc(1));
返回0;
}

这是通过在一开始就“分配”0xFFFFFF字节来实现的,因此
malloc()
可以分配的下一个东西是更高的地址。

可能并不总是有效,因为大多数
malloc
-s正在使用越来越多的
mmap
。实际上,
sbrk
甚至heap start现在都没有太多使用(特别是因为它不是多线程友好的)@BasileStarynkevitch:using
sbrk()
将有效地保留从零上一点到0xffffff上的所有虚拟地址。因此,无论是否为mmap(),malloc()将别无选择,只能根据OP请求返回高地址。你有反例吗?我尝试将上面代码中的malloc()大小更改为几兆字节,这使得它使用mmap(),但地址甚至更高,从未低于0xffffff。@John Zwinck,它不会从地址0保留,它将从当前数据段开始的任何位置保留-可能有很多东西映射到较低的地址。从理论上讲,malloc实现可能会在映射的某个地方找到一个漏洞来进行分配。@no:我不太清楚这将如何发生:malloc()将调用sbrk(),这只能增加片段,而不是“在映射中找到漏洞”。我准备相信你是对的,从技术上讲,它可能会以这种方式发生,我只是不知道如何…除非mmap()给出低地址,我所看到的64位系统上似乎没有这种情况。无论如何,这个解决方案对于OP来说似乎已经足够好了,但是很高兴能理解其中的细节。请定义“堆开始地址”对您来说是什么。大多数
malloc
-s都在使用
mmap
(这取决于…),您为什么要问?为什么你会在意呢?我正在调试一个崩溃,它似乎发生在堆超过4字节的时候,我猜这可能是由于指向整数赋值的指针造成的。但是我的测试程序总是在4字节的可寻址空间中有堆。这不能用链接器完成吗?使用
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
  sbrk(0xFFFFFFFF);
  printf("%p\n", malloc(1));
  return 0;
}