[uClibc][PATCH] Address alignment in ldso

Tobias Anderberg tobias.anderberg at axis.com
Wed May 22 14:31:03 UTC 2002


Here's a patch which defines a few macros for address alignment in
ldso instead of using hardcoded values, as explained in my earlier
posts.

I added this for all arch's, though I have only tested it with i386
and the upcomming CRIS.

/tobba

Index: ldso.c
===================================================================
RCS file: /var/cvs/uClibc/ldso/ldso/ldso.c,v
retrieving revision 1.42
diff -u -w -r1.42 ldso.c
--- ldso.c	20 May 2002 18:30:16 -0000	1.42
+++ ldso.c	22 May 2002 14:20:05 -0000
@@ -448,8 +448,8 @@
 					header->e_phoff);
 			for (i = 0; i < header->e_phnum; i++, ppnt++) {
 				if (ppnt->p_type == PT_LOAD && !(ppnt->p_flags & PF_W)) {
-					_dl_mprotect((void *) (load_addr + (ppnt->p_vaddr & 0xfffff000)),
-							(ppnt->p_vaddr & 0xfff) + (unsigned long) ppnt->p_filesz,
+					_dl_mprotect((void *) (load_addr + (ppnt->p_vaddr & PAGE_ALIGN)),
+							(ppnt->p_vaddr & ADDR_ALIGN) + (unsigned long) ppnt->p_filesz,
 							PROT_READ | PROT_WRITE | PROT_EXEC);
 				}
 			}
@@ -460,8 +460,8 @@
 			ppnt = (elf_phdr *) auxvt[AT_PHDR].a_un.a_ptr;
 			for (i = 0; i < auxvt[AT_PHNUM].a_un.a_val; i++, ppnt++) {
 				if (ppnt->p_type == PT_LOAD && !(ppnt->p_flags & PF_W))
-					_dl_mprotect((void *) (ppnt->p_vaddr & 0xfffff000),
-								 (ppnt->p_vaddr & 0xfff) +
+					_dl_mprotect((void *) (ppnt->p_vaddr & PAGE_ALIGN),
+								 (ppnt->p_vaddr & ADDR_ALIGN) +
 								 (unsigned long) ppnt->p_filesz,
 								 PROT_READ | PROT_WRITE | PROT_EXEC);
 			}
@@ -720,7 +720,7 @@
 			int readsize = 0;
 			char *pnt, *pnt1, buf[1024];
 			tpnt->libname = _dl_strdup((char *) ppnt->p_offset +
-					(auxvt[AT_PHDR].a_un.a_val & 0xfffff000));
+					(auxvt[AT_PHDR].a_un.a_val & PAGE_ALIGN));

 			/* Determine if the shared lib loader is a symlink */
 			_dl_memset(buf, 0, sizeof(buf));
@@ -1107,8 +1107,8 @@
 		for (tpnt = _dl_loaded_modules; tpnt; tpnt = tpnt->next) {
 			for (ppnt = tpnt->ppnt, i = 0; i < tpnt->n_phent; i++, ppnt++) {
 				if (ppnt->p_type == PT_LOAD && !(ppnt->p_flags & PF_W) && tpnt->dynamic_info[DT_TEXTREL]) {
-					_dl_mprotect((void *) (tpnt->loadaddr + (ppnt->p_vaddr & 0xfffff000)),
-							(ppnt->p_vaddr & 0xfff) + (unsigned long) ppnt->p_filesz, LXFLAGS(ppnt->p_flags));
+					_dl_mprotect((void *) (tpnt->loadaddr + (ppnt->p_vaddr & PAGE_ALIGN)),
+							(ppnt->p_vaddr & ADDR_ALIGN) + (unsigned long) ppnt->p_filesz, LXFLAGS(ppnt->p_flags));
 				}
 			}
 		}
Index: readelflib1.c
===================================================================
RCS file: /var/cvs/uClibc/ldso/ldso/readelflib1.c,v
retrieving revision 1.26
diff -u -w -r1.26 readelflib1.c
--- readelflib1.c	20 May 2002 18:30:16 -0000	1.26
+++ readelflib1.c	22 May 2002 14:20:05 -0000
@@ -448,9 +448,9 @@
 				char *cpnt;

 				status = (char *) _dl_mmap((char *) ((piclib ? libaddr : 0) +
-					(ppnt->p_vaddr & 0xfffff000)), (ppnt->p_vaddr & 0xfff)
+					(ppnt->p_vaddr & PAGE_ALIGN)), (ppnt->p_vaddr & ADDR_ALIGN)
 					+ ppnt->p_filesz, LXFLAGS(ppnt->p_flags), flags, infile,
-					ppnt->p_offset & 0x7ffff000);
+					ppnt->p_offset & OFFS_ALIGN);

 				if (_dl_mmap_check_error(status)) {
 					_dl_dprintf(2, "%s: can't map '%s'\n",
@@ -462,9 +462,9 @@
 				};

 				/* Pad the last page with zeroes. */
-				cpnt = (char *) (status + (ppnt->p_vaddr & 0xfff) +
+				cpnt = (char *) (status + (ppnt->p_vaddr & ADDR_ALIGN) +
 							  ppnt->p_filesz);
-				while (((unsigned long) cpnt) & 0xfff)
+				while (((unsigned long) cpnt) & ADDR_ALIGN)
 					*cpnt++ = 0;

 				/* I am not quite sure if this is completely
@@ -473,17 +473,17 @@
 				 * /dev/zero if there are any pages left over
 				 * that are not mapped as part of the file */

-				map_size = (ppnt->p_vaddr + ppnt->p_filesz + 0xfff) & 0xfffff000;
+				map_size = (ppnt->p_vaddr + ppnt->p_filesz + ADDR_ALIGN) & PAGE_ALIGN;
 				if (map_size < ppnt->p_vaddr + ppnt->p_memsz)
 					status = (char *) _dl_mmap((char *) map_size +
 						(piclib ? libaddr : 0),
 						ppnt->p_vaddr + ppnt->p_memsz - map_size,
 						LXFLAGS(ppnt->p_flags), flags | MAP_ANONYMOUS, -1, 0);
 			} else
-				status = (char *) _dl_mmap((char *) (ppnt->p_vaddr & 0xfffff000)
-					+ (piclib ? libaddr : 0), (ppnt->p_vaddr & 0xfff) +
+				status = (char *) _dl_mmap((char *) (ppnt->p_vaddr & PAGE_ALIGN)
+					+ (piclib ? libaddr : 0), (ppnt->p_vaddr & ADDR_ALIGN) +
 					ppnt->p_filesz, LXFLAGS(ppnt->p_flags), flags,
-					infile, ppnt->p_offset & 0x7ffff000);
+					infile, ppnt->p_offset & OFFS_ALIGN);
 			if (_dl_mmap_check_error(status)) {
 				_dl_dprintf(2, "%s: can't map '%s'\n", _dl_progname, libname);
 				_dl_internal_error_number = DL_ERROR_MMAP_FAILED;
@@ -559,8 +559,8 @@
 		for (i = 0; i < epnt->e_phnum; i++, ppnt++) {
 			if (ppnt->p_type == PT_LOAD && !(ppnt->p_flags & PF_W))
 				_dl_mprotect((void *) ((piclib ? libaddr : 0) +
-					    (ppnt->p_vaddr & 0xfffff000)),
-					(ppnt->p_vaddr & 0xfff) + (unsigned long) ppnt->p_filesz,
+					    (ppnt->p_vaddr & PAGE_ALIGN)),
+					(ppnt->p_vaddr & ADDR_ALIGN) + (unsigned long) ppnt->p_filesz,
 					PROT_READ | PROT_WRITE | PROT_EXEC);
 		}
 	}
