Pārlūkot izejas kodu

This takes about 6k off the size of the x86 shared lib loader...
-Erik

Eric Andersen 23 gadi atpakaļ
vecāks
revīzija
8fbaabf323

+ 1 - 1
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))

+ 16 - 16
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++;
 			};

+ 125 - 24
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;
+}
+

+ 12 - 12
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;
 	}

+ 0 - 36
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)

+ 15 - 15
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++;
 			};

+ 125 - 24
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);
 #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;
+}
+

+ 0 - 36
ldso/ldso/ld_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)

+ 37 - 0
ldso/ldso/ld_string.h

@@ -17,6 +17,7 @@ extern char *_dl_strrchr(const char *str, int c);
 extern void * _dl_memcpy(void * dst, const void * src, size_t len);
 extern int _dl_memcmp(const void * s1,const void * s2,size_t len);
 extern void * _dl_memset(void * str,int c,size_t len);
+extern void _dl_fprintf(int, const char *, ...);
 
 #ifndef NULL
 #define NULL ((void *) 0)
@@ -200,4 +201,40 @@ static inline char *_dl_simple_ltoahex_inline(char * local, unsigned long i)
 	return p + 1;
 }
 
+
+#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); \
+    } \
+};
+
+
 #endif

+ 125 - 24
ldso/ldso/ldso.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;
+}
+

+ 17 - 17
ldso/ldso/m68k/elfinterp.c

@@ -83,7 +83,7 @@ _dl_linux_resolver (int dummy1, int dummy2,
 
   if (reloc_type != R_68K_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);
     }
@@ -93,7 +93,7 @@ _dl_linux_resolver (int dummy1, int dummy2,
   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
 
@@ -102,14 +102,14 @@ _dl_linux_resolver (int dummy1, int dummy2,
 			    tpnt->symbol_scope, (int) 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 int) 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
 #endif
@@ -158,13 +158,13 @@ _dl_parse_lazy_relocation_information (struct elf_resolve *tpnt,
 	  *reloc_addr += (unsigned int) tpnt->loadaddr;
 	  break;
 	default:
-	  _dl_fdprintf (2, "%s: (LAZY) can't handle reloc type ", _dl_progname);
+	  _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'", strtab + symtab[symtab_index].st_name);
-	  _dl_fdprintf (2, "\n");
+	    _dl_fprintf (2, "'%s'", strtab + symtab[symtab_index].st_name);
+	  _dl_fprintf (2, "\n");
 	  _dl_exit (1);
 	}
     }
@@ -218,7 +218,7 @@ _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++;
 	    }
