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 */
}
}
Какая версия gcc? Это отлично работает для меня с gcc 4.1.2. – dbush
Как вы говорите: «Если я запускаю только что-то, то в манере, которую я не понимаю», возможно, вы, возможно, подумаете о том, чтобы обучить вас навыкам C какой-то менее сложной задачей, чем реализация 'malloc()'? – alk
@dbush Я использую gcc 4.8.4, но, похоже, у меня есть другая версия файла malloc. c по какой-то причине. –