From d6003d5a59c4f6ed3ddfb723a36c651b5a6f6a5e Mon Sep 17 00:00:00 2001 From: Camm Maguire Date: Sun, 13 Nov 2022 12:55:14 +0000 Subject: [PATCH] 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 | 16 ++++++++++++++ h/elf64_ppcle_reloc_special.h | 41 ++++++++++++++++++++++++++++++----- 2 files changed, 51 insertions(+), 6 deletions(-) diff --git a/h/elf64_ppcle_reloc.h b/h/elf64_ppcle_reloc.h index 68df37f..965f196 100644 --- a/h/elf64_ppcle_reloc.h +++ b/h/elf64_ppcle_reloc.h @@ -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; diff --git a/h/elf64_ppcle_reloc_special.h b/h/elf64_ppcle_reloc_special.h index 889d5d6..26cb672 100644 --- a/h/elf64_ppcle_reloc_special.h +++ b/h/elf64_ppcle_reloc_special.h @@ -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;symst_size=0; + + for (*gs=0,sec=sec1;secsh_type==SHT_RELA) + for (v=v1+sec->sh_offset,ve=v+sec->sh_size,r=v;vsh_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; } -- 2.30.2