385abae
Description: <short summary of the patch>
385abae
 TODO: Put a short summary on the line above and replace this paragraph
385abae
 with a longer explanation of this change. Complete the meta-information
385abae
 with other relevant fields (see below for details). To make it easier, the
385abae
 information below has been extracted from the changelog. Adjust it or drop
385abae
 it.
385abae
 .
385abae
 gcl (2.6.12-74) unstable; urgency=medium
385abae
 .
385abae
   * Version_2_6_13pre63
385abae
Author: Camm Maguire <camm@debian.org>
385abae
385abae
---
385abae
The information above should follow the Patch Tagging Guidelines, please
385abae
checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here
385abae
are templates for supplementary fields that you might want to add:
385abae
385abae
Origin: <vendor|upstream|other>, <url of original patch>
385abae
Bug: <url in upstream bugtracker>
385abae
Bug-Debian: https://bugs.debian.org/<bugnumber>
385abae
Bug-Ubuntu: https://launchpad.net/bugs/<bugnumber>
385abae
Forwarded: <no|not-needed|url proving that it has been forwarded>
385abae
Reviewed-By: <name and email of someone who approved the patch>
385abae
Last-Update: 2018-03-21
385abae
385abae
--- gcl-2.6.12.orig/h/elf64_alpha_reloc.h
385abae
+++ gcl-2.6.12/h/elf64_alpha_reloc.h
385abae
@@ -1,16 +1,14 @@
385abae
     case R_ALPHA_GPDISP:
385abae
-      s=(ul)got;
385abae
-      s-=p; 
385abae
-      s+=(s&0x8000)<<1;
385abae
-      store_val(where,MASK(16),s>>16); 
385abae
-      where=(void *)where+a; 
385abae
-      store_val(where,MASK(16),s); 
385abae
+      gotoff=(ul)(got+(a>>32));
385abae
+      s=gotoff-p;
385abae
+      store_val(where,MASK(16),(s-(short)s)>>16);
385abae
+      store_val((void *)where+(a&MASK(32)),MASK(16),s);
385abae
       break;
385abae
     case R_ALPHA_SREL32:
385abae
       store_val(where,MASK(32),s+a-p);
385abae
       break;
385abae
     case R_ALPHA_GPREL32:
385abae
-      store_val(where,MASK(32),s+a-(ul)got);
385abae
+      store_val(where,MASK(32),s+a-gotoff);
385abae
       break;
385abae
     case R_ALPHA_LITUSE:
385abae
     case R_ALPHA_HINT:
385abae
@@ -22,23 +20,20 @@
385abae
       store_val(where,MASK(32),s+a);
385abae
       break;
385abae
     case R_ALPHA_LITERAL:
385abae
-      massert(a || sym->st_size);
385abae
-      gote=got+(a ? (a>>32) : sym->st_size)-1;
385abae
+      s+=a&MASK(32);
385abae
+      a=(a>>32)-1;
385abae
       if (s>=ggot1 && s
385abae
-        massert(!write_stub(s,got,gote));
385abae
+        massert(!write_stub(s,(ul *)gotoff,got+a));
385abae
       } else 
385abae
-	*gote=s+(a&MASK(32));
385abae
-      s=(gote-got)*sizeof(*got);
385abae
-      massert(!(s&~MASK(15)));
385abae
-      store_val(where,MASK(16),s);
385abae
+        got[a]=s;
385abae
+      store_vals(where,MASK(16),(ul)(got+a)-gotoff);
385abae
       break;
385abae
     case R_ALPHA_GPRELHIGH:
385abae
-      s+=a-(ul)got;
385abae
-      s+=(s&0x8000)<<1;      
385abae
-      store_val(where,MASK(16),s>>16);
385abae
+      s+=a-gotoff;
385abae
+      store_val(where,MASK(16),(s-(short)s)>>16);
385abae
       break;
385abae
     case R_ALPHA_GPRELLOW:
385abae
-      store_val(where,MASK(16),s+a-(ul)got);
385abae
+      store_val(where,MASK(16),s+a-gotoff);
385abae
       break;
385abae
     case R_ALPHA_TLS_GD_HI:
385abae
       store_vals(where,MASK(21),((long)(s+a-(p+4)))>>2);
