--- gcl-2.6.7/o/main.c.pers 2005-09-09 20:36:46.000000000 +0200
+++ gcl-2.6.7/o/main.c 2005-09-09 21:07:51.000000000 +0200
@@ -117,11 +117,9 @@
#endif
#endif
-#ifdef NEED_NONRANDOM_SBRK
#include <syscall.h>
-#include <linux/personality.h>
+#include <sys/personality.h>
#include <unistd.h>
-#endif
int
main(int argc, char **argv, char **envp) {
@@ -131,14 +129,25 @@
#endif
#endif
-#ifdef NEED_NONRANDOM_SBRK
-#if SIZEOF_LONG == 4
- if (!syscall(SYS_personality,PER_LINUX32))
-#else
- if (!syscall(SYS_personality,PER_LINUX))
-#endif
- execvp(argv[0],argv);
-#endif
+ long pers = personality(-1);
+ /* 0x40000 aka. ADDR_NO_RANDOMIZE */
+ if (!(pers & 0x40000)) {
+ if (personality(pers | 0x40000) != -1) {
+ /* Use /proc/self/exe instead of trying to figure out the
+ * executable path from PATH and argv[0], since that's reliable.
+ */
+ char buf[PATH_MAX+1];
+ int rc = readlink("/proc/self/exe", buf, PATH_MAX);
+ if ( rc > 0 ) {
+ buf[rc]=0;
+ execve(buf, argv, envp);
+ }
+ }
+ /* Either changing the personality or execve() failed. Either
+ * way we might as well continue, and hope that the random
+ * memory maps are ok this time around.
+ */
+ }
#if defined(DARWIN)
extern void init_darwin_zone_compat ();
--- gcl-2.6.7/configure.pers 2005-09-09 20:51:26.000000000 +0200
+++ gcl-2.6.7/configure 2005-09-09 21:06:56.000000000 +0200
@@ -3887,17 +3887,18 @@
#line 3888 "configure"
#include "confdefs.h"
#include <syscall.h>
- #include <linux/personality.h>
+ #include <sys/personality.h>
#include <stdio.h>
#include <unistd.h>
int main(int argc,char * argv[]) {
FILE *f;
- #if SIZEOF_LONG == 4
- if (!syscall(SYS_personality,PER_LINUX32))
- #else
- if (!syscall(SYS_personality,PER_LINUX))
- #endif
- execvp(argv[0],argv);
+ long pers = personality(-1);
+ if (!(pers & 0x40000)) {
+ if (personality(pers | 0x40000) != -1) {
+ execvp(argv[0],argv);
+ }
+ }
+
if (!(f=fopen("conftest1","w")))
return -1;
fprintf(f,"%u",sbrk(0));
@@ -3927,17 +3928,17 @@
#line 3928 "configure"
#include "confdefs.h"
#include <syscall.h>
- #include <linux/personality.h>
+ #include <sys/personality.h>
#include <stdio.h>
#include <unistd.h>
int main(int argc,char * argv[]) {
FILE *f;
- #if SIZEOF_LONG == 4
- if (!syscall(SYS_personality,PER_LINUX32))
- #else
- if (!syscall(SYS_personality,PER_LINUX))
- #endif
- execvp(argv[0],argv);
+ long pers = personality(-1);
+ if (!(pers & 0x40000)) {
+ if (personality(pers | 0x40000) != -1) {
+ execvp(argv[0],argv);
+ }
+ }
if (!(f=fopen("conftest1","w")))
return -1;
fprintf(f,"%u",sbrk(0));
@@ -3989,25 +3990,22 @@
#include "confdefs.h"
#include <stdio.h>
#include <stdlib.h>
- #ifdef NEED_NONRANDOM_SBRK
#include <syscall.h>
- #include <linux/personality.h>
+ #include <sys/personality.h>
#include <unistd.h>
- #endif
int
main(int argc,char * argv[])
{
char *b;
FILE *fp;
-#ifdef NEED_NONRANDOM_SBRK
-#if SIZEOF_LONG == 4
-if (!syscall(SYS_personality,PER_LINUX32))
-#else
-if (!syscall(SYS_personality,PER_LINUX))
-#endif
- execvp(argv[0],argv);
-#endif
+ long pers = personality(-1);
+ if (!(pers & 0x40000)) {
+ if (personality(pers | 0x40000) != -1) {
+ execvp(argv[0],argv);
+ }
+ }
+
b = (void *) malloc(1000);
fp = fopen("conftest1","w");