from origin/Version_2_6_11pre to ppc64le
a: origin/Version_2_6_11pre
b: ppc64le

Help
Common Key Bindings:
p:previous block  n:next block  G:redisplay  q:quit
Extra Bindings for Diff blocks:
RET:visit file/line
diff --git gcl-2.6.10.orig/h/elf64_ppcle_reloc.h gcl-2.6.10/h/elf64_ppcle_reloc.h
new file mode 100644
index 0000000..3dd6a2e
--- /dev/null
+++ gcl-2.6.10/h/elf64_ppcle_reloc.h
@@ -0,0 +1,24 @@
+#define ha(x_) ((((x_) >> 16) + (((x_) & 0x8000) ? 1 : 0)) & 0xffff)
+#define lo(x_) ((x_) & 0xffff)
+
+    case R_PPC64_REL16_HA: 
+      store_val(where,MASK(16),ha(s+a-p));
+      break;
+    case R_PPC64_TOC16_HA: 
+      store_val(where,MASK(16),ha(s+a-toc->st_value));
+      break;
+    case R_PPC64_TOC16_LO_DS: 
+      store_val(where,MASK(16),lo(s+a-toc->st_value));/*>>2*/
+      break;
+    case R_PPC64_REL16_LO:
+      store_val(where,MASK(16),lo(s+a-p));
+      break;
+    case R_PPC64_TOC16_LO:
+      store_val(where,MASK(16),lo(s+a-toc->st_value));
+      break;
+    case R_PPC64_ADDR64:
+      store_val(where,~0L,(s+a));
+      break;
+    case R_PPC64_TOC:
+      store_val(where,~0L,toc->st_value);
+      break;
diff --git gcl-2.6.10.orig/h/elf64_ppcle_reloc_special.h gcl-2.6.10/h/elf64_ppcle_reloc_special.h
new file mode 100644
index 0000000..7b08122
--- /dev/null
+++ gcl-2.6.10/h/elf64_ppcle_reloc_special.h
@@ -0,0 +1,65 @@
+static Sym *toc;
+
+static int tramp[]={0,0,
+		    (((0x3a<<10)|(0x9<<5)|0xc)<<16)|0xfff8,/*ld      r9,-8(r12)*/
+		    ((0x3a<<10)|(0x9<<5)|0x9)<<16,         /*ld      r9,0(r9)*/
+		    0x7d2c4b78,                            /*mr      r12,r9 */
+		    0x7d8903a6,                            /*mtctr   r12*/
+		    0x4e800420                             /*bctrl*/
+};
+
+static int
+find_special_params(void *v,Shdr *sec1,Shdr *sece,const char *sn,
+		    const char *st1,Sym *ds1,Sym *dse,Sym *sym,Sym *syme) {
+  
+  Shdr *sec;
+  Rela *r;
+  void *ve;
+  ul j,*u;
+
+
+  massert((sec=get_section(".rel.dyn",sec1,sece,sn))||
+	  (sec=get_section(".rela.dyn",sec1,sece,sn)));
+
+  v+=sec->sh_offset;
+  ve=v+sec->sh_size;
+
+  for (j=0,r=v;v<ve;v+=sec->sh_entsize,r=v) 
+    if (ELF_R_TYPE(r->r_info) && !ds1[ELF_R_SYM(r->r_info)].st_value)
+      j++;
+
+  massert(u=malloc(j*sizeof(tramp)));
+
+  v=ve-sec->sh_size;
+  for (r=v;v<ve;v+=sec->sh_entsize,r=v) 
+    if (ELF_R_TYPE(r->r_info) && !ds1[ELF_R_SYM(r->r_info)].st_value) {
+      memcpy(u,tramp,sizeof(tramp));
+      *u++=r->r_offset;
+      ds1[ELF_R_SYM(r->r_info)].st_value=(ul)u;
+      u=((void *)(u-1)+sizeof(tramp));
+    }
+
+  return 0;
+
+}
+
+static int
+label_got_symbols(void *v1,Shdr *sec1,Shdr *sece,Sym *sym1,Sym *syme,const char *st1,const char *sn,ul *gs) {
+
+  Shdr *sec;
+  Sym *sym;
+  
+  massert(sec=get_section(".toc",sec1,sece,sn));
+
+  for (sym=sym1;sym<syme;sym++) {
+    const char *s=st1+sym->st_name;
+    if (!strcmp(s,".TOC.") || !strcmp(s,".toc.")) {
+      toc=sym;
+      toc->st_info=ELF_ST_INFO(STB_LOCAL,ELF_ST_TYPE(sym->st_info));
+      toc->st_shndx=sec-sec1;
+    }
+  }
+
+  return 0;
+  
+}
diff --git gcl-2.6.10.orig/h/powerpc-linux.h gcl-2.6.10/h/powerpc-linux.h
index 467c5f7..3e2e4a4 100644
--- gcl-2.6.10.orig/h/powerpc-linux.h
+++ gcl-2.6.10/h/powerpc-linux.h
@@ -19,8 +19,13 @@
 #if SIZEOF_LONG == 4
 #define RELOC_H "elf32_ppc_reloc.h"
 #else