385abae
--- gcl-2.6.12.orig/h/elf64_alpha_reloc_special.h
385abae
+++ gcl-2.6.12/h/elf64_alpha_reloc_special.h
385abae
@@ -1,4 +1,4 @@
385abae
-static ul ggot1,ggote;
385abae
+static ul ggot1,ggote,gotoff;
385abae
 
385abae
 static int
385abae
 write_stub(ul s,ul *got,ul *gote) {
385abae
@@ -61,44 +61,60 @@ find_special_params(void *v,Shdr *sec1,S
385abae
 static int
385abae
 label_got_symbols(void *v1,Shdr *sec1,Shdr *sece,Sym *sym1,Sym *syme,const char *st1,const char *sn,ul *gs) {
385abae
 
385abae
-  Sym *sym;
385abae
-  Rela *r,*rr;
385abae
+  Sym *sym,*fsym=sym1;
385abae
+  Rela *r;
385abae
   Shdr *sec;
385abae
-  void *v,*ve,*vv;
385abae
-  ul q;
385abae
+  void *v,*ve;
385abae
+  ul q,gotp;
385abae
 
385abae
   for (sym=sym1;sym
385abae
     sym->st_size=0;
385abae
 
385abae
-  for (*gs=0,sec=sec1;sec
385abae
-    if (sec->sh_type==SHT_RELA || sec->sh_type==SHT_REL)
385abae
+  for (*gs=gotp=0,sec=sec1;sec
385abae
+    if (sec->sh_type==SHT_RELA)
385abae
       for (v=v1+sec->sh_offset,ve=v+sec->sh_size,r=v;v<ve;v+=sec->sh_entsize,r=v)
385abae
 
385abae
-	if (ELF_R_TYPE(r->r_info)==R_ALPHA_LITERAL) {
385abae
+	switch(ELF_R_TYPE(r->r_info)) {
385abae
+
385abae
+	case R_ALPHA_LITERAL:
385abae
 
385abae
-	  if (sec->sh_type!=SHT_RELA || !r->r_addend) {
385abae
+	  if (!r->r_addend) {
385abae
 
385abae
 	    sym=sym1+ELF_R_SYM(r->r_info);
385abae
+	    q=(gotp-sym->st_size)*sizeof(*gs);
385abae
 
385abae
-	    if (!sym->st_size) {
385abae
+	    if (!sym->st_size || q!=(short)q) {
385abae
 	      sym->st_size=++*gs;
385abae
 	      massert(!make_got_room_for_stub(sec1,sece,sym,st1,gs));
385abae
 	    }
385abae
 
385abae
-	  } else {
385abae
+	    q=sym->st_size;
385abae
+
385abae
+	  } else
385abae
+
385abae
+	    q=++*gs;
385abae
+
385abae
+	  massert(!(r->r_addend>>32));
385abae
+	  r->r_addend|=(q<<32);
385abae
 
385abae
-	    for (rr=vv=v-sec->sh_entsize;
385abae
-		 vv>=v1 && (ELF_R_TYPE(rr->r_info)!=ELF_R_TYPE(r->r_info) ||
385abae
-			    ELF_R_SYM(rr->r_info)!=ELF_R_SYM(r->r_info) ||
385abae
-			    rr->r_addend!=r->r_addend);
385abae
-		 vv-=sec->sh_entsize,rr=vv);
385abae
-
385abae
-	    q=vv<v1 ? ++*gs : rr->r_addend>>32;
385abae
-	    massert(!(r->r_addend>>32));
385abae
-	    r->r_addend|=(q<<32);
385abae
+	  q=(q-gotp)*sizeof(*gs);
385abae
+	  massert(q==(short)q);
385abae
 
385abae
+	  break;
385abae
+
385abae
+	case R_ALPHA_GPDISP:
385abae
+
385abae
+	  for (sym=fsym;sym<syme && (sym->st_shndx!=1 || sym->st_value!=r->r_offset);sym++);
385abae
+
385abae
+	  if (sym
385abae
+	    fsym=sym;
385abae
+	    gotp=*gs+1;
385abae
 	  }
385abae
 
385abae
+	  r->r_addend|=(gotp<<32);
385abae
+
385abae
+	  break;
385abae
+
385abae
 	}
385abae
 
385abae
   return 0;