[uClibc-cvs] uClibc/ldso/ldso dl-elf.c, 1.68, 1.69 dl-startup.c, 1.8, 1.9 ldso.c, 1.95, 1.96

Erik Andersen andersen at uclibc.org
Tue May 11 11:15:00 UTC 2004


Update of /var/cvs/uClibc/ldso/ldso
In directory nail:/tmp/cvs-serv11380/ldso/ldso

Modified Files:
	dl-elf.c dl-startup.c ldso.c 
Log Message:
make certain that getpagesize() returns correct the value for mips
by extracting the value from the ELF header.


Index: ldso.c
===================================================================
RCS file: /var/cvs/uClibc/ldso/ldso/ldso.c,v
retrieving revision 1.95
retrieving revision 1.96
diff -u -d -r1.95 -r1.96
--- a/ldso.c	20 Feb 2004 02:59:42 -0000	1.95
+++ b/ldso.c	11 May 2004 11:14:58 -0000	1.96
@@ -46,6 +46,7 @@
 unsigned long *_dl_brkp        = 0;		/* The end of the data segment for brk and sbrk */
 unsigned long *_dl_envp        = 0;		/* The environment address */
 int _dl_secure                 = 1;		/* Are we dealing with setuid stuff? */
+size_t _dl_pagesize            = 0;		/* Store the page size for use later */
 
 
 
@@ -102,7 +103,6 @@
 	int (*_dl_on_exit) (void (*FUNCTION)(int STATUS, void *ARG),void*);
 #endif
 
-
 #ifdef __SUPPORT_LD_DEBUG_EARLY__
 	/* Wahoo!!! */
 	SEND_STDERR("Cool, we managed to make a function call.\n");
@@ -114,6 +114,9 @@
 	_dl_malloc_addr = malloc_buffer;
 	_dl_mmap_zero = mmap_zero;
 
+	/* Store the page size for later use */
+	_dl_pagesize = (auxvt[AT_PAGESZ].a_un.a_val)? auxvt[AT_PAGESZ].a_un.a_val : 4096;
+
 	/* Now we have done the mandatory linking of some things.  We are now
 	 * free to start using global variables, since these things have all been
 	 * fixed up by now.  Still no function calls outside of this library ,

Index: dl-startup.c
===================================================================
RCS file: /var/cvs/uClibc/ldso/ldso/dl-startup.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -d -r1.8 -r1.9
--- a/dl-startup.c	17 Feb 2004 07:33:12 -0000	1.8
+++ b/dl-startup.c	11 May 2004 11:14:58 -0000	1.9
@@ -133,12 +133,14 @@
 	Elf32_Dyn *dpnt;
 	unsigned long *hash_addr;
 	struct r_debug *debug_addr = NULL;
+	size_t _dl_pagesize;
 	int indx;
 #if defined(__i386__)
 	int status = 0;
 #endif
 
 
+
 	/* WARNING! -- we cannot make _any_ funtion calls until we have
 	 * taken care of fixing up our own relocations.  Making static
 	 * inline calls is ok, but _no_ function calls.  Not yet
@@ -288,7 +290,8 @@
 
 	/* Call mmap to get a page of writable memory that can be used
 	 * for _dl_malloc throughout the shared lib loader. */
