diff options
author | Eric Andersen <andersen@codepoet.org> | 2004-07-30 03:32:41 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2004-07-30 03:32:41 +0000 |
commit | a707192f6c249d397594b2d6a0b2f38f3cdf4da7 (patch) | |
tree | a835c0f9b5cfdb45b85a2d545865c85c1861e7a1 /ldso/ldso | |
parent | 51987d4c7d42027a86c8fbedda559dde76a18a21 (diff) |
Teach libdl to use normal libc symbols whenever possible, i.e. malloc
rather than _dl_malloc, fprintf rather than _dl_printf, etc.
-Erik
Diffstat (limited to 'ldso/ldso')
-rw-r--r-- | ldso/ldso/.cvsignore | 1 | ||||
-rw-r--r-- | ldso/ldso/Makefile | 9 | ||||
-rw-r--r-- | ldso/ldso/dl-elf.c | 37 | ||||
-rw-r--r-- | ldso/ldso/ldso.c | 44 |
4 files changed, 42 insertions, 49 deletions
diff --git a/ldso/ldso/.cvsignore b/ldso/ldso/.cvsignore index 5fe696107..90e77f02f 100644 --- a/ldso/ldso/.cvsignore +++ b/ldso/ldso/.cvsignore @@ -1,2 +1 @@ ld-uclibc.so* -dl-progname.h diff --git a/ldso/ldso/Makefile b/ldso/ldso/Makefile index db493c3bc..3c1d04530 100644 --- a/ldso/ldso/Makefile +++ b/ldso/ldso/Makefile @@ -70,18 +70,13 @@ XXFLAGS := $(XXFLAGS:-fomit-frame-pointer=) all: lib -lib:: dl-progname.h $(OBJS) $(DLINK_OBJS) +lib:: $(OBJS) $(DLINK_OBJS) $(LD) $(LDFLAGS) -e _dl_boot -soname=$(UCLIBC_LDSO) \ -o $(LDSO_FULLNAME) $(OBJS) $(LIBGCC); $(INSTALL) -d $(TOPDIR)lib $(INSTALL) -m 755 $(LDSO_FULLNAME) $(TOPDIR)lib $(LN) -sf $(LDSO_FULLNAME) $(TOPDIR)lib/$(UCLIBC_LDSO) -dl-progname.h: Makefile - echo "const char *_dl_progname=\""$(UCLIBC_LDSO)"\";" > dl-progname.h - echo "#include \"$(TARGET_ARCH)/elfinterp.c\"" >> dl-progname.h - - $(COBJS): %.o : %.c $(CC) $(XXFLAGS) -I../libdl -c $< -o $@ $(STRIPTOOL) -x -R .note -R .comment $*.o @@ -93,4 +88,4 @@ $(AOBJS): %.o : %.S ldso.o: $(CSRC) clean: - $(RM) $(UCLIBC_LDSO)* $(OBJS) $(LDSO_FULLNAME)* core *.o *.a *.s *.i dl-progname.h ldso.h *~ + $(RM) $(UCLIBC_LDSO)* $(OBJS) $(LDSO_FULLNAME)* core *.o *.a *.s *.i ldso.h *~ diff --git a/ldso/ldso/dl-elf.c b/ldso/ldso/dl-elf.c index d27e4ccb3..2dd6fc4d0 100644 --- a/ldso/ldso/dl-elf.c +++ b/ldso/ldso/dl-elf.c @@ -888,40 +888,3 @@ char *_dl_strdup(const char *string) return retval; } -void *(*_dl_malloc_function) (size_t size) = NULL; -void *_dl_malloc(int size) -{ - void *retval; - -#if 0 -#ifdef __SUPPORT_LD_DEBUG_EARLY__ - _dl_dprintf(2, "malloc: request for %d bytes\n", size); -#endif -#endif - - if (_dl_malloc_function) - return (*_dl_malloc_function) (size); - - if (_dl_malloc_addr - _dl_mmap_zero + size > _dl_pagesize) { -#ifdef __SUPPORT_LD_DEBUG_EARLY__ - _dl_dprintf(2, "malloc: mmapping more memory\n"); -#endif - _dl_mmap_zero = _dl_malloc_addr = _dl_mmap((void *) 0, size, - PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - if (_dl_mmap_check_error(_dl_mmap_zero)) { - _dl_dprintf(2, "%s: mmap of a spare page failed!\n", _dl_progname); - _dl_exit(20); - } - } - retval = _dl_malloc_addr; - _dl_malloc_addr += size; - - /* - * Align memory to 4 byte boundary. Some platforms require this, others - * simply get better performance. - */ - _dl_malloc_addr = (unsigned char *) (((unsigned long) _dl_malloc_addr + 3) & ~(3)); - return retval; -} - - diff --git a/ldso/ldso/ldso.c b/ldso/ldso/ldso.c index 9b7c7380e..a37b250ce 100644 --- a/ldso/ldso/ldso.c +++ b/ldso/ldso/ldso.c @@ -41,13 +41,12 @@ char *_dl_library_path = 0; /* Where we look for libraries */ char *_dl_preload = 0; /* Things to be loaded before the libs */ char *_dl_ldsopath = 0; /* Location of the shared lib loader */ -unsigned char *_dl_malloc_addr = 0; /* Lets _dl_malloc use the already allocated memory page */ -unsigned char *_dl_mmap_zero = 0; /* Also used by _dl_malloc */ unsigned long *_dl_brkp = 0; /* The end of the data segment for brk and sbrk */ unsigned long *_dl_envp = 0; /* The environment address */ int _dl_secure = 1; /* Are we dealing with setuid stuff? */ int _dl_errno = 0; /* We can't use the real errno in ldso */ size_t _dl_pagesize = 0; /* Store the page size for use later */ +struct r_debug *_dl_debug_addr = NULL; /* Used to communicate with the gdb debugger */ @@ -74,8 +73,8 @@ void _dl_debug_state(void) { } -/* This global variable is also to communicate with debuggers such as gdb. */ -struct r_debug *_dl_debug_addr = NULL; +static unsigned char *_dl_malloc_addr = 0; /* Lets _dl_malloc use the already allocated memory page */ +static unsigned char *_dl_mmap_zero = 0; /* Also used by _dl_malloc */ @@ -757,5 +756,42 @@ static int _dl_suid_ok(void) return 0; } +void *(*_dl_malloc_function) (size_t size) = NULL; +void *_dl_malloc(int size) +{ + void *retval; + +#if 0 +#ifdef __SUPPORT_LD_DEBUG_EARLY__ + _dl_dprintf(2, "malloc: request for %d bytes\n", size); +#endif +#endif + + if (_dl_malloc_function) + return (*_dl_malloc_function) (size); + + if (_dl_malloc_addr - _dl_mmap_zero + size > _dl_pagesize) { +#ifdef __SUPPORT_LD_DEBUG_EARLY__ + _dl_dprintf(2, "malloc: mmapping more memory\n"); +#endif + _dl_mmap_zero = _dl_malloc_addr = _dl_mmap((void *) 0, size, + PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if (_dl_mmap_check_error(_dl_mmap_zero)) { + _dl_dprintf(2, "%s: mmap of a spare page failed!\n", _dl_progname); + _dl_exit(20); + } + } + retval = _dl_malloc_addr; + _dl_malloc_addr += size; + + /* + * Align memory to 4 byte boundary. Some platforms require this, others + * simply get better performance. + */ + _dl_malloc_addr = (unsigned char *) (((unsigned long) _dl_malloc_addr + 3) & ~(3)); + return retval; +} + + #include "dl-hash.c" #include "dl-elf.c" |