--- xc/programs/Xserver/hw/xfree86/loader/elfloader.c.orig 2006-04-08 19:53:39.000000000 +0200 +++ xc/programs/Xserver/hw/xfree86/loader/elfloader.c 2007-05-01 08:40:52.720051459 +0200 @@ -1168,7 +1168,7 @@ ErrorF("ELFCreateGOT() Unable to reallocate memory!!!!\n"); return FALSE; } -# if defined(linux) && defined(__ia64__) || defined(__OpenBSD__) || defined(__NetBSD__) +# if defined(linux) || defined(__OpenBSD__) || defined(__NetBSD__) { unsigned long page_size = getpagesize(); unsigned long round; @@ -3351,10 +3351,16 @@ elffile->lsection[j].size = SecSize(i); elffile->lsection[j].flags = flags; switch (SecType(i)) { -#if defined(__OpenBSD__) || defined(__NetBSD__) +#if defined(linux) || defined(__OpenBSD__) || defined(__NetBSD__) case SHT_PROGBITS: - mprotect(elffile->lsection[j].saddr, SecSize(i), + { + unsigned long page_size = getpagesize(); + unsigned long round; + + round = (unsigned long)elffile->lsection[j].saddr & (page_size -1); + mprotect( (char*)elffile->lsection[j].saddr - round, SecSize(i) + round, PROT_READ | PROT_WRITE | PROT_EXEC); + } break; #endif case SHT_SYMTAB: @@ -3556,7 +3562,7 @@ ErrorF("Unable to allocate ELF sections\n"); return NULL; } -# if defined(linux) && defined(__ia64__) || defined(__OpenBSD__) || defined(__NetBSD__) +# if defined(linux) || defined(__OpenBSD__) || defined(__NetBSD__) { unsigned long page_size = getpagesize(); unsigned long round;