diff --git a/gcl/h/elf64_aarch64_reloc.h b/gcl/h/elf64_aarch64_reloc.h
index f03d449..54c378d 100644
--- gcl-2.6.10.orig/h/elf64_aarch64_reloc.h
+++ gcl-2.6.10/h/elf64_aarch64_reloc.h
@@ -9,11 +9,13 @@
       {
 	long x=((long)(s+a-p))/4;
 	if (abs(x)&(~MASK(25))) {
-	  got+=gotp;
+	  if (a) {
+	    got+=gotp;
+	    gotp+=tz;
+	  } else
+	    got+=(sym->st_size-1)*tz;
 	  *got++=s+a;
-	  gotp++;
 	  memcpy(got,tramp,sizeof(tramp));
-	  gotp+=sizeof(tramp)/sizeof(*got);
 	  x=((long)got-p)/4;
 	}
 	store_vals(where,MASK(26),x);
diff --git a/gcl/h/elf64_aarch64_reloc_special.h b/gcl/h/elf64_aarch64_reloc_special.h
index 87c58c4..2f22c75 100644
--- gcl-2.6.10.orig/h/elf64_aarch64_reloc_special.h
+++ gcl-2.6.10/h/elf64_aarch64_reloc_special.h
@@ -1,8 +1,8 @@
 /* #define R_AARCH64_TRAMP 1 */
-ul gotp;
-
 static int tramp[]={0x58ffffd0, /*ldr 19bit pc relative x16*/
 		    0xd61f0200};/*br x16*/
+static ul gotp,tz=1+sizeof(tramp)/sizeof(ul);
+
 
 static int
 find_special_params(void *v,Shdr *sec1,Shdr *sece,const char *sn,
@@ -22,7 +22,7 @@ label_got_symbols(void *v1,Shdr *sec1,Shdr *sece,Sym *sym1,Sym *syme,const char
 
   gotp=0;
   for (sym=sym1;sym<syme;sym++)
-    sym->st_other=sym->st_size=0;
+    sym->st_size=0;
 
   for (*gs=0,sec=sec1;sec<sece;sec++)
     if (sec->sh_type==SHT_RELA)
@@ -30,12 +30,24 @@ label_got_symbols(void *v1,Shdr *sec1,Shdr *sece,Sym *sym1,Sym *syme,const char
 	if (ELF_R_TYPE(r->r_info)==R_AARCH64_JUMP26 ||
 	    ELF_R_TYPE(r->r_info)==R_AARCH64_CALL26) {
 
-	  /*FIXME try to figure out earlier if this space is needed*/
-	  (*gs)+=1+(sizeof(tramp)/sizeof(*gs));
-	  /* r->r_info=ELF_R_INFO(ELF_R_SYM(r->r_info),R_AARCH64_TRAMP); */
+	  if (r->r_addend)
+
+	    (*gs)+=tz;
+
+	  else {
+	  
+	    sym=sym1+ELF_R_SYM(r->r_info);
+	    
+	    if (!sym->st_size) 
+	      sym->st_size=++gotp;
+
+	  }
 
 	}
 
+  gotp*=tz;
+  (*gs)+=gotp;
+  
   return 0;
   
 }
diff --git a/gcl/h/protoize.h b/gcl/h/protoize.h
index 3d8ff1f..b3a4fc3 100644
--- gcl-2.6.10.orig/h/protoize.h
+++ gcl-2.6.10/h/protoize.h
@@ -243,7 +243,7 @@ typedef void (*funcvoid)(void);
 #ifndef __MINGW32__
 /* #include <signal.h> */
 #endif
-/* sgbc.c:1246:OF */ extern void memory_protect (int on); /* (on) int on; */
+/* sgbc.c:1246:OF */ extern int memory_protect (int on); /* (on) int on; */
 /* sgbc.c:1306:OF */ extern void perm_writable (char *p, long n); /* (p, n) char *p; int n; */
 /* sgbc.c:1321:OF */ extern void system_error (void); /* () */
 /* gbc.c:1357:OF */ extern void gcl_init_GBC (void); /* () */
@@ -1908,3 +1908,6 @@ void init_darwin_zone_compat ();
 
 void
 prelink_init(void);
+
+int
+gcl_mprotect(void *,unsigned long,int);
diff --git a/gcl/o/alloc.c b/gcl/o/alloc.c
index 58a2661..996718f 100644
--- gcl-2.6.10.orig/o/alloc.c
+++ gcl-2.6.10/o/alloc.c
@@ -1081,7 +1081,7 @@ gcl_init_alloc(void *cs_start) {
   
 #ifdef HAVE_MPROTECT
   if (data_start)
-    mprotect(data_start,(void *)core_end-data_start,PROT_READ|PROT_WRITE|PROT_EXEC);
+    massert(!gcl_mprotect(data_start,(void *)core_end-data_start,PROT_READ|PROT_WRITE|PROT_EXEC));
 #endif
 
 #ifdef SGC
@@ -1089,7 +1089,8 @@ gcl_init_alloc(void *cs_start) {
   massert(getpagesize()<=PAGESIZE);
   memprotect_test_reset();
   if (sgc_enabled)
-    memory_protect(1);
+    if (memory_protect(1))
+      sgc_quit();
 
 #endif
 
diff --git a/gcl/o/main.c b/gcl/o/main.c
index f5ecaaa..6a11c5f 100755
--- gcl-2.6.10.orig/o/main.c
+++ gcl-2.6.10/o/main.c
@@ -28,6 +28,7 @@ Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
 #include <unistd.h>
 #include <string.h>
 #include <fcntl.h>
+#include <sys/mman.h>
 
 static void
 init_main(void);
@@ -318,8 +319,6 @@ random_ulong() {
  
   object y;
   
-  if (raw_image) return 0;
-
   vs_top=vs_base;
   vs_push(Ct);
   Lmake_random_state();
@@ -333,16 +332,27 @@ random_ulong() {
 }
 #endif
 
+int
+gcl_mprotect(void *v,unsigned long l,int p) {
+
+  int i;
+  char b[80];
+
+  if ((i=mprotect(v,l,p))) {
+    snprintf(b,sizeof(b),"mprotect failure: %p %lu %d\b",v,l,p);
+    perror(b);
+  }
+
+  return i;
+
+}
+
 
 int
 main(int argc, char **argv, char **envp) {
 
   gcl_init_alloc(&argv);
 
-#ifdef NEED_STACK_CHK_GUARD
-  __stack_chk_guard=random_ulong();/*Cannot be safely set inside a function which returns*/
-#endif
-
 #ifdef CAN_UNRANDOMIZE_SBRK
 #include <stdio.h>
 #include <stdlib.h>
@@ -415,6 +425,9 @@ main(int argc, char **argv, char **envp) {
 #ifdef HAVE_READLINE
     gcl_init_readline_function();
 #endif
+#ifdef NEED_STACK_CHK_GUARD
+  __stack_chk_guard=random_ulong();/*Cannot be safely set inside a function which returns*/
+#endif
 
   }
 
diff --git a/gcl/o/sfaslelf.c b/gcl/o/sfaslelf.c
index 2e7ee0c..60d7f5d 100755
--- gcl-2.6.10.orig/o/sfaslelf.c
+++ gcl-2.6.10/o/sfaslelf.c
@@ -535,7 +535,7 @@ clear_protect_memory(object memory) {
   p=(void *)((unsigned long)memory->cfd.cfd_start & ~(PAGESIZE-1));
   pe=(void *)((unsigned long)(memory->cfd.cfd_start+memory->cfd.cfd_size + PAGESIZE-1) & ~(PAGESIZE-1));
 
-  return mprotect(p,pe-p,PROT_READ|PROT_WRITE|PROT_EXEC);
+  return gcl_mprotect(p,pe-p,PROT_READ|PROT_WRITE|PROT_EXEC);
 
 }
 
diff --git a/gcl/o/sgbc.c b/gcl/o/sgbc.c
index 042177d..19336f4 100755
--- gcl-2.6.10.orig/o/sgbc.c
+++ gcl-2.6.10/o/sgbc.c
@@ -10,10 +10,6 @@
 static void
 sgc_mark_object1(object);
 
-static void
-sgc_mprotect(long, long, int);
-
-
 #ifdef BSD
 /* ulong may have been defined in mp.h but the define is no longer needed */
 #undef ulong
@@ -908,7 +904,7 @@ memprotect_handler_test(int sig, long code, void *scp, char *addr) {
     memprotect_result=memprotect_bad_fault_address;
   else
     memprotect_result=memprotect_none;
-  mprotect(memprotect_test_address,PAGESIZE,PROT_READ_WRITE_EXEC);
+  gcl_mprotect(memprotect_test_address,PAGESIZE,PROT_READ_WRITE_EXEC);
 
 }
 
@@ -953,7 +949,7 @@ memprotect_test(void) {
   { /* mips kernel bug test -- SIGBUS with no faddr when floating point is emulated. */
     float *f1=(void *)memprotect_test_address,*f2=(void *)b2,*f1e=f1+p/sizeof(*f1);
   
-    if (mprotect(memprotect_test_address,p,PROT_READ_EXEC)) {
+    if (gcl_mprotect(memprotect_test_address,p,PROT_READ_EXEC)) {
       memprotect_result=memprotect_cannot_protect;
       return -1;
     }
@@ -969,7 +965,7 @@ memprotect_test(void) {
     memprotect_handler_invocations=0;
 
   }
-  if (mprotect(memprotect_test_address,p,PROT_READ_EXEC)) {
+  if (gcl_mprotect(memprotect_test_address,p,PROT_READ_EXEC)) {
     memprotect_result=memprotect_cannot_protect;
     return -1;
   }
@@ -1332,8 +1328,9 @@ sgc_start(void) {
      and modified the tm_table;
      Turn  memory protection on for the pages which are writable.
   */
-  memory_protect(1);
   sgc_enabled=1;
+  if (memory_protect(1)) 
+    sgc_quit();
   if (sSAnotify_gbcA->s.s_dbind != Cnil) {
     printf("[SGC on]"); 
     fflush(stdout);
@@ -1505,7 +1502,7 @@ memprotect_handler(int sig, long code, void *scp, char *addr) {
     INSTALL_MPROTECT_HANDLER;
 #endif
 
-    mprotect(pagetoinfo(p),PAGESIZE,PROT_READ_WRITE_EXEC);
+    massert(!gcl_mprotect(pagetoinfo(p),PAGESIZE,PROT_READ_WRITE_EXEC));
     SET_WRITABLE(p);
     fault_pages++;
 
@@ -1521,7 +1518,7 @@ memprotect_handler(int sig, long code, void *scp, char *addr) {
 
 }
 
-static void
+static int
 sgc_mprotect(long pbeg, long n, int writable) {
   /* CHECK_RANGE(pbeg,n);  */
 #ifdef DEBUG_MPROTECT
@@ -1531,14 +1528,18 @@ sgc_mprotect(long pbeg, long n, int writable) {
 	 pagetoinfo(pbeg), n * PAGESIZE, sbrk(0));
   fflush(stdout);
 #endif  
-  if(mprotect(pagetoinfo(pbeg),n*PAGESIZE,
-	      (writable & SGC_WRITABLE ? PROT_READ_WRITE_EXEC : PROT_READ_EXEC)))
-    FEerror("Couldn't protect",0);
+  if(gcl_mprotect(pagetoinfo(pbeg),n*PAGESIZE,(writable & SGC_WRITABLE ? PROT_READ_WRITE_EXEC : PROT_READ_EXEC))) {
+    perror("sgc disabled");
+    return -1;
+  }
+
+  return 0;
+
 }
 
 
 
-void
+int
 memory_protect(int on) {
 
   unsigned long i,beg,end= page(core_end);
@@ -1552,7 +1553,7 @@ memory_protect(int on) {
   if (on==0) {
     sgc_mprotect(first_protectable_page,end-first_protectable_page,SGC_WRITABLE);
     install_segmentation_catcher();
-    return;
+    return 0;
   }
 
   INSTALL_MPROTECT_HANDLER;
@@ -1563,12 +1564,15 @@ memory_protect(int on) {
 
     if (writable==IS_WRITABLE(i) && i<=end) continue;
 
-    sgc_mprotect(beg,i-beg,writable);
+    if (sgc_mprotect(beg,i-beg,writable)) 
+      return -1;
     writable=1-writable;
     beg=i;
 
   }
 
+  return 0;
+
 }
 
 static void