Index: arm/ld_sysdep.h
===================================================================
RCS file: /var/cvs/uClibc/ldso/ldso/arm/ld_sysdep.h,v
retrieving revision 1.3
diff -u -w -r1.3 ld_sysdep.h
--- arm/ld_sysdep.h	17 Feb 2002 11:50:18 -0000	1.3
+++ arm/ld_sysdep.h	22 May 2002 14:20:05 -0000
@@ -117,3 +117,8 @@
 }

 #define do_rem(result, n, base)  result=arm_modulus(n,base);
+
+/* 4096 bytes alignment */
+#define PAGE_ALIGN 0xfffff000
+#define ADDR_ALIGN 0xfff
+#define OFFS_ALIGN 0x7ffff000
Index: i386/ld_sysdep.h
===================================================================
RCS file: /var/cvs/uClibc/ldso/ldso/i386/ld_sysdep.h,v
retrieving revision 1.7
diff -u -w -r1.7 ld_sysdep.h
--- i386/ld_sysdep.h	14 Jun 2001 21:37:47 -0000	1.7
+++ i386/ld_sysdep.h	22 May 2002 14:20:05 -0000
@@ -74,3 +74,8 @@
 extern unsigned long _dl_linux_resolver(struct elf_resolve * tpnt, int reloc_entry);

 #define do_rem(result, n, base)  result = (n % base)
