summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2001-07-13 06:05:01 +0000
committerEric Andersen <andersen@codepoet.org>2001-07-13 06:05:01 +0000
commit8fbaabf32397d26402f6f1e1165a31030630346c (patch)
tree72de5bff0afb995726fc3d941756abe28916f306
parente3424a396a633d010bc2c91dbd6cb61ae6366645 (diff)
This takes about 6k off the size of the x86 shared lib loader...
-Erik
-rw-r--r--ldso/ldso/Makefile2
-rw-r--r--ldso/ldso/arm/elfinterp.c32
-rw-r--r--ldso/ldso/boot1.c149
-rw-r--r--ldso/ldso/dl-elf.c24
-rw-r--r--ldso/ldso/hash.h36
-rw-r--r--ldso/ldso/i386/elfinterp.c30
-rw-r--r--ldso/ldso/ld-uClibc.c149
-rw-r--r--ldso/ldso/ld_hash.h36
-rw-r--r--ldso/ldso/ld_string.h37
-rw-r--r--ldso/ldso/ldso.c149
-rw-r--r--ldso/ldso/m68k/elfinterp.c34
-rw-r--r--ldso/ldso/powerpc/elfinterp.c54
-rw-r--r--ldso/ldso/readelflib1.c24
-rw-r--r--ldso/ldso/sparc/elfinterp.c42
-rw-r--r--ldso/ldso/string.h37
-rw-r--r--ldso/ldso/vsprintf.c291
16 files changed, 570 insertions, 556 deletions
diff --git a/ldso/ldso/Makefile b/ldso/ldso/Makefile
index b0586fc30..9fa1e7c05 100644
--- a/ldso/ldso/Makefile
+++ b/ldso/ldso/Makefile
@@ -30,7 +30,7 @@ TARGET_CFLAGS += #-DDL_DEBUG #-funroll-loops
LDSO_FULLNAME=ld-uClibc-$(MAJOR_VERSION).$(MINOR_VERSION).so
TARGET_CFLAGS+=-fPIC -D__PIC__ -DUCLIBC_ROOT_DIR=\"$(DEVEL_PREFIX)\" -DUCLIBC_BUILD_DIR=\"$(shell cd $(TOPDIR); pwd)\"
-CSRC= boot1.c hash.c readelflib1.c vsprintf.c $(TARGET_ARCH)/elfinterp.c
+CSRC= boot1.c hash.c readelflib1.c $(TARGET_ARCH)/elfinterp.c
COBJS=$(patsubst %.c,%.o, $(CSRC))
ASRC=$(shell ls $(TARGET_ARCH)/*.S)
AOBJS=$(patsubst %.S,%.o, $(ASRC))
diff --git a/ldso/ldso/arm/elfinterp.c b/ldso/ldso/arm/elfinterp.c
index 397610bd6..09b934a1a 100644
--- a/ldso/ldso/arm/elfinterp.c
+++ b/ldso/ldso/arm/elfinterp.c
@@ -81,7 +81,7 @@ unsigned long _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry)
strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr);
if (reloc_type != R_ARM_JUMP_SLOT) {
- _dl_fdprintf(2, "%s: Incorrect relocation type in jump relocations\n",
+ _dl_fprintf(2, "%s: Incorrect relocation type in jump relocations\n",
_dl_progname);
_dl_exit(1);
};
@@ -92,7 +92,7 @@ unsigned long _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry)
got_addr = (char **) instr_addr;
#ifdef DL_DEBUG
- _dl_fdprintf(2, "Resolving symbol %s\n",
+ _dl_fprintf(2, "Resolving symbol %s\n",
strtab + symtab[symtab_index].st_name);
#endif
@@ -100,13 +100,13 @@ unsigned long _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry)
new_addr = _dl_find_hash(strtab + symtab[symtab_index].st_name,
tpnt->symbol_scope, (unsigned long) got_addr, tpnt, 0);
if (!new_addr) {
- _dl_fdprintf(2, "%s: can't resolve symbol '%s'\n",
+ _dl_fprintf(2, "%s: can't resolve symbol '%s'\n",
_dl_progname, strtab + symtab[symtab_index].st_name);
_dl_exit(1);
};
#ifdef DL_DEBUG
if ((unsigned long) got_addr < 0x40000000) {
- _dl_fdprintf(2, "Calling library function: %s\n",
+ _dl_fprintf(2, "Calling library function: %s\n",
strtab + symtab[symtab_index].st_name);
} else {
*got_addr = new_addr;
@@ -156,13 +156,13 @@ void _dl_parse_lazy_relocation_information(struct elf_resolve *tpnt,
*reloc_addr += (unsigned long) tpnt->loadaddr;
break;
default:
- _dl_fdprintf(2, "%s: (LAZY) can't handle reloc type ",
+ _dl_fprintf(2, "%s: (LAZY) can't handle reloc type ",
_dl_progname);
#ifdef VERBOSE_DLINKER
- _dl_fdprintf(2, "%s ", _dl_reltypes[reloc_type]);
+ _dl_fprintf(2, "%s ", _dl_reltypes[reloc_type]);
#endif
if (symtab_index)
- _dl_fdprintf(2, "'%s'\n", strtab + symtab[symtab_index].st_name);
+ _dl_fprintf(2, "'%s'\n", strtab + symtab[symtab_index].st_name);
_dl_exit(1);
};
};
@@ -239,7 +239,7 @@ int _dl_parse_relocation_information(struct elf_resolve *tpnt,
* here, so all bases should be covered.
*/
if (!symbol_addr && ELF32_ST_BIND(symtab[symtab_index].st_info) == STB_GLOBAL) {
- _dl_fdprintf(2, "%s: can't resolve symbol '%s'\n",
+ _dl_fprintf(2, "%s: can't resolve symbol '%s'\n",
_dl_progname, strtab + symtab[symtab_index].st_name);
goof++;
}
@@ -267,7 +267,7 @@ int _dl_parse_relocation_information(struct elf_resolve *tpnt,
topbits = newvalue & 0xfe000000;
if (topbits != 0xfe000000 && topbits != 0x00000000)
{
- _dl_fdprintf(2, "R_ARM_PC24 relocation out of range ");
+ _dl_fprintf(2, "R_ARM_PC24 relocation out of range ");
_dl_exit(1);
}
}
@@ -286,20 +286,20 @@ int _dl_parse_relocation_information(struct elf_resolve *tpnt,
case R_ARM_COPY:
#if 0
/* Do this later */
- _dl_fdprintf(2, "Doing copy for symbol ");
- if (symtab_index) _dl_fdprintf(2, strtab + symtab[symtab_index].st_name);
- _dl_fdprintf(2, "\n");
+ _dl_fprintf(2, "Doing copy for symbol ");
+ if (symtab_index) _dl_fprintf(2, strtab + symtab[symtab_index].st_name);
+ _dl_fprintf(2, "\n");
_dl_memcpy((void *) symtab[symtab_index].st_value,
(void *) symbol_addr, symtab[symtab_index].st_size);
#endif
break;
default:
- _dl_fdprintf(2, "%s: can't handle reloc type ", _dl_progname);
+ _dl_fprintf(2, "%s: can't handle reloc type ", _dl_progname);
#ifdef VERBOSE_DLINKER
- _dl_fdprintf(2, "%s ", _dl_reltypes[reloc_type]);
+ _dl_fprintf(2, "%s ", _dl_reltypes[reloc_type]);
#endif
if (symtab_index)
- _dl_fdprintf(2, "'%s'\n", strtab + symtab[symtab_index].st_name);
+ _dl_fprintf(2, "'%s'\n", strtab + symtab[symtab_index].st_name);
_dl_exit(1);
};
@@ -360,7 +360,7 @@ int _dl_parse_copy_information(struct dyn_elf *xpnt, unsigned long rel_addr,
symtab[symtab_index].st_name, xpnt->next,
(unsigned long) reloc_addr, NULL, 1);
if (!symbol_addr) {
- _dl_fdprintf(2, "%s: can't resolve symbol '%s'\n",
+ _dl_fprintf(2, "%s: can't resolve symbol '%s'\n",
_dl_progname, strtab + symtab[symtab_index].st_name);
goof++;
};
diff --git a/ldso/ldso/boot1.c b/ldso/ldso/boot1.c
index 920779dcd..2824fa4e2 100644
--- a/ldso/ldso/boot1.c
+++ b/ldso/ldso/boot1.c
@@ -121,8 +121,9 @@ char *_dl_preload = 0; /* Things to be loaded before the libs. */
#include "ld.so.h" /* Pull in the name of ld.so */
const char *_dl_progname=_dl_static_progname;
static char *_dl_not_lazy = 0;
-static char *_dl_warn = 0; /* Used by ldd */
+#ifdef DL_TRACE
static char *_dl_trace_loaded_objects = 0;
+#endif
static int (*_dl_elf_main) (int, char **, char **);
static int (*_dl_elf_init) (void);
void *(*_dl_malloc_function) (int size) = NULL;
@@ -213,7 +214,7 @@ DL_BOOT(unsigned long args)
aux_dat += 2;
}
- /* locate the ELF header. We need this done as easly as possible
+ /* locate the ELF header. We need this done as soon as possible
* (esp since SEND_STDERR() needs this on some platforms... */
load_addr = auxv_t[AT_BASE].a_un.a_val;
header = (elfhdr *) auxv_t[AT_BASE].a_un.a_ptr;
@@ -593,8 +594,9 @@ found_got:
}
}
+#ifdef DL_TRACE
_dl_trace_loaded_objects = _dl_getenv("LD_TRACE_LOADED_OBJECTS", envp);
-
+#endif
/* OK, we now have the application in the list, and we have some
basic stuff in place. Now search through the list for other shared
libraries that should be loaded, and insert them on the list in the
@@ -627,22 +629,28 @@ found_got:
{
tpnt1 = _dl_load_shared_library(_dl_secure, NULL, str);
if (!tpnt1) {
+#ifdef DL_TRACE
if (_dl_trace_loaded_objects)
- _dl_fdprintf(1, "\t%s => not found\n", str);
+ _dl_fprintf(1, "\t%s => not found\n", str);
else {
- _dl_fdprintf(2, "%s: can't load "
+#endif
+ _dl_fprintf(2, "%s: can't load "
"library '%s'\n", _dl_progname, str);
_dl_exit(15);
+#ifdef DL_TRACE
}
+#endif
} else {
+#ifdef DL_TRACE
if (_dl_trace_loaded_objects
&& !tpnt1->usage_count) {
/* this is a real hack to make ldd not print
* the library itself when run on a library. */
if (_dl_strcmp(_dl_progname, str) != 0)
- _dl_fdprintf(1, "\t%s => %s (0x%x)\n", str, tpnt1->libname,
+ _dl_fprintf(1, "\t%s => %s (0x%x)\n", str, tpnt1->libname,
(unsigned) tpnt1->loadaddr);
}
+#endif
rpnt->next = (struct dyn_elf *)
_dl_malloc(sizeof(struct dyn_elf));
_dl_memset(rpnt->next, 0, sizeof(*(rpnt->next)));
@@ -667,14 +675,14 @@ found_got:
if (!_dl_stat(LDSO_PRELOAD, &st)) {
if ((fd = _dl_open(LDSO_PRELOAD, O_RDONLY)) < 0) {
- _dl_fdprintf(2, "%s: can't open file '%s'\n",
+ _dl_fprintf(2, "%s: can't open file '%s'\n",
_dl_progname, LDSO_PRELOAD);
} else {
preload = (caddr_t) _dl_mmap(0, st.st_size + 1,
PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
_dl_close(fd);
if (preload == (caddr_t) - 1) {
- _dl_fdprintf(2, "%s: can't map file '%s'\n",
+ _dl_fprintf(2, "%s: can't map file '%s'\n",
_dl_progname, LDSO_PRELOAD);
} else {
char c, *cp, *cp2;
@@ -705,19 +713,25 @@ found_got:
tpnt1 = _dl_load_shared_library(0, NULL, cp2);
if (!tpnt1) {
+#ifdef DL_TRACE
if (_dl_trace_loaded_objects)
- _dl_fdprintf(1, "\t%s => not found\n", cp2);
+ _dl_fprintf(1, "\t%s => not found\n", cp2);
else {
- _dl_fdprintf(2, "%s: can't load library '%s'\n",
+#endif
+ _dl_fprintf(2, "%s: can't load library '%s'\n",
_dl_progname, cp2);
_dl_exit(15);
- }
+#ifdef DL_TRACE
+ }
+#endif
} else {
+#ifdef DL_TRACE
if (_dl_trace_loaded_objects
&& !tpnt1->usage_count) {
- _dl_fdprintf(1, "\t%s => %s (0x%x)\n", cp2,
+ _dl_fprintf(1, "\t%s => %s (0x%x)\n", cp2,
tpnt1->libname, (unsigned) tpnt1->loadaddr);
}
+#endif
rpnt->next = (struct dyn_elf *)
_dl_malloc(sizeof(struct dyn_elf));
_dl_memset(rpnt->next, 0,
@@ -751,10 +765,12 @@ found_got:
_dl_get_last_path_component(tpnt->libname)) == 0) {
struct elf_resolve *ttmp;
+#ifdef DL_TRACE
if (_dl_trace_loaded_objects && !tpnt->usage_count) {
- _dl_fdprintf(1, "\t%s => %s (0x%x)\n",
+ _dl_fprintf(1, "\t%s => %s (0x%x)\n",
lpnt, tpnt->libname, (unsigned) tpnt->loadaddr);
}
+#endif
ttmp = _dl_loaded_modules;
while (ttmp->next)
ttmp = ttmp->next;
@@ -772,17 +788,23 @@ found_got:
continue;
}
if (!(tpnt1 = _dl_load_shared_library(0, tcurr, lpnt))) {
+#ifdef DL_TRACE
if (_dl_trace_loaded_objects)
- _dl_fdprintf(1, "\t%s => not found\n", lpnt);
+ _dl_fprintf(1, "\t%s => not found\n", lpnt);
else {
- _dl_fdprintf(2, "%s: can't load library '%s'\n",
+#endif
+ _dl_fprintf(2, "%s: can't load library '%s'\n",
_dl_progname, lpnt);
_dl_exit(16);
+#ifdef DL_TRACE
}
+#endif
} else {
+#ifdef DL_TRACE
if (_dl_trace_loaded_objects && !tpnt1->usage_count)
- _dl_fdprintf(1, "\t%s => %s (0x%x)\n", lpnt, tpnt1->libname,
+ _dl_fprintf(1, "\t%s => %s (0x%x)\n", lpnt, tpnt1->libname,
(unsigned) tpnt1->loadaddr);
+#endif
rpnt->next = (struct dyn_elf *)
_dl_malloc(sizeof(struct dyn_elf));
_dl_memset(rpnt->next, 0, sizeof(*(rpnt->next)));
@@ -801,11 +823,14 @@ found_got:
_dl_unmap_cache();
#endif
/* ldd uses uses this. I am not sure how you pick up the other flags */
+#ifdef DL_TRACE
if (_dl_trace_loaded_objects) {
+ char *_dl_warn = 0;
_dl_warn = _dl_getenv("LD_WARN", envp);
if (!_dl_warn)
_dl_exit(0);
}
+#endif
/*
* If the program interpreter is not in the module chain, add it. This will
@@ -855,8 +880,10 @@ found_got:
if (_dl_symbol_tables)
goof += _dl_copy_fixups(_dl_symbol_tables);
+#ifdef DL_TRACE
if (goof || _dl_trace_loaded_objects)
_dl_exit(0);
+#endif
/* OK, at this point things are pretty much ready to run. Now we
need to touch up a few items that are required, and then
@@ -929,13 +956,13 @@ found_got:
#undef DL_DEBUG
#ifdef DL_DEBUG
else {
- _dl_fdprintf(2, tpnt->libname);
- _dl_fdprintf(2, ": ");
+ _dl_fprintf(2, tpnt->libname);
+ _dl_fprintf(2, ": ");
if (!_dl_atexit)
- _dl_fdprintf(2, "The address is atexit () is 0x0.");
+ _dl_fprintf(2, "The address is atexit () is 0x0.");
if (!tpnt->dynamic_info[DT_FINI])
- _dl_fdprintf(2, "Invalid .fini section.");
- _dl_fdprintf(2, "\n");
+ _dl_fprintf(2, "Invalid .fini section.");
+ _dl_fprintf(2, "\n");
}
#endif
#undef DL_DEBUG
@@ -970,7 +997,7 @@ int _dl_fixup(struct elf_resolve *tpnt)
goof += _dl_fixup(tpnt->next);
if (tpnt->dynamic_info[DT_REL]) {
#ifdef ELF_USES_RELOCA
- _dl_fdprintf(2, "%s: can't handle REL relocation records\n",
+ _dl_fprintf(2, "%s: can't handle REL relocation records\n",
_dl_progname);
_dl_exit(17);
#else
@@ -989,7 +1016,7 @@ int _dl_fixup(struct elf_resolve *tpnt)
goof += _dl_parse_relocation_information(tpnt,
tpnt->dynamic_info[DT_RELA], tpnt->dynamic_info[DT_RELASZ], 0);
#else
- _dl_fdprintf(2, "%s: can't handle RELA relocation records\n",
+ _dl_fprintf(2, "%s: can't handle RELA relocation records\n",
_dl_progname);
_dl_exit(18);
#endif
@@ -1028,7 +1055,7 @@ void *_dl_malloc(int size)
_dl_mmap_zero = _dl_malloc_addr = _dl_mmap((void *) 0, size,
PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
if (_dl_mmap_check_error(_dl_mmap_zero)) {
- _dl_fdprintf(2, "%s: mmap of a spare page failed!\n", _dl_progname);
+ _dl_fprintf(2, "%s: mmap of a spare page failed!\n", _dl_progname);
_dl_exit(20);
}
}
@@ -1207,3 +1234,77 @@ void * _dl_memset(void * str,int c,size_t len)
return str;
}
+/* Minimum printf which handles only characters, %d's and %s's */
+void _dl_fprintf(int fd, const char *fmt, ...)
+{
+ int num;
+ va_list args;
+ char *start, *ptr, *string;
+ char buf[2048];
+
+ start = ptr = buf;
+
+ if (!fmt)
+ return;
+
+ if (_dl_strlen(fmt) >= (sizeof(buf)-1))
+ _dl_write(fd, "(overflow)\n", 10);
+
+ _dl_strcpy(buf, fmt);
+ va_start(args, fmt);
+
+ while(start)
+ {
+ while(*ptr != '%' && *ptr) {
+ ptr++;
+ }
+
+ if(*ptr == '%')
+ {
+ *ptr++ = '\0';
+ _dl_write(fd, start, _dl_strlen(start));
+
+ switch(*ptr++)
+ {
+ case 's':
+ string = va_arg(args, char *);
+ if (!string)
+ _dl_write(fd, "(null)", 6);
+ else
+ _dl_write(fd, string, _dl_strlen(string));
+ break;
+
+ case 'i':
+ case 'd':
+ {
+ char tmp[13];
+ num = va_arg(args, int);
+ string = _dl_simple_ltoa_inline(tmp, num);
+ _dl_write(fd, string, _dl_strlen(string));
+ break;
+ }
+ case 'x':
+ case 'X':
+ {
+ char tmp[13];
+ num = va_arg(args, int);
+ string = _dl_simple_ltoahex_inline(tmp, num);
+ _dl_write(fd, string, _dl_strlen(string));
+ break;
+ }
+ default:
+ _dl_write(fd, "(null)", 6);
+ break;
+ }
+
+ start = ptr;
+ }
+ else
+ {
+ _dl_write(fd, start, _dl_strlen(start));
+ start = NULL;
+ }
+ }
+ return;
+}
+
diff --git a/ldso/ldso/dl-elf.c b/ldso/ldso/dl-elf.c
index 4e1de140e..2276d4a9f 100644
--- a/ldso/ldso/dl-elf.c
+++ b/ldso/ldso/dl-elf.c
@@ -54,7 +54,7 @@ int _dl_map_cache(void)
if (_dl_stat(LDSO_CACHE, &st)
|| (fd = _dl_open(LDSO_CACHE, O_RDONLY)) < 0) {
- _dl_fdprintf(2, "%s: can't open cache '%s'\n", _dl_progname, LDSO_CACHE);
+ _dl_fprintf(2, "%s: can't open cache '%s'\n", _dl_progname, LDSO_CACHE);
_dl_cache_addr = (caddr_t) - 1; /* so we won't try again */
return -1;
}
@@ -63,7 +63,7 @@ int _dl_map_cache(void)
_dl_cache_addr = (caddr_t) _dl_mmap(0, _dl_cache_size, PROT_READ, MAP_SHARED, fd, 0);
_dl_close(fd);
if (_dl_cache_addr == (caddr_t) - 1) {
- _dl_fdprintf(2, "%s: can't map cache '%s'\n",
+ _dl_fprintf(2, "%s: can't map cache '%s'\n",
_dl_progname, LDSO_CACHE);
return -1;
}
@@ -77,7 +77,7 @@ int _dl_map_cache(void)
(sizeof(header_t) + header->nlibs * sizeof(libentry_t))
|| _dl_cache_addr[_dl_cache_size - 1] != '\0')
{
- _dl_fdprintf(2, "%s: cache '%s' is corrupt\n", _dl_progname,
+ _dl_fprintf(2, "%s: cache '%s' is corrupt\n", _dl_progname,
LDSO_CACHE);
goto fail;
}
@@ -90,7 +90,7 @@ int _dl_map_cache(void)
if (libent[i].sooffset >= strtabsize ||
libent[i].liboffset >= strtabsize)
{
- _dl_fdprintf(2, "%s: cache '%s' is corrupt\n", _dl_progname, LDSO_CACHE);
+ _dl_fprintf(2, "%s: cache '%s' is corrupt\n", _dl_progname, LDSO_CACHE);
goto fail;
}
}
@@ -348,7 +348,7 @@ struct elf_resolve *_dl_load_elf_shared_library(int secure,
* NO! When we open shared libraries we may search several paths.
* it is inappropriate to generate an error here.
*/
- _dl_fdprintf(2, "%s: can't open '%s'\n", _dl_progname, libname);
+ _dl_fprintf(2, "%s: can't open '%s'\n", _dl_progname, libname);
#endif
_dl_internal_error_number = DL_ERROR_NOFILE;
return NULL;
@@ -361,7 +361,7 @@ struct elf_resolve *_dl_load_elf_shared_library(int secure,
epnt->e_ident[2] != 'L' ||
epnt->e_ident[3] != 'F')
{
- _dl_fdprintf(2, "%s: '%s' is not an ELF file\n", _dl_progname,
+ _dl_fprintf(2, "%s: '%s' is not an ELF file\n", _dl_progname,
libname);
_dl_internal_error_number = DL_ERROR_NOTELF;
_dl_close(infile);
@@ -376,7 +376,7 @@ struct elf_resolve *_dl_load_elf_shared_library(int secure,
{
_dl_internal_error_number =
(epnt->e_type != ET_DYN ? DL_ERROR_NOTDYN : DL_ERROR_NOTMAGIC);
- _dl_fdprintf(2, "%s: '%s' is not an ELF executable for " ELF_TARGET
+ _dl_fprintf(2, "%s: '%s' is not an ELF executable for " ELF_TARGET
"\n", _dl_progname, libname);
_dl_close(infile);
return NULL;
@@ -389,7 +389,7 @@ struct elf_resolve *_dl_load_elf_shared_library(int secure,
if (ppnt->p_type == PT_DYNAMIC) {
if (dynamic_addr)
- _dl_fdprintf(2, "%s: '%s' has more than one dynamic section\n",
+ _dl_fprintf(2, "%s: '%s' has more than one dynamic section\n",
_dl_progname, libname);
dynamic_addr = ppnt->p_vaddr;
dynamic_size = ppnt->p_filesz;
@@ -421,7 +421,7 @@ struct elf_resolve *_dl_load_elf_shared_library(int secure,
status = (char *) _dl_mmap((char *) (piclib ? 0 : minvma),
maxvma - minvma, PROT_NONE, flags | MAP_ANONYMOUS, -1, 0);
if (_dl_mmap_check_error(status)) {
- _dl_fdprintf(2, "%s: can't map '/dev/zero'\n", _dl_progname);
+ _dl_fprintf(2, "%s: can't map '/dev/zero'\n", _dl_progname);
_dl_internal_error_number = DL_ERROR_MMAP_FAILED;
_dl_close(infile);
return NULL;
@@ -453,7 +453,7 @@ struct elf_resolve *_dl_load_elf_shared_library(int secure,
ppnt->p_offset & 0x7ffff000);
if (_dl_mmap_check_error(status)) {
- _dl_fdprintf(2, "%s: can't map '%s'\n",
+ _dl_fprintf(2, "%s: can't map '%s'\n",
_dl_progname, libname);
_dl_internal_error_number = DL_ERROR_MMAP_FAILED;
_dl_munmap((char *) libaddr, maxvma - minvma);
@@ -485,7 +485,7 @@ struct elf_resolve *_dl_load_elf_shared_library(int secure,
ppnt->p_filesz, LXFLAGS(ppnt->p_flags), flags,
infile, ppnt->p_offset & 0x7ffff000);
if (_dl_mmap_check_error(status)) {
- _dl_fdprintf(2, "%s: can't map '%s'\n", _dl_progname, libname);
+ _dl_fprintf(2, "%s: can't map '%s'\n", _dl_progname, libname);
_dl_internal_error_number = DL_ERROR_MMAP_FAILED;
_dl_munmap((char *) libaddr, maxvma - minvma);
_dl_close(infile);
@@ -515,7 +515,7 @@ struct elf_resolve *_dl_load_elf_shared_library(int secure,
if (!dynamic_addr) {
_dl_internal_error_number = DL_ERROR_NODYNAMIC;
- _dl_fdprintf(2, "%s: '%s' is missing a dynamic section\n",
+ _dl_fprintf(2, "%s: '%s' is missing a dynamic section\n",
_dl_progname, libname);
return NULL;
}
diff --git a/ldso/ldso/hash.h b/ldso/ldso/hash.h
index 1ee32672b..9cd2894f8 100644
--- a/ldso/ldso/hash.h
+++ b/ldso/ldso/hash.h
@@ -71,44 +71,8 @@ extern char * _dl_find_hash(char * name, struct dyn_elf * rpnt1,
int copyrel);
extern int _dl_linux_dynamic_link(void);
-#if defined mc68000 || defined __arm__
-/* On some arches constant strings are referenced through the GOT. */
-/* XXX Requires load_addr to be defined. */
-#define SEND_STDERR(X) \
- { const char *__s = (X); \
- if (__s < (const char *) load_addr) __s += load_addr; \
- _dl_write (2, __s, _dl_strlen_inline (__s)); \
- }
-#else
-#define SEND_STDERR(X) _dl_write(2, X, _dl_strlen_inline(X));
-#endif
-
-#define SEND_ADDRESS_STDERR(X, add_a_newline) { \
- char tmp[13], *tmp1; \
- _dl_memset_inline(tmp, 0, sizeof(tmp)); \
- tmp1=_dl_simple_ltoahex_inline( tmp, (unsigned long)(X)); \
- _dl_write(2, tmp1, _dl_strlen_inline(tmp1)); \
- if (add_a_newline) { \
- tmp[0]='\n'; \
- _dl_write(2, tmp, 1); \
- } \
-};
-
-#define SEND_NUMBER_STDERR(X, add_a_newline) { \
- char tmp[13], *tmp1; \
- _dl_memset_inline(tmp, 0, sizeof(tmp)); \
- tmp1=_dl_simple_ltoahex_inline( tmp, (unsigned long)(X)); \
- _dl_write(2, tmp1, _dl_strlen_inline(tmp1)); \
- if (add_a_newline) { \
- tmp[0]='\n'; \
- _dl_write(2, tmp, 1); \
- } \
-};
-
-extern int _dl_fdprintf(int, const char *, ...);
extern char * _dl_library_path;
extern char * _dl_not_lazy;
-extern char * _dl_strdup(const char *);
extern unsigned long _dl_elf_hash(const char * name);
static inline int _dl_symbol(char * name)
diff --git a/ldso/ldso/i386/elfinterp.c b/ldso/ldso/i386/elfinterp.c
index 0dacb1165..56b18ceb8 100644
--- a/ldso/ldso/i386/elfinterp.c
+++ b/ldso/ldso/i386/elfinterp.c
@@ -74,7 +74,7 @@ unsigned long _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry)
if (reloc_type != R_386_JMP_SLOT) {
- _dl_fdprintf(2, "%s: Incorrect relocation type in jump relocations\n",
+ _dl_fprintf(2, "%s: Incorrect relocation type in jump relocations\n",
_dl_progname);
_dl_exit(1);
};
@@ -85,7 +85,7 @@ unsigned long _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry)
got_addr = (char **) instr_addr;
#ifdef DEBUG
- _dl_fdprintf(2, "Resolving symbol %s\n",
+ _dl_fprintf(2, "Resolving symbol %s\n",
strtab + symtab[symtab_index].st_name);
#endif
@@ -93,14 +93,14 @@ unsigned long _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry)
new_addr = _dl_find_hash(strtab + symtab[symtab_index].st_name,
tpnt->symbol_scope, (unsigned long) got_addr, tpnt, 0);
if (!new_addr) {
- _dl_fdprintf(2, "%s: can't resolve symbol '%s'\n",
+ _dl_fprintf(2, "%s: can't resolve symbol '%s'\n",
_dl_progname, strtab + symtab[symtab_index].st_name);
_dl_exit(1);
};
/* #define DEBUG_LIBRARY */
#ifdef DEBUG_LIBRARY
if ((unsigned long) got_addr < 0x40000000) {
- _dl_fdprintf(2, "Calling library function: %s\n",
+ _dl_fprintf(2, "Calling library function: %s\n",
strtab + symtab[symtab_index].st_name);
} else {
*got_addr = new_addr;
@@ -150,13 +150,13 @@ void _dl_parse_lazy_relocation_information(struct elf_resolve *tpnt,
*reloc_addr += (unsigned long) tpnt->loadaddr;
break;
default:
- _dl_fdprintf(2, "%s: (LAZY) can't handle reloc type ",
+ _dl_fprintf(2, "%s: (LAZY) can't handle reloc type ",
_dl_progname);
#ifdef VERBOSE_DLINKER
- _dl_fdprintf(2, "%s ", _dl_reltypes[reloc_type]);
+ _dl_fprintf(2, "%s ", _dl_reltypes[reloc_type]);
#endif
if (symtab_index)
- _dl_fdprintf(2, "'%s'\n", strtab + symtab[symtab_index].st_name);
+ _dl_fprintf(2, "'%s'\n", strtab + symtab[symtab_index].st_name);
_dl_exit(1);
};
};
@@ -209,7 +209,7 @@ int _dl_parse_relocation_information(struct elf_resolve *tpnt,
*/
if (!symbol_addr &&
ELF32_ST_BIND(symtab[symtab_index].st_info) == STB_GLOBAL) {
- _dl_fdprintf(2, "%s: can't resolve symbol '%s'\n",
+ _dl_fprintf(2, "%s: can't resolve symbol '%s'\n",
_dl_progname, strtab + symtab[symtab_index].st_name);
goof++;
}
@@ -233,20 +233,20 @@ int _dl_parse_relocation_information(struct elf_resolve *tpnt,
case R_386_COPY:
#if 0
/* Do this later */
- _dl_fdprintf(2, "Doing copy for symbol ");
- if (symtab_index) _dl_fdprintf(2, strtab + symtab[symtab_index].st_name);
- _dl_fdprintf(2, "\n");
+ _dl_fprintf(2, "Doing copy for symbol ");
+ if (symtab_index) _dl_fprintf(2, strtab + symtab[symtab_index].st_name);
+ _dl_fprintf(2, "\n");
_dl_memcpy((void *) symtab[symtab_index].st_value,
(void *) symbol_addr, symtab[symtab_index].st_size);
#endif
break;
default:
- _dl_fdprintf(2, "%s: can't handle reloc type ", _dl_progname);
+ _dl_fprintf(2, "%s: can't handle reloc type ", _dl_progname);
#ifdef VERBOSE_DLINKER
- _dl_fdprintf(2, "%s ", _dl_reltypes[reloc_type]);
+ _dl_fprintf(2, "%s ", _dl_reltypes[reloc_type]);
#endif
if (symtab_index)
- _dl_fdprintf(2, "'%s'\n", strtab + symtab[symtab_index].st_name);
+ _dl_fprintf(2, "'%s'\n", strtab + symtab[symtab_index].st_name);
_dl_exit(1);
};
@@ -307,7 +307,7 @@ int _dl_parse_copy_information(struct dyn_elf *xpnt, unsigned long rel_addr,
symtab[symtab_index].st_name, xpnt->next,
(unsigned long) reloc_addr, NULL, 1);
if (!symbol_addr) {
- _dl_fdprintf(2, "%s: can't resolve symbol '%s'\n",
+ _dl_fprintf(2, "%s: can't resolve symbol '%s'\n",
_dl_progname, strtab + symtab[symtab_index].st_name);
goof++;
};
diff --git a/ldso/ldso/ld-uClibc.c b/ldso/ldso/ld-uClibc.c
index 920779dcd..2824fa4e2 100644
--- a/ldso/ldso/ld-uClibc.c
+++ b/ldso/ldso/ld-uClibc.c
@@ -121,8 +121,9 @@ char *_dl_preload = 0; /* Things to be loaded before the libs. */
#include "ld.so.h" /* Pull in the name of ld.so */
const char *_dl_progname=_dl_static_progname;
static char *_dl_not_lazy = 0;
-static char *_dl_warn = 0; /* Used by ldd */
+#ifdef DL_TRACE
static char *_dl_trace_loaded_objects = 0;
+#endif
static int (*_dl_elf_main) (int, char **, char **);
static int (*_dl_elf_init) (void);
void *(*_dl_malloc_function) (int size) = NULL;
@@ -213,7 +214,7 @@ DL_BOOT(unsigned long args)
aux_dat += 2;
}
- /* locate the ELF header. We need this done as easly as possible
+ /* locate the ELF header. We need this done as soon as possible
* (esp since SEND_STDERR() needs this on some platforms... */
load_addr = auxv_t[AT_BASE].a_un.a_val;
header = (elfhdr *) auxv_t[AT_BASE].a_un.a_ptr;
@@ -593,8 +594,9 @@ found_got:
}
}
+#ifdef DL_TRACE
_dl_trace_loaded_objects = _dl_getenv("LD_TRACE_LOADED_OBJECTS", envp);
-
+#endif
/* OK, we now have the application in the list, and we have some
basic stuff in place. Now search through the list for other shared
libraries that should be loaded, and insert them on the list in the
@@ -627,22 +629,28 @@ found_got:
{
tpnt1 = _dl_load_shared_library(_dl_secure, NULL, str);
if (!tpnt1) {
+#ifdef DL_TRACE
if (_dl_trace_loaded_objects)
- _dl_fdprintf(1, "\t%s => not found\n", str);
+ _dl_fprintf(1, "\t%s => not found\n", str);
else {
- _dl_fdprintf(2, "%s: can't load "
+#endif
+ _dl_fprintf(2, "%s: can't load "
"library '%s'\n", _dl_progname, str);
_dl_exit(15);
+#ifdef DL_TRACE
}
+#endif
} else {
+#ifdef DL_TRACE
if (_dl_trace_loaded_objects
&& !tpnt1->usage_count) {
/* this is a real hack to make ldd not print
* the library itself when run on a library. */
if (_dl_strcmp(_dl_progname, str) != 0)
- _dl_fdprintf(1, "\t%s => %s (0x%x)\n", str, tpnt1->libname,
+ _dl_fprintf(1, "\t%s => %s (0x%x)\n", str, tpnt1->libname,
(unsigned) tpnt1->loadaddr);
}
+#endif
rpnt->next = (struct dyn_elf *)
_dl_malloc(sizeof(struct dyn_elf));
_dl_memset(rpnt->next, 0, sizeof(*(rpnt->next)));
@@ -667,14 +675,14 @@ found_got:
if (!_dl_stat(LDSO_PRELOAD, &st)) {
if ((fd = _dl_open(LDSO_PRELOAD, O_RDONLY)) < 0) {
- _dl_fdprintf(2, "%s: can't open file '%s'\n",
+ _dl_fprintf(2, "%s: can't open file '%s'\n",
_dl_progname, LDSO_PRELOAD);
} else {
preload = (caddr_t) _dl_mmap(0, st.st_size + 1,
PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
_dl_close(fd);
if (preload == (caddr_t) - 1) {
- _dl_fdprintf(2, "%s: can't map file '%s'\n",
+ _dl_fprintf(2, "%s: can't map file '%s'\n",
_dl_progname, LDSO_PRELOAD);
} else {
char c, *cp, *cp2;
@@ -705,19 +713,25 @@ found_got:
tpnt1 = _dl_load_shared_library(0, NULL, cp2);
if (!tpnt1) {
+#ifdef DL_TRACE
if (_dl_trace_loaded_objects)
- _dl_fdprintf(1, "\t%s => not found\n", cp2);
+ _dl_fprintf(1, "\t%s => not found\n", cp2);
else {
- _dl_fdprintf(2, "%s: can't load library '%s'\n",
+#endif
+ _dl_fprintf(2, "%s: can't load library '%s'\n",
_dl_progname, cp2);
_dl_exit(15);
- }
+#ifdef DL_TRACE
+ }
+#endif
} else {
+#ifdef DL_TRACE
if (_dl_trace_loaded_objects
&& !tpnt1->usage_count) {
- _dl_fdprintf(1, "\t%s => %s (0x%x)\n", cp2,
+ _dl_fprintf(1, "\t%s => %s (0x%x)\n", cp2,
tpnt1->libname, (unsigned) tpnt1->loadaddr);
}
+#endif
rpnt->next = (struct dyn_elf *)
_dl_malloc(sizeof(struct dyn_elf));
_dl_memset(rpnt->next, 0,
@@ -751,10 +765,12 @@ found_got:
_dl_get_last_path_component(tpnt->libname)) == 0) {
struct elf_resolve *ttmp;
+#ifdef DL_TRACE
if (_dl_trace_loaded_objects && !tpnt->usage_count) {
- _dl_fdprintf(1, "\t%s => %s (0x%x)\n",
+ _dl_fprintf(1, "\t%s => %s (0x%x)\n",
lpnt, tpnt->libname, (unsigned) tpnt->loadaddr);
}
+#endif
ttmp = _dl_loaded_modules;
while (ttmp->next)
ttmp = ttmp->next;
@@ -772,17 +788,23 @@ found_got:
continue;
}
if (!(tpnt1 = _dl_load_shared_library(0, tcurr, lpnt))) {
+#ifdef DL_TRACE
if (_dl_trace_loaded_objects)
- _dl_fdprintf(1, "\t%s => not found\n", lpnt);
+ _dl_fprintf(1, "\t%s => not found\n", lpnt);
else {
- _dl_fdprintf(2, "%s: can't load library '%s'\n",
+#endif
+ _dl_fprintf(2, "%s: can't load library '%s'\n",
_dl_progname, lpnt);
_dl_exit(16);
+#ifdef DL_TRACE
}
+#endif
} else {
+#ifdef DL_TRACE
if (_dl_trace_loaded_objects && !tpnt1->usage_count)
- _dl_fdprintf(1, "\t%s => %s (0x%x)\n", lpnt, tpnt1->libname,
+ _dl_fprintf(1, "\t%s => %s (0x%x)\n", lpnt, tpnt1->libname,
(unsigned) tpnt1->loadaddr);
+#endif
rpnt->next = (struct dyn_elf *)
_dl_malloc(sizeof(struct dyn_elf));
_dl_memset(rpnt->next, 0, sizeof(*(rpnt->next)));
@@ -801,11 +823,14 @@ found_got:
_dl_unmap_cache();
#endif
/* ldd uses uses this. I am not sure how you pick up the other flags */
+#ifdef DL_TRACE
if (_dl_trace_loaded_objects) {
+ char *_dl_warn = 0;
_dl_warn = _dl_getenv("LD_WARN", envp);
if (!_dl_warn)
_dl_exit(0);
}
+#endif
/*
* If the program interpreter is not in the module chain, add it. This will
@@ -855,8 +880,10 @@ found_got:
if (_dl_symbol_tables)
goof += _dl_copy_fixups(_dl_symbol_tables);
+#ifdef DL_TRACE
if (goof || _dl_trace_loaded_objects)
_dl_exit(0);
+#endif
/* OK, at this point things are pretty much ready to run. Now we
need to touch up a few items that are required, and then
@@ -929,13 +956,13 @@ found_got:
#undef DL_DEBUG
#ifdef DL_DEBUG
else {
- _dl_fdprintf(2, tpnt->libname);
- _dl_fdprintf(2, ": ");
+ _dl_fprintf(2, tpnt->libname);
+ _dl_fprintf(2, ": ");
if (!_dl_atexit)
- _dl_fdprintf(2, "The address is atexit () is 0x0.");
+ _dl_fprintf(2, "The address is atexit () is 0x0.");
if (!tpnt->dynamic_info[DT_FINI])
- _dl_fdprintf(2, "Invalid .fini section.");
- _dl_fdprintf(2, "\n");
+ _dl_fprintf(2, "Invalid .fini section.");
+ _dl_fprintf(2, "\n");
}
#endif
#undef DL_DEBUG
@@ -970,7 +997,7 @@ int _dl_fixup(struct elf_resolve *tpnt)
goof += _dl_fixup(tpnt->next);
if (tpnt->dynamic_info[DT_REL]) {
#ifdef ELF_USES_RELOCA
- _dl_fdprintf(2, "%s: can't handle REL relocation records\n",
+ _dl_fprintf(2, "%s: can't handle REL relocation records\n",
_dl_progname);
_dl_exit(17);</