2015-08-05 2 views
0

https://github.com/joelpet/mallocКак я могу скомпилировать и запустить этот проект?

Я хочу узнать, как создать более эффективный malloc, и я нашел этот проект. Я могу запустить make, чтобы скомпилировать его:

$ make tstmalloc 
make: `tstmalloc' is up to date. 

Но как я могу запустить и протестировать его? Я прочитал файл readme, но он недостаточно подробный. Я хочу скомпилировать все программы, проверить все программы и понять, что делают программы. Но если я бегу просто сделать то жалуется таким образом, что я не понимаю:

$ make 
gcc -g -Wall -ansi -DSTRATEGY=2 -c -o malloc.o malloc.c 
malloc.c: In function ‘morecore’: 
malloc.c:77:3: warning: implicit declaration of function ‘getpagesize’ [-Wimplicit-function-declaration] 
    noPages = ((nu*sizeof(Header))-1)/getpagesize() + 1; 
^
malloc.c:78:84: error: ‘MAP_ANONYMOUS’ undeclared (first use in this function) 
    cp = mmap(__endHeap, noPages*getpagesize(), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); 
                        ^
malloc.c:78:84: note: each undeclared identifier is reported only once for each function it appears in 
malloc.c:85:5: warning: implicit declaration of function ‘perror’ [-Wimplicit-function-declaration] 
    perror("failed to get more memory"); 
    ^
make: *** [malloc.o] Error 1 

И если я пытаюсь скомпилировать программы по отдельности я получаю другой Сообщ ошибки, что я не понимаю:

$ gcc malloc.c 
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 11 

содержимое моего malloc.c является:

#include "brk.h" 
#include <unistd.h> 
#include <string.h> 
#include <errno.h> 
#include <sys/mman.h> 

#define NALLOC 1024          /* minimum #units to request */ 

typedef long Align;          /* for alignment to long boundary */ 

union header {           /* block header */ 
    struct { 
    union header *ptr;         /* next block if on free list */ 
    unsigned size;          /* size of this block - what unit? */ 
    } s; 
    Align x;            /* force alignment of blocks */ 
}; 

typedef union header Header; 

static Header base;          /* empty list to get started */ 
static Header *freep = NULL;       /* start of free list */ 

/* free: put block ap in the free list */ 

void free(void * ap) 
{ 
    Header *bp, *p; 

    if(ap == NULL) return;        /* Nothing to do */ 

    bp = (Header *) ap - 1;        /* point to block header */ 
    for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) 
    if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) 
     break;           /* freed block at atrt or end of arena */ 

    if(bp + bp->s.size == p->s.ptr) {      /* join to upper nb */ 
    bp->s.size += p->s.ptr->s.size; 
    bp->s.ptr = p->s.ptr->s.ptr; 
    } 
    else 
    bp->s.ptr = p->s.ptr; 
    if(p + p->s.size == bp) {        /* join to lower nbr */ 
    p->s.size += bp->s.size; 
    p->s.ptr = bp->s.ptr; 
    } else 
    p->s.ptr = bp; 
    freep = p; 
} 

/* morecore: ask system for more memory */ 

#ifdef MMAP 

static void * __endHeap = 0; 

void * endHeap(void) 
{ 
    if(__endHeap == 0) __endHeap = sbrk(0); 
    return __endHeap; 
} 
#endif 


static Header *morecore(unsigned nu) 
{ 
    void *cp; 
    Header *up; 
#ifdef MMAP 
    unsigned noPages; 
    if(__endHeap == 0) __endHeap = sbrk(0); 
#endif 

    if(nu < NALLOC) 
    nu = NALLOC; 
#ifdef MMAP 
    noPages = ((nu*sizeof(Header))-1)/getpagesize() + 1; 
    cp = mmap(__endHeap, noPages*getpagesize(), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); 
    nu = (noPages*getpagesize())/sizeof(Header); 
    __endHeap += noPages*getpagesize(); 
#else 
    cp = sbrk(nu*sizeof(Header)); 
#endif 
    if(cp == (void *) -1){         /* no space at all */ 
    perror("failed to get more memory"); 
    return NULL; 
    } 
    up = (Header *) cp; 
    up->s.size = nu; 
    free((void *)(up+1)); 
    return freep; 
} 

void * malloc(size_t nbytes) 
{ 
    Header *p, *prevp; 
    Header * morecore(unsigned); 
    unsigned nunits; 

    if(nbytes == 0) return NULL; 

    nunits = (nbytes+sizeof(Header)-1)/sizeof(Header) +1; 

    if((prevp = freep) == NULL) { 
    base.s.ptr = freep = prevp = &base; 
    base.s.size = 0; 
    } 
    for(p= prevp->s.ptr; ; prevp = p, p = p->s.ptr) { 
    if(p->s.size >= nunits) {       /* big enough */ 
     if (p->s.size == nunits)       /* exactly */ 
    prevp->s.ptr = p->s.ptr; 
     else {           /* allocate tail end */ 
    p->s.size -= nunits; 
    p += p->s.size; 
    p->s.size = nunits; 
     } 
     freep = prevp; 
     return (void *)(p+1); 
    } 
    if(p == freep)          /* wrapped around free list */ 
     if((p = morecore(nunits)) == NULL) 
    return NULL;         /* none left */ 
    } 
} 
+2

Какая версия gcc? Это отлично работает для меня с gcc 4.1.2. – dbush

+1

Как вы говорите: «Если я запускаю только что-то, то в манере, которую я не понимаю», возможно, вы, возможно, подумаете о том, чтобы обучить вас навыкам C какой-то менее сложной задачей, чем реализация 'malloc()'? – alk

+0

@dbush Я использую gcc 4.8.4, но, похоже, у меня есть другая версия файла malloc. c по какой-то причине. –

ответ

2
66 static Header *morecore(
67  unsigned nu) /* the amount of memory to ask for (in Header-sized units) */ 
68 { 
69  char *cp; 
70  Header *up; 
71  if (nu < NALLOC) 
72   nu = NALLOC; 
73  cp = sbrk(nu * sizeof(Header)); 
74  if (cp == (char *) -1) /* no space at all */ 
75   return NULL; 
76  up = (Header *) cp; 
77  up->s.size = nu; 
78  free((void *)(up+1)); 
79  return freep; 
80 } 

Ваша ошибка относится к строке 77 из malloc.c есть no_pages = ..., но текущий код на GitHub не так. Поэтому опубликуйте, что у вас есть в вашем malloc.c, или получите последний код от GitHub.

+0

Это странно. Если я запускаю 'git pull', тогда он говорит, что все обновлено, но это не тот же файл. Откуда появился мой файл? Я разместил содержимое моего 'malloc.c' в исходном вопросе сейчас, и это не то же самое, что и последняя версия из репо. Что является причиной этого? –

+0

git gremlins ... – polarysekt

+0

Я снова проверил весь проект, и теперь у меня есть тот же «malloc.c», что и в проекте. Но я все еще не могу ее компилировать и запускать. –

Смежные вопросы