-	mmap_zero = malloc_buffer = _dl_mmap((void *) 0, PAGE_SIZE,
+	_dl_pagesize = (auxvt[AT_PAGESZ].a_un.a_val)? auxvt[AT_PAGESZ].a_un.a_val : 4096;
+	mmap_zero = malloc_buffer = _dl_mmap((void *) 0, _dl_pagesize,
 			PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
 	if (_dl_mmap_check_error(mmap_zero)) {
 		SEND_STDERR("dl_boot: mmap of a spare page failed!\n");

Index: dl-elf.c
===================================================================
RCS file: /var/cvs/uClibc/ldso/ldso/dl-elf.c,v
retrieving revision 1.68
retrieving revision 1.69
diff -u -d -r1.68 -r1.69
--- a/dl-elf.c	18 Mar 2004 11:17:14 -0000	1.68
+++ b/dl-elf.c	11 May 2004 11:14:58 -0000	1.69
@@ -444,7 +444,7 @@
 		return NULL;
 	}
 
-	header = _dl_mmap((void *) 0, PAGE_SIZE, PROT_READ | PROT_WRITE,
+	header = _dl_mmap((void *) 0, _dl_pagesize, PROT_READ | PROT_WRITE,
 			MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
 	if (_dl_mmap_check_error(header)) {
 		_dl_dprintf(2, "%s: can't map '%s'\n", _dl_progname, libname);
@@ -453,7 +453,7 @@
 		return NULL;
 	};
 
-	_dl_read(infile, header, PAGE_SIZE);
+	_dl_read(infile, header, _dl_pagesize);
 	epnt = (ElfW(Ehdr) *) (intptr_t) header;
 	if (epnt->e_ident[0] != 0x7f ||
 			epnt->e_ident[1] != 'E' ||
@@ -464,7 +464,7 @@
 				libname);
 		_dl_internal_error_number = LD_ERROR_NOTELF;
 		_dl_close(infile);
-		_dl_munmap(header, PAGE_SIZE);
+		_dl_munmap(header, _dl_pagesize);
 		return NULL;
 	};
 
@@ -479,7 +479,7 @@
 		_dl_dprintf(2, "%s: '%s' is not an ELF executable for " ELF_TARGET
 				"\n", _dl_progname, libname);
 		_dl_close(infile);
-		_dl_munmap(header, PAGE_SIZE);
+		_dl_munmap(header, _dl_pagesize);
 		return NULL;
 	};
 
@@ -525,7 +525,7 @@
 		_dl_dprintf(2, "%s: can't map %s\n", _dl_progname, libname);
 		_dl_internal_error_number = LD_ERROR_MMAP_FAILED;
 		_dl_close(infile);
-		_dl_munmap(header, PAGE_SIZE);
+		_dl_munmap(header, _dl_pagesize);
 		return NULL;
 	};
 	libaddr = (unsigned long) status;
@@ -560,7 +560,7 @@
 					_dl_internal_error_number = LD_ERROR_MMAP_FAILED;
 					_dl_munmap((char *) libaddr, maxvma - minvma);
 					_dl_close(infile);
-					_dl_munmap(header, PAGE_SIZE);
+					_dl_munmap(header, _dl_pagesize);
 					return NULL;
 				};
 
@@ -593,7 +593,7 @@
 				_dl_internal_error_number = LD_ERROR_MMAP_FAILED;
 				_dl_munmap((char *) libaddr, maxvma - minvma);
 				_dl_close(infile);
-				_dl_munmap(header, PAGE_SIZE);
+				_dl_munmap(header, _dl_pagesize);
 				return NULL;
 			};
 
@@ -622,7 +622,7 @@
 		_dl_internal_error_number = LD_ERROR_NODYNAMIC;
 		_dl_dprintf(2, "%s: '%s' is missing a dynamic section\n",
 				_dl_progname, libname);
-		_dl_munmap(header, PAGE_SIZE);
+		_dl_munmap(header, _dl_pagesize);
 		return NULL;
 	}
 
@@ -725,7 +725,7 @@
 
 	}
 #endif
-	_dl_munmap(header, PAGE_SIZE);
+	_dl_munmap(header, _dl_pagesize);
 
 	return tpnt;
 }
@@ -803,7 +803,7 @@
 	char *start, *ptr, *string;
 	static char *buf;
 
-	buf = _dl_mmap((void *) 0, PAGE_SIZE, PROT_READ | PROT_WRITE,
+	buf = _dl_mmap((void *) 0, _dl_pagesize, PROT_READ | PROT_WRITE,
 			MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
 	if (_dl_mmap_check_error(buf)) {
 		_dl_write(fd, "mmap of a spare page failed!\n", 29);
@@ -815,7 +815,7 @@
 	if (!fmt)
 		return;
 
-	if (_dl_strlen(fmt) >= (PAGE_SIZE - 1)) {
+	if (_dl_strlen(fmt) >= (_dl_pagesize - 1)) {
 		_dl_write(fd, "overflow\n", 11);
 		_dl_exit(20);
 	}
@@ -873,7 +873,7 @@
 			start = NULL;
 		}
 	}
-	_dl_munmap(buf, PAGE_SIZE);
+	_dl_munmap(buf, _dl_pagesize);
 	return;
 }
 
@@ -902,7 +902,7 @@
 	if (_dl_malloc_function)
 		return (*_dl_malloc_function) (size);
 
-	if (_dl_malloc_addr - _dl_mmap_zero + size > PAGE_SIZE) {
+	if (_dl_malloc_addr - _dl_mmap_zero + size > _dl_pagesize) {
 #ifdef __SUPPORT_LD_DEBUG_EARLY__
 		_dl_dprintf(2, "malloc: mmapping more memory\n");
 #endif




More information about the uClibc-cvs mailing list