@@ -259,24 +259,24 @@ _dl_parse_relocation_information (struct elf_resolve *tpnt,
 	  break;
 	case R_68K_COPY:
 #if 0 /* Do this later.  */
-	  _dl_fdprintf (2, "Doing copy");
+	  _dl_fprintf (2, "Doing copy");
 	  if (symtab_index)
-	    _dl_fdprintf (2, " for symbol %s",
+	    _dl_fprintf (2, " for symbol %s",
 			  strtab + symtab[symtab_index].st_name);
-	  _dl_fdprintf (2, "\n");
+	  _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'", strtab + symtab[symtab_index].st_name);
-	  _dl_fdprintf (2, "\n");
+	    _dl_fprintf (2, "'%s'", strtab + symtab[symtab_index].st_name);
+	  _dl_fprintf (2, "\n");
 	  _dl_exit (1);
 	}
 
@@ -337,7 +337,7 @@ _dl_parse_copy_information (struct dyn_elf *xpnt, unsigned long rel_addr,
 			   xpnt->next, (int) 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++;
 	    }

+ 27 - 27
ldso/ldso/powerpc/elfinterp.c

@@ -71,16 +71,16 @@ void _dl_init_got(unsigned long *plt,struct elf_resolve *tpnt)
 	unsigned int rel_offset_words;
 	unsigned int offset;
 
-	_dl_fdprintf(2,"init_got plt=%08lx, tpnt=%08lx\n",
+	_dl_fprintf(2,"init_got plt=%x, tpnt=%x\n",
 		(unsigned long)plt,(unsigned long)tpnt);
 
 	n_plt_entries = tpnt->dynamic_info[DT_PLTRELSZ] / sizeof(ELF_RELOC);
-_dl_fdprintf(2,"n_plt_entries %d\n",n_plt_entries);
+_dl_fprintf(2,"n_plt_entries %d\n",n_plt_entries);
 
 rel_offset_words = PLT_DATA_START_WORDS(n_plt_entries);
-_dl_fdprintf(2,"rel_offset_words %08x\n",rel_offset_words);
+_dl_fprintf(2,"rel_offset_words %x\n",rel_offset_words);
 data_words = (unsigned long)(plt + rel_offset_words);
-_dl_fdprintf(2,"data_words %08x\n",data_words);
+_dl_fprintf(2,"data_words %x\n",data_words);
 
 	//lpnt += PLT_INITIAL_ENTRY_WORDS;
 	
@@ -124,7 +124,7 @@ unsigned long _dl_linux_resolver(struct elf_resolve *tpnt, int reloc_entry)
 	char **got_addr;
 	unsigned long instr_addr;
 
-_dl_fdprintf(2,"linux_resolver tpnt=%08x reloc_entry=%08x\n",tpnt,reloc_entry);
+_dl_fprintf(2,"linux_resolver tpnt=%x reloc_entry=%x\n",tpnt,reloc_entry);
 	rel_addr = (ELF_RELOC *) (tpnt->dynamic_info[DT_JMPREL] + tpnt->loadaddr);
 
 	this_reloc = (void *)rel_addr + reloc_entry;
@@ -136,7 +136,7 @@ _dl_fdprintf(2,"linux_resolver tpnt=%08x reloc_entry=%08x\n",tpnt,reloc_entry);
 
 
 	if (reloc_type != R_PPC_JMP_SLOT) {
-		_dl_fdprintf(2, "%s: Incorrect relocation type [%s] in jump relocations\n",
+		_dl_fprintf(2, "%s: Incorrect relocation type [%s] in jump relocations\n",
 			_dl_progname,
 			(reloc_type<N_RELTYPES)?_dl_reltypes[reloc_type]:"unknown");
 		_dl_exit(1);
@@ -148,7 +148,7 @@ _dl_fdprintf(2,"linux_resolver tpnt=%08x reloc_entry=%08x\n",tpnt,reloc_entry);
 	got_addr = (char **) instr_addr;
 
 #ifdef DEBUG
-	_dl_fdprintf(2, "Resolving symbol %s %08x --> ", 
+	_dl_fprintf(2, "Resolving symbol %s %x --> ", 
 		strtab + symtab[symtab_index].st_name,
 		instr_addr);
 #endif
@@ -157,18 +157,18 @@ _dl_fdprintf(2,"linux_resolver tpnt=%08x reloc_entry=%08x\n",tpnt,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 DEBUG
-	_dl_fdprintf(2, "%08x\n", new_addr);
+	_dl_fprintf(2, "%x\n", new_addr);
 #endif
 
 /* #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;
@@ -193,7 +193,7 @@ void _dl_parse_lazy_relocation_information(struct elf_resolve *tpnt,
 	int index;
 
 #ifdef DEBUG
-_dl_fdprintf(2,"_dl_parse_lazy_relocation_information(tpnt=%08x, rel_addr=%08x, rel_size=%08x, type=%d)\n",
+_dl_fprintf(2,"_dl_parse_lazy_relocation_information(tpnt=%x, rel_addr=%x, rel_size=%x, type=%d)\n",
 		tpnt,rel_addr,rel_size,type);
 #endif
 	/* Now parse the relocation information */
@@ -219,7 +219,7 @@ _dl_fdprintf(2,"_dl_parse_lazy_relocation_information(tpnt=%08x, rel_addr=%08x,
 			continue;
 
 #ifdef DEBUG
-_dl_fdprintf(2, "L %08x %-16s %-20s %08x %08x\n",
+_dl_fprintf(2, "L %x %s %s %x %x\n",
 	reloc_addr, _dl_reltypes[reloc_type],
 	symtab_index?strtab + symtab[symtab_index].st_name:"",0,0);
 #endif
@@ -240,20 +240,20 @@ _dl_fdprintf(2, "L %08x %-16s %-20s %08x %08x\n",
 				/sizeof(unsigned long);
 			index /= 2;
 #ifdef DEBUG
-_dl_fdprintf(2, "        index %08x delta %08x\n",index,delta);
+_dl_fprintf(2, "        index %x delta %x\n",index,delta);
 #endif
 			reloc_addr[0] = OPCODE_LI(11,index*4);
 			reloc_addr[1] = OPCODE_B(delta);
 			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);
 		};
 
@@ -280,7 +280,7 @@ int _dl_parse_relocation_information(struct elf_resolve *tpnt,
 	unsigned long *plt;
 
 #ifdef DEBUG
-_dl_fdprintf(2,"_dl_parse_relocation_information(tpnt=%08x, rel_addr=%08x, rel_size=%08x, type=%d)\n",
+_dl_fprintf(2,"_dl_parse_relocation_information(tpnt=%x, rel_addr=%x, rel_size=%x, type=%d)\n",
 		tpnt,rel_addr,rel_size,type);
 #endif
 	/* Now parse the relocation information */
@@ -319,13 +319,13 @@ _dl_fdprintf(2,"_dl_parse_relocation_information(tpnt=%08x, rel_addr=%08x, rel_s
 			 */
 			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++;
 			}
 		}
 #ifdef DEBUG
-_dl_fdprintf(2, "  %08x %-16s %-20s %08x %08x\n",
+_dl_fprintf(2, "  %x %s %s %x %x\n",
 	reloc_addr, _dl_reltypes[reloc_type],
 	symtab_index?strtab + symtab[symtab_index].st_name:"",
 	symbol_addr, addend);
@@ -337,7 +337,7 @@ _dl_fdprintf(2, "  %08x %-16s %-20s %08x %08x\n",
 			{
 			int delta = symbol_addr - (unsigned long)reloc_addr;
 			if(delta<<6>>6 != delta){
-				_dl_fdprintf(2,"R_PPC_REL24: Reloc out of range\n");
+				_dl_fprintf(2,"R_PPC_REL24: Reloc out of range\n");
 				_dl_exit(1);
 			}
 			*reloc_addr &= 0xfc000003;
@@ -381,7 +381,7 @@ _dl_fdprintf(2, "  %08x %-16s %-20s %08x %08x\n",
 		/sizeof(unsigned long);
 	index /= 2;
 #ifdef DEBUG
-_dl_fdprintf(2, "        index %08x delta %08x\n",index,delta);
+_dl_fprintf(2, "        index %x delta %x\n",index,delta);
 #endif
 	reloc_addr[0] = OPCODE_LI(11,index*4);
 	reloc_addr[1] = OPCODE_B(delta);
@@ -390,12 +390,12 @@ _dl_fdprintf(2, "        index %08x delta %08x\n",index,delta);
 			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);
 		};
 
@@ -404,7 +404,7 @@ _dl_fdprintf(2, "        index %08x delta %08x\n",index,delta);
 		PPC_SYNC;
 		PPC_ICBI(reloc_addr);
 
-//_dl_fdprintf(2,"reloc_addr %08x: %08x\n",reloc_addr,*reloc_addr);
+//_dl_fprintf(2,"reloc_addr %x: %x\n",reloc_addr,*reloc_addr);
 	};
 	return goof;
 }
@@ -433,7 +433,7 @@ int _dl_parse_copy_information(struct dyn_elf *xpnt, unsigned long rel_addr,
 	struct elf_resolve *tpnt;
 	int symtab_index;
 
-_dl_fdprintf(2,"parse_copy xpnt=%08x rel_addr=%08x rel_size=%08x type=%d\n",
+_dl_fprintf(2,"parse_copy xpnt=%x rel_addr=%x rel_size=%x type=%d\n",
 		(int)xpnt,rel_addr,rel_size,type);
 
 	/* Now parse the relocation information */
@@ -465,7 +465,7 @@ _dl_fdprintf(2,"parse_copy xpnt=%08x rel_addr=%08x rel_size=%08x type=%d\n",
 				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++;
 			};

+ 12 - 12
ldso/ldso/readelflib1.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;
 	}

+ 21 - 21
ldso/ldso/sparc/elfinterp.c

@@ -82,14 +82,14 @@ unsigned int _dl_linux_resolver(unsigned int reloc_entry, unsigned int * plt)
   symtab =  (Elf32_Sym *) (tpnt->dynamic_info[DT_SYMTAB] + tpnt->loadaddr);
   strtab = (char *) (tpnt->dynamic_info[DT_STRTAB] + tpnt->loadaddr);
 
-  _dl_fdprintf(2, "tpnt = %x\n", tpnt);
-  _dl_fdprintf(2, "reloc = %x\n", this_reloc);
-  _dl_fdprintf(2, "symtab = %x\n", symtab);
-  _dl_fdprintf(2, "strtab = %x\n", strtab);
+  _dl_fprintf(2, "tpnt = %x\n", tpnt);
+  _dl_fprintf(2, "reloc = %x\n", this_reloc);
+  _dl_fprintf(2, "symtab = %x\n", symtab);
+  _dl_fprintf(2, "strtab = %x\n", strtab);
 
 
   if (reloc_type != R_SPARC_JMP_SLOT) {
-    _dl_fdprintf(2, "%s: incorrect relocation type in jump relocations (%d)\n",
+    _dl_fprintf(2, "%s: incorrect relocation type in jump relocations (%d)\n",
 		  _dl_progname, reloc_type);
     _dl_exit(30);
   };
@@ -98,10 +98,10 @@ unsigned int _dl_linux_resolver(unsigned int reloc_entry, unsigned int * plt)
   instr_addr  = ((int)this_reloc->r_offset  + (int)tpnt->loadaddr);
   got_addr = (char **) instr_addr;
 
-  _dl_fdprintf(2, "symtab_index %d\n", symtab_index);
+  _dl_fprintf(2, "symtab_index %d\n", symtab_index);
 
 #ifdef DEBUG
-  _dl_fdprintf(2, "Resolving symbol %s\n",
+  _dl_fprintf(2, "Resolving symbol %s\n",
 	strtab + symtab[symtab_index].st_name);
 #endif
 
@@ -109,14 +109,14 @@ unsigned int _dl_linux_resolver(unsigned int reloc_entry, unsigned int * plt)
   new_addr = _dl_find_hash(strtab + symtab[symtab_index].st_name, 
   			tpnt->symbol_scope, (int) 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(31);
   };
 /* #define DEBUG_LIBRARY */
 #ifdef DEBUG_LIBRARY
   if((unsigned int) 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[1] = (char *) (0x03000000 | (((unsigned int) new_addr >> 10) & 0x3fffff));
@@ -126,7 +126,7 @@ unsigned int _dl_linux_resolver(unsigned int reloc_entry, unsigned int * plt)
   got_addr[1] = (char *) (0x03000000 | (((unsigned int) new_addr >> 10) & 0x3fffff));
   got_addr[2] = (char *) (0x81c06000 | ((unsigned int) new_addr & 0x3ff));
 #endif
-  _dl_fdprintf(2, "Address = %x\n",new_addr);
+  _dl_fprintf(2, "Address = %x\n",new_addr);
     _dl_exit(32);
 
   return (unsigned int) new_addr;
@@ -166,11 +166,11 @@ void _dl_parse_lazy_relocation_information(struct elf_resolve * tpnt, int rel_ad
     case R_SPARC_JMP_SLOT:
       break;
     default:
-      _dl_fdprintf(2, "%s: (LAZY) can't handle reloc type ", _dl_progname);
+      _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",
+      if(symtab_index) _dl_fprintf(2, "'%s'\n",
 				  strtab + symtab[symtab_index].st_name);
       _dl_exit(33);
     };
@@ -216,7 +216,7 @@ int _dl_parse_relocation_information(struct elf_resolve * tpnt, int rel_addr,
 
       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++;
       };
@@ -260,21 +260,21 @@ int _dl_parse_relocation_information(struct elf_resolve * tpnt, int rel_addr,
       break;
     case R_SPARC_COPY:
 #if 0 /* This one is done 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(34);
     };
 
@@ -331,7 +331,7 @@ int _dl_parse_copy_information(struct dyn_elf * xpnt, int rel_addr,
 	_dl_find_hash(strtab + symtab[symtab_index].st_name,
 			      xpnt->next, (int) 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++;
       };

+ 37 - 0
ldso/ldso/string.h

@@ -17,6 +17,7 @@ extern char *_dl_strrchr(const char *str, int c);
 extern void * _dl_memcpy(void * dst, const void * src, size_t len);
 extern int _dl_memcmp(const void * s1,const void * s2,size_t len);
 extern void * _dl_memset(void * str,int c,size_t len);
+extern void _dl_fprintf(int, const char *, ...);
 
 #ifndef NULL
 #define NULL ((void *) 0)
@@ -200,4 +201,40 @@ static inline char *_dl_simple_ltoahex_inline(char * local, unsigned long i)
 	return p + 1;
 }
 
+
+#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); \
+    } \
+};
+
+
 #endif

+ 0 - 291
ldso/ldso/vsprintf.c

@@ -1,291 +0,0 @@
-/*
- *  vsprintf.c
- *
- *  Copyright (C) 1991-1996  Linus Torvalds
- */
-
-/* vsprintf.c -- Lars Wirzenius & Linus Torvalds. */
-/*
- * Wirzenius wrote this portably, Torvalds fucked it up :-)
- */
-
-#include <stdarg.h>
-#include "string.h"
-#include "hash.h"
-#include "syscall.h"
-
-/* we use this so that we can do without the ctype library */
-#define is_digit(c)	((c) >= '0' && (c) <= '9')
-
-static int skip_atoi(const char **s)
-{
-	int i=0;
-
-	while (is_digit(**s))
-		i = i*10 + *((*s)++) - '0';
-	return i;
-}
-
-#define ZEROPAD	1		/* pad with zero */
-#define SIGN	2		/* unsigned/signed long */
-#define PLUS	4		/* show plus */
-#define SPACE	8		/* space if plus */
-#define LEFT	16		/* left justified */
-#define SPECIAL	32		/* 0x */
-#define LARGE	64		/* use 'ABCDEF' instead of 'abcdef' */
-
-#ifndef __sparc__
-#define do_div(n,base) ({ \
-int __res; \
-__res = ((unsigned long) n) % (unsigned) base; \
-n = ((unsigned long) n) / (unsigned) base; \
-__res; })
-#else
-#define do_div(n,base) _dl_div ((n)/(base))
-#define do_div(n,base) ({ \
-int __res; \
-__res = _dl_urem(((unsigned long) n),(unsigned) base); \
-n = _dl_udiv(((unsigned long) n),(unsigned) base); \
-__res; })
-#endif
-
-#define ADD_CHAR(s,n,c) ( ((n) > 1) ? *(s)++ = (c), (n)-- : (c) )
-
-static char * number(char * str, int *bufsize, long num, int base, int size, int precision
-	,int type)
-{
-	char c,sign,tmp[66];
-	const char *digits="0123456789abcdefghijklmnopqrstuvwxyz";
-	int i;
-
-	if (type & LARGE)
-		digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
-	if (type & LEFT)
-		type &= ~ZEROPAD;
-	if (base < 2 || base > 36)
-		return 0;
-	c = (type & ZEROPAD) ? '0' : ' ';
-	sign = 0;
-	if (type & SIGN) {
-		if (num < 0) {
-			sign = '-';
-			num = -num;
-			size--;
-		} else if (type & PLUS) {
-			sign = '+';
-			size--;
-		} else if (type & SPACE) {
-			sign = ' ';
-			size--;
-		}
-	}
-	if (type & SPECIAL) {
-		if (base == 16)
-			size -= 2;
-		else if (base == 8)
-			size--;
-	}
-	i = 0;
-	if (num == 0)
-		tmp[i++]='0';
-	else while (num != 0)
-		tmp[i++] = digits[do_div(num,base)];
-	if (i > precision)
-		precision = i;
-	size -= precision;
-	if (!(type&(ZEROPAD+LEFT)))
-		while(size-->0)
-			ADD_CHAR(str, *bufsize, ' ');
-	if (sign)
-		ADD_CHAR(str, *bufsize, sign);
-	if (type & SPECIAL) {
-		if (base==8)
-			ADD_CHAR(str, *bufsize, '0');
-		else if (base==16) {
-			ADD_CHAR(str, *bufsize, '0');
-			ADD_CHAR(str, *bufsize, digits[33]);
-		}
-	}
-	if (!(type & LEFT))
-		while (size-- > 0)
-			ADD_CHAR(str, *bufsize, c);
-	while (i < precision--)
-		ADD_CHAR(str, *bufsize, '0');
-	while (i-- > 0)
-		ADD_CHAR(str, *bufsize, tmp[i]);
-	while (size-- > 0)
-		ADD_CHAR(str, *bufsize, ' ');
-	return str;
-}
-
-int _dl_fdprintf(int fd, const char *fmt, ...)
-{
-	int len;
-	unsigned long num;
-	int i, base;
-	char * str;
-	const char *s;
-
-	int flags;		/* flags to number() */
-
-	int field_width;	/* width of output field */
-	int precision;		/* min. # of digits for integers; max
-				   number of chars for from string */
-	int qualifier;		/* 'h', 'l', or 'L' for integer fields */
-
-	int bufsize;
-	char buf[2048];
-	va_list(args);
-
-	va_start(args, fmt);
-
-	for (str=buf, bufsize=sizeof buf ; *fmt ; ++fmt) {
-		if (*fmt != '%') {
-			ADD_CHAR(str, bufsize, *fmt);
-			continue;
-		}
-			
-		/* process flags */
-		flags = 0;
-		repeat:
-			++fmt;		/* this also skips first '%' */
-			switch (*fmt) {
-				case '-': flags |= LEFT; goto repeat;
-				case '+': flags |= PLUS; goto repeat;
-				case ' ': flags |= SPACE; goto repeat;
-				case '#': flags |= SPECIAL; goto repeat;
-				case '0': flags |= ZEROPAD; goto repeat;
-				}
-		
-		/* get field width */
-		field_width = -1;
-		if (is_digit(*fmt))
-			field_width = skip_atoi(&fmt);
-		else if (*fmt == '*') {
-			++fmt;
-			/* it's the next argument */
-			field_width = va_arg(args, int);
-			if (field_width < 0) {
-				field_width = -field_width;
-				flags |= LEFT;
-			}
-		}
-
-		/* get the precision */
-		precision = -1;
-		if (*fmt == '.') {
-			++fmt;	
-			if (is_digit(*fmt))
-				precision = skip_atoi(&fmt);
-			else if (*fmt == '*') {
-				++fmt;
-				/* it's the next argument */
-				precision = va_arg(args, int);
-			}
-			if (precision < 0)
-				precision = 0;
-		}
-
-		/* get the conversion qualifier */
-		qualifier = -1;
-		if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L') {
-			qualifier = *fmt;
-			++fmt;
-		}
-
-		/* default base */
-		base = 10;
-
-		switch (*fmt) {
-		case 'c':
-			if (!(flags & LEFT))
-				while (--field_width > 0)
-					ADD_CHAR(str, bufsize, ' ');
-			ADD_CHAR(str, bufsize, (unsigned char) va_arg(args, int));
-			while (--field_width > 0)
-				ADD_CHAR(str, bufsize, ' ');
-			continue;
-
-		case 's':
-			s = va_arg(args, char *);
-			if (!s)
-				s = "<NULL>";
-
-			len = _dl_strlen(s);
-
-			if (!(flags & LEFT))
-				while (len < field_width--)
-					ADD_CHAR(str, bufsize, ' ');
-			for (i = 0; i < len; ++i)
-			        ADD_CHAR(str, bufsize, *s++);
-			while (len < field_width--)
-				ADD_CHAR(str, bufsize, ' ');
-			continue;
-
-		case 'p':
-			if (field_width == -1) {
-				field_width = 2*sizeof(void *);
-				flags |= ZEROPAD;
-			}
-			str = number(str, &bufsize,
-				(unsigned long) va_arg(args, void *), 16,
-				field_width, precision, flags);
-			continue;
-
-
-		case 'n':
-			if (qualifier == 'l') {
-				long * ip = va_arg(args, long *);
-				*ip = (str - buf);
-			} else {
-				int * ip = va_arg(args, int *);
-				*ip = (str - buf);
-			}
-			continue;
-
-		/* integer number formats - set up the flags and "break" */
-		case 'o':
-			base = 8;
-			break;
-
-		case 'X':
-			flags |= LARGE;
-		case 'x':
-			base = 16;
-			break;
-
-		case 'd':
-		case 'i':
-			flags |= SIGN;
-		case 'u':
-			break;
-
-		default:
-			if (*fmt != '%')
-				ADD_CHAR(str, bufsize, '%');
-			if (*fmt)
-				ADD_CHAR(str, bufsize, *fmt);
-			else
-				--fmt;
-			continue;
-		}
-		if (qualifier == 'l')
-			num = va_arg(args, unsigned long);
-#ifndef __powerpc__
-		else if (qualifier == 'h')
-			if (flags & SIGN)
-				num = va_arg(args, short);
-			else
-				num = va_arg(args, unsigned short);
-#endif
-		else if (flags & SIGN)
-			num = va_arg(args, int);
-		else
-			num = va_arg(args, unsigned int);
-		str = number(str, &bufsize, num, base, field_width, precision, flags);
-	}
-	*str = '\0';
-	_dl_write(fd, buf, str-buf);
-	return str-buf;
-}
-