+#ifdef WORDS_BIGENDIAN
 #define RELOC_H "elf64_ppc_reloc.h"
 #define SPECIAL_RELOC_H "elf64_ppc_reloc_special.h"
+#else
+#define RELOC_H "elf64_ppcle_reloc.h"
+#define SPECIAL_RELOC_H "elf64_ppcle_reloc_special.h"
+#endif
 #define STATIC_FUNCTION_POINTERS
 #define C_GC_OFFSET 4
 #endif
diff --git gcl-2.6.10.orig/o/main.c gcl-2.6.10/o/main.c
index 0fa7f5e..f57d776 100755
--- gcl-2.6.10.orig/o/main.c
+++ gcl-2.6.10/o/main.c
@@ -205,7 +205,7 @@ int
 update_real_maxpage(void) {
 
   ufixnum i,j,k;
-  void *end,*cur;
+  void *end,*cur,*beg;
 #ifdef __MINGW32__
   static fixnum n;
 
@@ -216,8 +216,9 @@ update_real_maxpage(void) {
 #endif
 
   massert(cur=sbrk(0));
+  beg=data_start ? data_start : cur;
   for (i=0,j=(1L<<log_maxpage_bound);j>PAGESIZE;j>>=1)
-    if ((end=(data_start ? data_start : cur)+i+j-PAGESIZE)>cur)
+    if ((end=beg+i+j-PAGESIZE)>cur)
       if (!mbrk(end)) {
 	real_maxpage=page(end);
 	i+=j;
@@ -227,10 +228,10 @@ update_real_maxpage(void) {
   phys_pages=get_phys_pages_no_malloc();
 
 #ifdef BRK_DOES_NOT_GUARANTEE_ALLOCATION
-  if (phys_pages>0 && real_maxpage>phys_pages+first_data_page) real_maxpage=phys_pages+first_data_page;
+  if (phys_pages>0 && real_maxpage>phys_pages+page(beg)) real_maxpage=phys_pages+page(beg);
 #endif
 
-  available_pages=real_maxpage-first_data_page;
+  available_pages=real_maxpage-page(beg);
   for (i=t_start,j=0;i<t_other;i++) {
     k=tm_table[i].tm_maxpage;
     if (tm_table[i].tm_type==t_relocatable)
diff --git gcl-2.6.10.orig/o/unexelf.c gcl-2.6.10/o/unexelf.c
index aa7d2fc..8df244a 100755
--- gcl-2.6.10.orig/o/unexelf.c
+++ gcl-2.6.10/o/unexelf.c
@@ -847,7 +847,7 @@ unexec (char *new_name, char *old_name, unsigned int data_start, unsigned int bs
 	  && (round_up ((NEW_PROGRAM_H (n)).p_vaddr
 			+ (NEW_PROGRAM_H (n)).p_filesz,
 			alignment)
-	      == round_up (old_bss_addr, alignment)))
+	      <= round_up (old_bss_addr, alignment)))
 	break;
     }
   if (n < 0)
