<short summary of the patch>
authorCamm Maguire <camm@debian.org>
Sun, 13 Nov 2022 12:55:14 +0000 (12:55 +0000)
committerCamm Maguire <camm@debian.org>
Sun, 13 Nov 2022 12:55:14 +0000 (12:55 +0000)
TODO: Put a short summary on the line above and replace this paragraph
with a longer explanation of this change. Complete the meta-information
with other relevant fields (see below for details). To make it easier, the
information below has been extracted from the changelog. Adjust it or drop
it.

gcl (2.6.12-88) unstable; urgency=medium

  * Source only upload

Gbp-Pq: Name Version_2_6_13pre85

h/elf64_ppcle_reloc.h
h/elf64_ppcle_reloc_special.h

index 68df37f925f36750224aa492d8ed9d46f19d5c6c..965f19667a1ceceee82c0e1f2fefa79c0eb554a9 100644 (file)
@@ -1,9 +1,25 @@
+#define R_PPC64_PLTSEQ  119  /*FIXME not in elf.h*/
+#define R_PPC64_PLTCALL 120
+
 #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_PLT16_HA:
+      gote=got+sym->st_size-1;
+      *gote=s+a;
+      store_val(where,MASK(16),ha((ul)gote-toc->st_value));
+      break;
+    case R_PPC64_PLT16_LO_DS:
+      gote=got+sym->st_size-1;
+      *gote=s+a;
+      store_val(where,MASK(16),lo((ul)gote-toc->st_value));/*>>2*/
+      break;
+    case R_PPC64_PLTSEQ:
+    case R_PPC64_PLTCALL:
+      break;
     case R_PPC64_TOC16_HA: 
       store_val(where,MASK(16),ha(s+a-toc->st_value));
       break;
index 889d5d698f0628dc6ff814f313e2dfccdc3ac971..26cb672f41fff490624647fbf53761fecd75efdd 100644 (file)
@@ -9,16 +9,12 @@ static int tramp[]={0,0,
 };
 
 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;
+load_trampolines(void *v,Shdr *sec,Sym *ds1) {
+
   Rela *r;
   void *ve;
   ul *u,j;
 
-  massert((sec=get_section(".rela.dyn",sec1,sece,sn)));
-
   v+=sec->sh_offset;
   ve=v+sec->sh_size;
 
@@ -41,9 +37,26 @@ find_special_params(void *v,Shdr *sec1,Shdr *sece,const char *sn,
 
 }
 
+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;
+
+  massert((sec=get_section(".rela.dyn",sec1,sece,sn)));
+  massert(!load_trampolines(v,sec,ds1));
+  if ((sec=get_section(".rela.plt",sec1,sece,sn)))
+    massert(!load_trampolines(v,sec,ds1));
+
+  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) {
 
+  Rela *r;
+  void *v,*ve;
   Shdr *sec;
   Sym *sym;
   
@@ -58,6 +71,22 @@ label_got_symbols(void *v1,Shdr *sec1,Shdr *sece,Sym *sym1,Sym *syme,const char
     }
   }
 
+  for (sym=sym1;sym<syme;sym++)
+   sym->st_size=0;
+
+  for (*gs=0,sec=sec1;sec<sece;sec++)
+    if (sec->sh_type==SHT_RELA)
+      for (v=v1+sec->sh_offset,ve=v+sec->sh_size,r=v;v<ve;v+=sec->sh_entsize,r=v)
+       if (ELF_R_TYPE(r->r_info)==R_PPC64_PLT16_HA||
+           ELF_R_TYPE(r->r_info)==R_PPC64_PLT16_LO_DS) {
+
+         sym=sym1+ELF_R_SYM(r->r_info);
+
+         if (!sym->st_size)
+           sym->st_size=++*gs;
+
+       }
+
   return 0;
   
 }