2015-01-23 1 views
4

리눅스의 GCC 컴파일 된 C 프로그램에서 힙 시작 주소를 설정하는 방법이 있습니까? x86_64 시스템에서 테스트 프로그램은 힙 주소를 4 바이트 참조 주소 (FFFFFFFF 미만)로 설정합니다. 일부 테스트 (> FFFFFFFF) 8 바이트 참조 된 주소로 설정하고 싶습니다. GCC는 힙 시작 주소를 설정하는 방법을 제공합니까?C 프로그램에서 힙 시작 주소를 설정 하시겠습니까?

+2

"힙 시작 주소"가 무엇인지 정의하십시오. 대부분의 malloc은 mmap을 사용하고 있습니다. (그리고 ASLR (https://en.wikipedia.org/wiki/Address_space_layout_randomization) ...) –

+2

왜 물어 보시겠습니까? 너 왜 신경 쓰냐? –

+0

힙이 4 바이트 이상일 때 일어나는 것 같은 크래시를 디버깅 중입니다. 정수 할당에 대한 포인터 때문에이 문제가 발생할 수 있습니다. 하지만 내 테스트 프로그램은 항상 4 바이트의 주소 공간을 가지고있다. – kumar

답변

3

당신은 조금 간접적으로 sbrk()를 사용하여이 작업을 수행 할 수 있습니다 malloc() 할당 할 수있는 다음 일은 더 높은 주소되도록 0xFFFFFFFF로는, 매우 시작에서 바이트이 "할당"에 의해 작동

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

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

합니다.

+0

대부분의 malloc은 점점 더 많은 mmap을 사용하고 있기 때문에 언제나 작동하지 않을 수도 있습니다. 사실,'sbrk' 또는 힙 시작은 오늘날 많이 사용되지 않습니다 (특히 멀티 쓰레드가 아니기 때문에) –

+0

@BasileStarynkevitch :'sbrk()'를 사용하면 모든 가상 주소를 효과적으로 0 이상의 비트부터 0xFFFFFFFF까지 예약합니다 . 따라서 mmap()은 malloc()이 OP가 요청한대로 높은 주소를 리턴 할 수 밖에 없습니다. 반례가 있습니까? 위의 코드에서 mmap()을 사용하도록 만든 몇 메가 바이트가되도록 malloc() 크기를 변경해 보았습니다. 그러나 주소는 0xFFFFFFFF보다 작았습니다. –

+0

@ 존 Zwinck 글쎄, 그것은 주소 0에서 예약하지 않습니다, 그것은 현재 데이터 세그먼트가 시작 어디에서 예약합니다 - 거기에 물건을 많이 낮은 주소에 매핑 될 수 있습니다. 이론적으로 malloc 구현은 할당 할 어딘가에 매핑에 구멍을 찾을 수 있습니다. – nos

관련 문제