+
+/* 4096 bytes alignment */
+#define PAGE_ALIGN 0xfffff000
+#define ADDR_ALIGN 0xfff
+#define OFFS_ALIGN 0x7ffff000
Index: m68k/ld_sysdep.h
===================================================================
RCS file: /var/cvs/uClibc/ldso/ldso/m68k/ld_sysdep.h,v
retrieving revision 1.2
diff -u -w -r1.2 ld_sysdep.h
--- m68k/ld_sysdep.h	14 Jun 2001 21:37:47 -0000	1.2
+++ m68k/ld_sysdep.h	22 May 2002 14:20:05 -0000
@@ -81,3 +81,8 @@
 /* Define this because we do not want to call .udiv in the library.
    Not needed for m68k.  */
 #define do_rem(result, n, base)  ((result) = (n) % (base))
+
+/* 4096 bytes alignment */
+#define PAGE_ALIGN 0xfffff000
+#define ADDR_ALIGN 0xfff
+#define OFFS_ALIGN 0x7ffff000
Index: mips/ld_sysdep.h
===================================================================
RCS file: /var/cvs/uClibc/ldso/ldso/mips/ld_sysdep.h,v
retrieving revision 1.5
diff -u -w -r1.5 ld_sysdep.h
--- mips/ld_sysdep.h	20 May 2002 18:30:17 -0000	1.5
+++ mips/ld_sysdep.h	22 May 2002 14:20:05 -0000
@@ -129,3 +129,8 @@


 #define do_rem(result, n, base)  result = (n % base)
+
+/* 4096 bytes alignment */
+#define PAGE_ALIGN 0xfffff000
+#define ADDR_ALIGN 0xfff
+#define OFFS_ALIGN 0x7ffff000
Index: powerpc/ld_sysdep.h
===================================================================
RCS file: /var/cvs/uClibc/ldso/ldso/powerpc/ld_sysdep.h,v
retrieving revision 1.3
diff -u -w -r1.3 ld_sysdep.h
--- powerpc/ld_sysdep.h	12 Nov 2001 03:06:38 -0000	1.3
+++ powerpc/ld_sysdep.h	22 May 2002 14:20:05 -0000
@@ -120,3 +120,8 @@


 #define do_rem(result, n, base)  result = (n % base)
+
+/* 4096 bytes alignment */
+#define PAGE_ALIGN 0xfffff000
+#define ADDR_ALIGN 0xfff
+#define OFFS_ALIGN 0x7ffff000
Index: sparc/ld_sysdep.h
===================================================================
RCS file: /var/cvs/uClibc/ldso/ldso/sparc/ld_sysdep.h,v
retrieving revision 1.2
diff -u -w -r1.2 ld_sysdep.h
--- sparc/ld_sysdep.h	14 Jun 2001 21:37:47 -0000	1.2
+++ sparc/ld_sysdep.h	22 May 2002 14:20:05 -0000
@@ -123,3 +123,7 @@
 #define _dl_linux_resolve _elf_rtbndr
 #endif

+/* 4096 bytes alignment */
+#define PAGE_ALIGN 0xfffff000
+#define ADDR_ALIGN 0xfff
+#define OFFS_ALIGN 0x7ffff000




More information about the uClibc mailing list