[uClibc-cvs] uClibc/ldso/ldso hash.c,1.11,1.12 ldso.c,1.58,1.59 readelflib1.c,1.37,1.38

Erik Andersen andersen at codepoet.org
Thu Dec 12 22:22:36 UTC 2002


Update of /var/cvs/uClibc/ldso/ldso
In directory winder:/tmp/cvs-serv15280/ldso

Modified Files:
	hash.c ldso.c readelflib1.c 
Log Message:
Rework things such that staticly linked applications can use
dlopen and have it be successful.  This required moving some
things out of ldso.c into readelflib1.c, and directly including
hash.c and readelflib1.c into dlib.c when building the static
version of the library.
 -Erik


Index: hash.c
===================================================================
RCS file: /var/cvs/uClibc/ldso/ldso/hash.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- hash.c	19 Aug 2002 10:22:36 -0000	1.11
+++ hash.c	12 Dec 2002 22:22:00 -0000	1.12
@@ -185,7 +185,7 @@
 	   that any shared library data symbols referenced in the executable
 	   will be seen at the same address by the executable, shared libraries
 	   and dynamically loaded code. -Rob Ryan (robr at cmu.edu) */
-	if (!caller_type && rpnt1) {
+	if (_dl_symbol_tables && !caller_type && rpnt1) {
 		first = (*_dl_symbol_tables);
 		first.next = rpnt1;
 		rpnt1 = (&first);

Index: ldso.c
===================================================================
RCS file: /var/cvs/uClibc/ldso/ldso/ldso.c,v
retrieving revision 1.58
retrieving revision 1.59
diff -u -d -r1.58 -r1.59
--- ldso.c	4 Dec 2002 05:47:30 -0000	1.58
+++ ldso.c	12 Dec 2002 22:22:00 -0000	1.59
@@ -147,7 +147,6 @@
 static char *_dl_trace_loaded_objects = 0;
 static int (*_dl_elf_main) (int, char **, char **);
 static int (*_dl_elf_init) (void);
-void *(*_dl_malloc_function) (int size) = NULL;
 struct r_debug *_dl_debug_addr = NULL;
 unsigned long *_dl_brkp;
 unsigned long *_dl_envp;
@@ -1339,41 +1338,6 @@
 	return goof;
 }
 
-void *_dl_malloc(int size)
-{
-	void *retval;
-
-#if 0
-#ifdef __SUPPORT_LD_DEBUG_EARLY__
-	_dl_dprintf(_dl_debug_file, "malloc: request for %d bytes\n", size);
-#endif
-#endif
-
-	if (_dl_malloc_function)
-		return (*_dl_malloc_function) (size);
-
-	if (_dl_malloc_addr - _dl_mmap_zero + size > 4096) {
-#ifdef __SUPPORT_LD_DEBUG_EARLY__
-		_dl_dprintf(_dl_debug_file, "malloc: mmapping more memory\n");
-#endif
-		_dl_mmap_zero = _dl_malloc_addr = _dl_mmap((void *) 0, size, 
-				PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
-		if (_dl_mmap_check_error(_dl_mmap_zero)) {
-			_dl_dprintf(2, "%s: mmap of a spare page failed!\n", _dl_progname);
-			_dl_exit(20);
-		}
-	}
-	retval = _dl_malloc_addr;
-	_dl_malloc_addr += size;
-
-	/*
-	 * Align memory to 4 byte boundary.  Some platforms require this, others
-	 * simply get better performance.
-	 */
-	_dl_malloc_addr = (char *) (((unsigned long) _dl_malloc_addr + 3) & ~(3));
-	return retval;
-}
-
 char *_dl_getenv(const char *symbol, char **envp)
 {
 	char *pnt;
@@ -1404,89 +1368,6 @@
 			*newenvp++ = *envp;
 	}
 	*newenvp++ = *envp;
-	return;
-}
-
-char *_dl_strdup(const char *string)
-{
-	char *retval;
-	int len;
-
-	len = _dl_strlen(string);
-	retval = _dl_malloc(len + 1);
-	_dl_strcpy(retval, string);
-	return retval;
-}
-
-/* Minimal printf which handles only %s, %d, and %x */
-void _dl_dprintf(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[22];
-				num = va_arg(args, int);
-
-				string = _dl_simple_ltoa(tmp, num);
-				_dl_write(fd, string, _dl_strlen(string));
-				break;
-			}
-			case 'x':
-			case 'X':
-			{
-				char tmp[22];
-				num = va_arg(args, int);
-
-				string = _dl_simple_ltoahex(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;
 }
 

Index: readelflib1.c
===================================================================
RCS file: /var/cvs/uClibc/ldso/ldso/readelflib1.c,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -d -r1.37 -r1.38
--- readelflib1.c	20 Nov 2002 10:49:56 -0000	1.37
+++ readelflib1.c	12 Dec 2002 22:22:00 -0000	1.38
@@ -128,6 +128,9 @@
 	char *path, *path_n;
 	char mylibname[2050];
 	struct elf_resolve *tpnt1;
+	
+	if (path_list==NULL)
+		return NULL;
 
 	/* We need a writable copy of this string */
 	path = _dl_strdup(path_list);
@@ -666,3 +669,124 @@
 #endif    
 	return goof;
 }
+
+/* Minimal printf which handles only %s, %d, and %x */
+void _dl_dprintf(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[22];
+				num = va_arg(args, int);
+
+				string = _dl_simple_ltoa(tmp, num);
+				_dl_write(fd, string, _dl_strlen(string));
+				break;
+			}
+			case 'x':
+			case 'X':
+			{
+				char tmp[22];
+				num = va_arg(args, int);
+
+				string = _dl_simple_ltoahex(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;
+}
+
+void *(*_dl_malloc_function) (size_t size) = NULL;
+char *_dl_strdup(const char *string)
+{
+	char *retval;
+	int len;
+
+	len = _dl_strlen(string);
+	retval = _dl_malloc(len + 1);
+	_dl_strcpy(retval, string);
+	return retval;
+}
+
+void *_dl_malloc(int size)
+{
+	void *retval;
+
+#if 0
+#ifdef __SUPPORT_LD_DEBUG_EARLY__
+	_dl_dprintf(_dl_debug_file, "malloc: request for %d bytes\n", size);
+#endif
+#endif
+
+	if (_dl_malloc_function)
+		return (*_dl_malloc_function) (size);
+
+	if (_dl_malloc_addr - _dl_mmap_zero + size > 4096) {
+#ifdef __SUPPORT_LD_DEBUG_EARLY__
+		_dl_dprintf(_dl_debug_file, "malloc: mmapping more memory\n");
+#endif
+		_dl_mmap_zero = _dl_malloc_addr = _dl_mmap((void *) 0, size, 
+				PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
+		if (_dl_mmap_check_error(_dl_mmap_zero)) {
+			_dl_dprintf(2, "%s: mmap of a spare page failed!\n", _dl_progname);
+			_dl_exit(20);
+		}
+	}
+	retval = _dl_malloc_addr;
+	_dl_malloc_addr += size;
+
+	/*
+	 * Align memory to 4 byte boundary.  Some platforms require this, others
+	 * simply get better performance.
+	 */
+	_dl_malloc_addr = (char *) (((unsigned long) _dl_malloc_addr + 3) & ~(3));
+	return retval;
+}
+
+




More information about the uClibc-cvs mailing list