From ba7a99e9247760ec45b3b898a5a059fefdb2108c 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-74) unstable; urgency=medium * Version_2_6_13pre63 Gbp-Pq: Name Version_2_6_13pre64 --- h/elf64_alpha_reloc.h | 31 +++++++++----------- h/elf64_alpha_reloc_special.h | 54 +++++++++++++++++++++++------------ 2 files changed, 48 insertions(+), 37 deletions(-) diff --git a/h/elf64_alpha_reloc.h b/h/elf64_alpha_reloc.h index d147b59..5d1dec4 100644 --- a/h/elf64_alpha_reloc.h +++ b/h/elf64_alpha_reloc.h @@ -1,16 +1,14 @@ case R_ALPHA_GPDISP: - s=(ul)got; - s-=p; - s+=(s&0x8000)<<1; - store_val(where,MASK(16),s>>16); - where=(void *)where+a; - store_val(where,MASK(16),s); + gotoff=(ul)(got+(a>>32)); + s=gotoff-p; + store_val(where,MASK(16),(s-(short)s)>>16); + store_val((void *)where+(a&MASK(32)),MASK(16),s); break; case R_ALPHA_SREL32: store_val(where,MASK(32),s+a-p); break; case R_ALPHA_GPREL32: - store_val(where,MASK(32),s+a-(ul)got); + store_val(where,MASK(32),s+a-gotoff); break; case R_ALPHA_LITUSE: case R_ALPHA_HINT: @@ -22,23 +20,20 @@ store_val(where,MASK(32),s+a); break; case R_ALPHA_LITERAL: - massert(a || sym->st_size); - gote=got+(a ? (a>>32) : sym->st_size)-1; + s+=a&MASK(32); + a=(a>>32)-1; if (s>=ggot1 && s>16); + s+=a-gotoff; + store_val(where,MASK(16),(s-(short)s)>>16); break; case R_ALPHA_GPRELLOW: - store_val(where,MASK(16),s+a-(ul)got); + store_val(where,MASK(16),s+a-gotoff); break; case R_ALPHA_TLS_GD_HI: store_vals(where,MASK(21),((long)(s+a-(p+4)))>>2); diff --git a/h/elf64_alpha_reloc_special.h b/h/elf64_alpha_reloc_special.h index 0472f9a..1e43a7e 100644 --- a/h/elf64_alpha_reloc_special.h +++ b/h/elf64_alpha_reloc_special.h @@ -1,4 +1,4 @@ -static ul ggot1,ggote; +static ul ggot1,ggote,gotoff; static int write_stub(ul s,ul *got,ul *gote) { @@ -61,44 +61,60 @@ find_special_params(void *v,Shdr *sec1,Shdr *sece,const char *sn, static int label_got_symbols(void *v1,Shdr *sec1,Shdr *sece,Sym *sym1,Sym *syme,const char *st1,const char *sn,ul *gs) { - Sym *sym; - Rela *r,*rr; + Sym *sym,*fsym=sym1; + Rela *r; Shdr *sec; - void *v,*ve,*vv; - ul q; + void *v,*ve; + ul q,gotp; for (sym=sym1;symst_size=0; - for (*gs=0,sec=sec1;secsh_type==SHT_RELA || sec->sh_type==SHT_REL) + for (*gs=gotp=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_ALPHA_LITERAL) { + switch(ELF_R_TYPE(r->r_info)) { + + case R_ALPHA_LITERAL: - if (sec->sh_type!=SHT_RELA || !r->r_addend) { + if (!r->r_addend) { sym=sym1+ELF_R_SYM(r->r_info); + q=(gotp-sym->st_size)*sizeof(*gs); - if (!sym->st_size) { + if (!sym->st_size || q!=(short)q) { sym->st_size=++*gs; massert(!make_got_room_for_stub(sec1,sece,sym,st1,gs)); } - } else { + q=sym->st_size; + + } else + + q=++*gs; + + massert(!(r->r_addend>>32)); + r->r_addend|=(q<<32); - for (rr=vv=v-sec->sh_entsize; - vv>=v1 && (ELF_R_TYPE(rr->r_info)!=ELF_R_TYPE(r->r_info) || - ELF_R_SYM(rr->r_info)!=ELF_R_SYM(r->r_info) || - rr->r_addend!=r->r_addend); - vv-=sec->sh_entsize,rr=vv); + q=(q-gotp)*sizeof(*gs); + massert(q==(short)q); - q=vvr_addend>>32; - massert(!(r->r_addend>>32)); - r->r_addend|=(q<<32); + break; + case R_ALPHA_GPDISP: + + for (sym=fsym;symst_shndx!=1 || sym->st_value!=r->r_offset);sym++); + + if (symr_addend|=(gotp<<32); + + break; + } return 0; -- 2.30.2