[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