From 211dc24b8744ed14ee5c293e7ac164d02e1fa1fe Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Mon, 16 Apr 2018 15:29:39 +0930 Subject: Remove sh5 and sh64 support include/ * dis-asm.h: Remove sh5 and sh64 support. bfd/ * Makefile.am: Remove sh5 and sh64 support. * archures.c: Likewise. * config.bfd: Likewise. * configure.ac: Likewise. * cpu-sh.c: Likewise. * elf32-sh-relocs.h: Likewise. * elf32-sh.c: Likewise. * targets.c: Likewise. * elf32-sh64-com.c: Delete. * elf32-sh64.c: Delete. * elf32-sh64.h: Delete. * elf64-sh64.c: Delete. * Makefile.in: Regenerate. * bfd-in2.h: Regenerate. * configure: Regenerate. * po/SRC-POTFILES.in: Regenerate. opcodes/ * Makefile.am: Remove sh5 and sh64 support. * configure.ac: Likewise. * disassemble.c: Likewise. * disassemble.h: Likewise. * sh-dis.c: Likewise. * sh64-dis.c: Delete. * sh64-opc.c: Delete. * sh64-opc.h: Delete. * Makefile.in: Regenerate. * configure: Regenerate. * po/POTFILES.in: Regenerate. bintuils/ * testsuite/binutils-all/objcopy.exp: Remove sh5 and sh64 support. gas/ * Makefile.am: Remove sh5 and sh64 support. * config/tc-sh.c: Likewise. * configure.tgt: Likewise. * doc/Makefile.am: Likewise. * doc/as.texinfo: Likewise. * testsuite/gas/cfi/cfi.exp: Likewise. * testsuite/gas/sh/basic.exp: Likewise. * config/tc-sh64.c: Delete. * config/tc-sh64.h: Delete. * doc/c-sh64.texi: Delete. * testsuite/gas/sh/sh64/abi-32.d: Delete. * testsuite/gas/sh/sh64/abi-32.s: Delete. * testsuite/gas/sh/sh64/abi-64.d: Delete. * testsuite/gas/sh/sh64/abi-64.s: Delete. * testsuite/gas/sh/sh64/basic-1.d: Delete. * testsuite/gas/sh/sh64/basic-1.s: Delete. * testsuite/gas/sh/sh64/case-1.d: Delete. * testsuite/gas/sh/sh64/case-1.s: Delete. * testsuite/gas/sh/sh64/case-noexp-1.d: Delete. * testsuite/gas/sh/sh64/crange1-1.d: Delete. * testsuite/gas/sh/sh64/crange1-2.d: Delete. * testsuite/gas/sh/sh64/crange1.s: Delete. * testsuite/gas/sh/sh64/crange2-1.d: Delete. * testsuite/gas/sh/sh64/crange2-2.d: Delete. * testsuite/gas/sh/sh64/crange2-noexp-1.d: Delete. * testsuite/gas/sh/sh64/crange2.s: Delete. * testsuite/gas/sh/sh64/crange3-1.d: Delete. * testsuite/gas/sh/sh64/crange3.s: Delete. * testsuite/gas/sh/sh64/crange4-1.d: Delete. * testsuite/gas/sh/sh64/crange4.s: Delete. * testsuite/gas/sh/sh64/crange5-1.d: Delete. * testsuite/gas/sh/sh64/crange5.s: Delete. * testsuite/gas/sh/sh64/creg-1.d: Delete. * testsuite/gas/sh/sh64/creg-1.s: Delete. * testsuite/gas/sh/sh64/creg-2.d: Delete. * testsuite/gas/sh/sh64/creg-2.s: Delete. * testsuite/gas/sh/sh64/datal-1.s: Delete. * testsuite/gas/sh/sh64/datal-2.d: Delete. * testsuite/gas/sh/sh64/datal-2.s: Delete. * testsuite/gas/sh/sh64/datal-3.s: Delete. * testsuite/gas/sh/sh64/datal32-1.d: Delete. * testsuite/gas/sh/sh64/datal32-3.d: Delete. * testsuite/gas/sh/sh64/datal64-1.d: Delete. * testsuite/gas/sh/sh64/datal64-3.d: Delete. * testsuite/gas/sh/sh64/eh-1.d: Delete. * testsuite/gas/sh/sh64/eh-1.s: Delete. * testsuite/gas/sh/sh64/endian-1.d: Delete. * testsuite/gas/sh/sh64/endian-1.s: Delete. * testsuite/gas/sh/sh64/endian-2.d: Delete. * testsuite/gas/sh/sh64/endian-2.s: Delete. * testsuite/gas/sh/sh64/err-1.s: Delete. * testsuite/gas/sh/sh64/err-2.s: Delete. * testsuite/gas/sh/sh64/err-3.s: Delete. * testsuite/gas/sh/sh64/err-4.s: Delete. * testsuite/gas/sh/sh64/err-abi-32.s: Delete. * testsuite/gas/sh/sh64/err-abi-64.s: Delete. * testsuite/gas/sh/sh64/err-dsp.s: Delete. * testsuite/gas/sh/sh64/err-movi-noexp-1.s: Delete. * testsuite/gas/sh/sh64/err-noexp-cmd1.s: Delete. * testsuite/gas/sh/sh64/err-pt-1.s: Delete. * testsuite/gas/sh/sh64/err-pt32-cmd1.s: Delete. * testsuite/gas/sh/sh64/err-pt32-cmd2.s: Delete. * testsuite/gas/sh/sh64/err-pt32-cmd3.s: Delete. * testsuite/gas/sh/sh64/err-ptb-1.s: Delete. * testsuite/gas/sh/sh64/err-ptb-2.s: Delete. * testsuite/gas/sh/sh64/err.exp: Delete. * testsuite/gas/sh/sh64/immexpr1.s: Delete. * testsuite/gas/sh/sh64/immexpr2.s: Delete. * testsuite/gas/sh/sh64/immexpr32-1.d: Delete. * testsuite/gas/sh/sh64/immexpr32-2.d: Delete. * testsuite/gas/sh/sh64/immexpr64-1.d: Delete. * testsuite/gas/sh/sh64/immexpr64-2.d: Delete. * testsuite/gas/sh/sh64/lineno.d: Delete. * testsuite/gas/sh/sh64/lineno.s: Delete. * testsuite/gas/sh/sh64/localcom-1.d: Delete. * testsuite/gas/sh/sh64/localcom-1.s: Delete. * testsuite/gas/sh/sh64/mix-1.d: Delete. * testsuite/gas/sh/sh64/mix-1.s: Delete. * testsuite/gas/sh/sh64/mix-noexp-1.d: Delete. * testsuite/gas/sh/sh64/movi-1.s: Delete. * testsuite/gas/sh/sh64/movi-2.s: Delete. * testsuite/gas/sh/sh64/movi-3.d: Delete. * testsuite/gas/sh/sh64/movi-3.s: Delete. * testsuite/gas/sh/sh64/movi32-1.d: Delete. * testsuite/gas/sh/sh64/movi32-2.d: Delete. * testsuite/gas/sh/sh64/movi32-noexp-2.d: Delete. * testsuite/gas/sh/sh64/movi64-1.d: Delete. * testsuite/gas/sh/sh64/movi64-2.d: Delete. * testsuite/gas/sh/sh64/movi64-2.s: Delete. * testsuite/gas/sh/sh64/movi64-3.d: Delete. * testsuite/gas/sh/sh64/movi64-noexp-2.d: Delete. * testsuite/gas/sh/sh64/pt-1.d: Delete. * testsuite/gas/sh/sh64/pt-1.s: Delete. * testsuite/gas/sh/sh64/pt-2.s: Delete. * testsuite/gas/sh/sh64/pt-noexp-1.d: Delete. * testsuite/gas/sh/sh64/pt32-1.d: Delete. * testsuite/gas/sh/sh64/pt32-noexp-2.d: Delete. * testsuite/gas/sh/sh64/pt64-1.d: Delete. * testsuite/gas/sh/sh64/pt64-32-1.d: Delete. * testsuite/gas/sh/sh64/pt64-32-2.d: Delete. * testsuite/gas/sh/sh64/pt64-noexp-2.d: Delete. * testsuite/gas/sh/sh64/ptc-1.s: Delete. * testsuite/gas/sh/sh64/ptc32-1.d: Delete. * testsuite/gas/sh/sh64/ptc32-noexp-1.d: Delete. * testsuite/gas/sh/sh64/ptc64-1.d: Delete. * testsuite/gas/sh/sh64/ptc64-32-1.d: Delete. * testsuite/gas/sh/sh64/ptc64-noexp-1.d: Delete. * testsuite/gas/sh/sh64/ptext-1.s: Delete. * testsuite/gas/sh/sh64/ptext32-1.d: Delete. * testsuite/gas/sh/sh64/ptext32-noexp-1.d: Delete. * testsuite/gas/sh/sh64/ptext64-1.d: Delete. * testsuite/gas/sh/sh64/ptext64-32-1.d: Delete. * testsuite/gas/sh/sh64/ptext64-noexp-1.d: Delete. * testsuite/gas/sh/sh64/rel-1.s: Delete. * testsuite/gas/sh/sh64/rel-2.s: Delete. * testsuite/gas/sh/sh64/rel-3.s: Delete. * testsuite/gas/sh/sh64/rel-4.s: Delete. * testsuite/gas/sh/sh64/rel-5.s: Delete. * testsuite/gas/sh/sh64/rel32-1.d: Delete. * testsuite/gas/sh/sh64/rel32-2.d: Delete. * testsuite/gas/sh/sh64/rel32-3.d: Delete. * testsuite/gas/sh/sh64/rel32-4.d: Delete. * testsuite/gas/sh/sh64/rel32-5.d: Delete. * testsuite/gas/sh/sh64/rel64-1.d: Delete. * testsuite/gas/sh/sh64/rel64-2.d: Delete. * testsuite/gas/sh/sh64/rel64-3.d: Delete. * testsuite/gas/sh/sh64/rel64-4.d: Delete. * testsuite/gas/sh/sh64/rel64-5.d: Delete. * testsuite/gas/sh/sh64/relax-1.d: Delete. * testsuite/gas/sh/sh64/relax-1.s: Delete. * testsuite/gas/sh/sh64/relax-2.d: Delete. * testsuite/gas/sh/sh64/relax-2.s: Delete. * testsuite/gas/sh/sh64/relax-3.d: Delete. * testsuite/gas/sh/sh64/relax-3.s: Delete. * testsuite/gas/sh/sh64/sh64.exp: Delete. * testsuite/gas/sh/sh64/shift-1.s: Delete. * testsuite/gas/sh/sh64/shift-2.s: Delete. * testsuite/gas/sh/sh64/shift-3.s: Delete. * testsuite/gas/sh/sh64/shift32-1.d: Delete. * testsuite/gas/sh/sh64/shift32-3.d: Delete. * testsuite/gas/sh/sh64/shift32-noexp-3.d: Delete. * testsuite/gas/sh/sh64/shift64-1.d: Delete. * testsuite/gas/sh/sh64/shift64-2.d: Delete. * testsuite/gas/sh/sh64/shift64-3.d: Delete. * testsuite/gas/sh/sh64/shift64-noexp-3.d: Delete. * testsuite/gas/sh/sh64/syntax-1.d: Delete. * testsuite/gas/sh/sh64/syntax-1.s: Delete. * testsuite/gas/sh/sh64/syntax-2.d: Delete. * testsuite/gas/sh/sh64/syntax-2.s: Delete. * testsuite/gas/sh/sh64/ua-1.s: Delete. * testsuite/gas/sh/sh64/ua32-1.d: Delete. * testsuite/gas/sh/sh64/ua64-1.d: Delete. * Makefile.in: Regenerate. * doc/Makefile.in: Regenerate. * po/POTFILES.in: Regenerate. ld/ * Makefile.am: Remove sh5 and sh64 support. * configure.tgt: Likewise. * ldlang.c: Likewise. * testsuite/ld-elfcomm/elfcomm.exp: Likewise. * testsuite/ld-gc/gc.exp: Likewise. * testsuite/ld-gc/pr13683.d: Likewise. * testsuite/ld-scripts/crossref.exp: Likewise. * testsuite/ld-selective/selective.exp: Likewise. * testsuite/ld-sh/ld-r-1.d: Likewise. * testsuite/ld-sh/rd-sh.exp: Likewise. * testsuite/ld-sh/sh.exp: Likewise. * testsuite/ld-srec/srec.exp: Likewise. * testsuite/ld-undefined/undefined.exp: Likewise. * emulparams/shelf32.sh: Delete. * emulparams/shelf32_linux.sh: Delete. * emulparams/shelf32_nbsd.sh: Delete. * emulparams/shelf64.sh: Delete. * emulparams/shelf64_nbsd.sh: Delete. * emulparams/shlelf32.sh: Delete. * emulparams/shlelf32_linux.sh: Delete. * emulparams/shlelf32_nbsd.sh: Delete. * emulparams/shlelf64.sh: Delete. * emulparams/shlelf64_nbsd.sh: Delete. * emultempl/sh64elf.em: Delete. * testsuite/ld-sh/sh64/abi32.sd: Delete. * testsuite/ld-sh/sh64/abi32.xd: Delete. * testsuite/ld-sh/sh64/abi64.sd: Delete. * testsuite/ld-sh/sh64/abi64.xd: Delete. * testsuite/ld-sh/sh64/abixx-noexp.sd: Delete. * testsuite/ld-sh/sh64/cmpct1.sd: Delete. * testsuite/ld-sh/sh64/cmpct1.xd: Delete. * testsuite/ld-sh/sh64/crange-1.s: Delete. * testsuite/ld-sh/sh64/crange-2a.s: Delete. * testsuite/ld-sh/sh64/crange-2b.s: Delete. * testsuite/ld-sh/sh64/crange-2c.s: Delete. * testsuite/ld-sh/sh64/crange-2d.s: Delete. * testsuite/ld-sh/sh64/crange-2e.s: Delete. * testsuite/ld-sh/sh64/crange-2f.s: Delete. * testsuite/ld-sh/sh64/crange-2g.s: Delete. * testsuite/ld-sh/sh64/crange-2h.s: Delete. * testsuite/ld-sh/sh64/crange-2i.s: Delete. * testsuite/ld-sh/sh64/crange1.rd: Delete. * testsuite/ld-sh/sh64/crange2.rd: Delete. * testsuite/ld-sh/sh64/crange3-cmpct.rd: Delete. * testsuite/ld-sh/sh64/crange3-media.rd: Delete. * testsuite/ld-sh/sh64/crange3.dd: Delete. * testsuite/ld-sh/sh64/crange3.rd: Delete. * testsuite/ld-sh/sh64/crangerel1.rd: Delete. * testsuite/ld-sh/sh64/crangerel2.rd: Delete. * testsuite/ld-sh/sh64/dlsection-1.s: Delete. * testsuite/ld-sh/sh64/dlsection.sd: Delete. * testsuite/ld-sh/sh64/endian.dbd: Delete. * testsuite/ld-sh/sh64/endian.dld: Delete. * testsuite/ld-sh/sh64/endian.ld: Delete. * testsuite/ld-sh/sh64/endian.s: Delete. * testsuite/ld-sh/sh64/endian.sbd: Delete. * testsuite/ld-sh/sh64/endian.sld: Delete. * testsuite/ld-sh/sh64/gotplt.d: Delete. * testsuite/ld-sh/sh64/gotplt.map: Delete. * testsuite/ld-sh/sh64/gotplt.s: Delete. * testsuite/ld-sh/sh64/init-cmpct.d: Delete. * testsuite/ld-sh/sh64/init-media.d: Delete. * testsuite/ld-sh/sh64/init.s: Delete. * testsuite/ld-sh/sh64/init64.d: Delete. * testsuite/ld-sh/sh64/mix1-noexp.sd: Delete. * testsuite/ld-sh/sh64/mix1.sd: Delete. * testsuite/ld-sh/sh64/mix1.xd: Delete. * testsuite/ld-sh/sh64/mix2-noexp.sd: Delete. * testsuite/ld-sh/sh64/mix2.sd: Delete. * testsuite/ld-sh/sh64/mix2.xd: Delete. * testsuite/ld-sh/sh64/rd-sh64.exp: Delete. * testsuite/ld-sh/sh64/rel-1.s: Delete. * testsuite/ld-sh/sh64/rel-2.s: Delete. * testsuite/ld-sh/sh64/rel32.xd: Delete. * testsuite/ld-sh/sh64/rel64.xd: Delete. * testsuite/ld-sh/sh64/relax.exp: Delete. * testsuite/ld-sh/sh64/relax1.s: Delete. * testsuite/ld-sh/sh64/relax2.s: Delete. * testsuite/ld-sh/sh64/relax3.s: Delete. * testsuite/ld-sh/sh64/relax4.s: Delete. * testsuite/ld-sh/sh64/reldl-1.s: Delete. * testsuite/ld-sh/sh64/reldl-2.s: Delete. * testsuite/ld-sh/sh64/reldl32.rd: Delete. * testsuite/ld-sh/sh64/reldl64.rd: Delete. * testsuite/ld-sh/sh64/relfail.exp: Delete. * testsuite/ld-sh/sh64/relfail.s: Delete. * testsuite/ld-sh/sh64/sh64-1.s: Delete. * testsuite/ld-sh/sh64/sh64-2.s: Delete. * testsuite/ld-sh/sh64/sh64.exp: Delete. * testsuite/ld-sh/sh64/shcmp-1.s: Delete. * testsuite/ld-sh/sh64/shdl-1.s: Delete. * testsuite/ld-sh/sh64/shdl-2.s: Delete. * testsuite/ld-sh/sh64/shdl32.xd: Delete. * testsuite/ld-sh/sh64/shdl64.sd: Delete. * testsuite/ld-sh/sh64/shdl64.xd: Delete. * testsuite/ld-sh/sh64/shmix-1.s: Delete. * testsuite/ld-sh/sh64/shmix-2.s: Delete. * testsuite/ld-sh/sh64/shmix-3.s: Delete. * testsuite/ld-sh/sh64/stobin-0-dso.d: Delete. * testsuite/ld-sh/sh64/stobin-1.d: Delete. * testsuite/ld-sh/sh64/stobin.s: Delete. * testsuite/ld-sh/sh64/stolib.s: Delete. * Makefile.in: Regenerate. * po/BLD-POTFILES.in: Regenerate. --- bfd/ChangeLog | 19 + bfd/Makefile.am | 6 - bfd/Makefile.in | 9 - bfd/archures.c | 1 - bfd/bfd-in2.h | 1 - bfd/config.bfd | 78 +- bfd/configure | 12 - bfd/configure.ac | 12 - bfd/cpu-sh.c | 18 +- bfd/elf32-sh-relocs.h | 783 ---------- bfd/elf32-sh.c | 643 +------- bfd/elf32-sh64-com.c | 245 --- bfd/elf32-sh64.c | 814 ---------- bfd/elf32-sh64.h | 88 -- bfd/elf64-sh64.c | 3987 ------------------------------------------------ bfd/po/SRC-POTFILES.in | 3 - bfd/targets.c | 26 - 17 files changed, 35 insertions(+), 6710 deletions(-) delete mode 100644 bfd/elf32-sh64-com.c delete mode 100644 bfd/elf32-sh64.c delete mode 100644 bfd/elf32-sh64.h delete mode 100644 bfd/elf64-sh64.c (limited to 'bfd') diff --git a/bfd/ChangeLog b/bfd/ChangeLog index f6e1e5c..337d1a0 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,24 @@ 2018-04-16 Alan Modra + * Makefile.am: Remove sh5 and sh64 support. + * archures.c: Likewise. + * config.bfd: Likewise. + * configure.ac: Likewise. + * cpu-sh.c: Likewise. + * elf32-sh-relocs.h: Likewise. + * elf32-sh.c: Likewise. + * targets.c: Likewise. + * elf32-sh64-com.c: Delete. + * elf32-sh64.c: Delete. + * elf32-sh64.h: Delete. + * elf64-sh64.c: Delete. + * Makefile.in: Regenerate. + * bfd-in2.h: Regenerate. + * configure: Regenerate. + * po/SRC-POTFILES.in: Regenerate. + +2018-04-16 Alan Modra + * Makefile.am: Remove sh-symbianelf support. * config.bfd: Likewise. * configure.ac: Likewise. diff --git a/bfd/Makefile.am b/bfd/Makefile.am index e250c41..ff748d4 100644 --- a/bfd/Makefile.am +++ b/bfd/Makefile.am @@ -349,8 +349,6 @@ BFD32_BACKENDS = \ elf32-rx.lo \ elf32-s390.lo \ elf32-sh.lo \ - elf32-sh64-com.lo \ - elf32-sh64.lo \ elf32-sparc.lo \ elf32-spu.lo \ elf32-tic6x.lo \ @@ -522,8 +520,6 @@ BFD32_BACKENDS_CFILES = \ elf32-rx.c \ elf32-s390.c \ elf32-sh.c \ - elf32-sh64-com.c \ - elf32-sh64.c \ elf32-sparc.c \ elf32-spu.c \ elf32-tic6x.c \ @@ -635,7 +631,6 @@ BFD64_BACKENDS = \ elf64-riscv.lo \ elfxx-riscv.lo \ elf64-s390.lo \ - elf64-sh64.lo \ elf64-sparc.lo \ elf64-tilegx.lo \ elf64-x86-64.lo \ @@ -669,7 +664,6 @@ BFD64_BACKENDS_CFILES = \ elf64-mmix.c \ elf64-ppc.c \ elf64-s390.c \ - elf64-sh64.c \ elf64-sparc.c \ elf64-tilegx.c \ elf64-x86-64.c \ diff --git a/bfd/Makefile.in b/bfd/Makefile.in index 0149d24..600afdd 100644 --- a/bfd/Makefile.in +++ b/bfd/Makefile.in @@ -683,8 +683,6 @@ BFD32_BACKENDS = \ elf32-rx.lo \ elf32-s390.lo \ elf32-sh.lo \ - elf32-sh64-com.lo \ - elf32-sh64.lo \ elf32-sparc.lo \ elf32-spu.lo \ elf32-tic6x.lo \ @@ -856,8 +854,6 @@ BFD32_BACKENDS_CFILES = \ elf32-rx.c \ elf32-s390.c \ elf32-sh.c \ - elf32-sh64-com.c \ - elf32-sh64.c \ elf32-sparc.c \ elf32-spu.c \ elf32-tic6x.c \ @@ -970,7 +966,6 @@ BFD64_BACKENDS = \ elf64-riscv.lo \ elfxx-riscv.lo \ elf64-s390.lo \ - elf64-sh64.lo \ elf64-sparc.lo \ elf64-tilegx.lo \ elf64-x86-64.lo \ @@ -1004,7 +999,6 @@ BFD64_BACKENDS_CFILES = \ elf64-mmix.c \ elf64-ppc.c \ elf64-s390.c \ - elf64-sh64.c \ elf64-sparc.c \ elf64-tilegx.c \ elf64-x86-64.c \ @@ -1451,8 +1445,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-score.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-score7.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-sh.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-sh64-com.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-sh64.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-sparc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-spu.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-tic6x.Plo@am__quote@ @@ -1478,7 +1470,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-ppc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-riscv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-s390.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-sh64.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-sparc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-tilegx.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-x86-64.Plo@am__quote@ diff --git a/bfd/archures.c b/bfd/archures.c index 5adfc2f..2536949 100644 --- a/bfd/archures.c +++ b/bfd/archures.c @@ -305,7 +305,6 @@ DESCRIPTION .#define bfd_mach_sh4a 0x4a .#define bfd_mach_sh4a_nofpu 0x4b .#define bfd_mach_sh4al_dsp 0x4d -.#define bfd_mach_sh5 0x50 . bfd_arch_alpha, {* Dec Alpha. *} .#define bfd_mach_alpha_ev4 0x10 .#define bfd_mach_alpha_ev5 0x20 diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index bbbdf01..55fcd85 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -2180,7 +2180,6 @@ enum bfd_architecture #define bfd_mach_sh4a 0x4a #define bfd_mach_sh4a_nofpu 0x4b #define bfd_mach_sh4al_dsp 0x4d -#define bfd_mach_sh5 0x50 bfd_arch_alpha, /* Dec Alpha. */ #define bfd_mach_alpha_ev4 0x10 #define bfd_mach_alpha_ev5 0x20 diff --git a/bfd/config.bfd b/bfd/config.bfd index 2860d7a..f9c9f33 100644 --- a/bfd/config.bfd +++ b/bfd/config.bfd @@ -102,7 +102,6 @@ case $targ in sparc-*-openbsd[0-2].* | sparc-*-openbsd3.[0-1] | \ sparc64-*-aout* | \ sparc*-*-coff* | \ - sh5*-*-* | sh64*-*-* | \ null) if test "x$enable_obsolete" != xyes; then echo "*** Configuration $targ is obsolete." >&2 @@ -137,7 +136,7 @@ case $targ in m88*-*-* | \ maxq-*-coff | \ mips*el-*-rtems* | \ - sh*-*-symbianelf* | \ + sh*-*-symbianelf* | sh5*-*-* | sh64*-*-* | \ sparc-*-lynxos* | \ tahoe-*-* | \ vax-*-bsd* | vax-*-ultrix* | vax-*-vms* | \ @@ -1409,35 +1408,6 @@ case "${targ}" in targ_defvec=score_elf32_be_vec targ_selvecs=score_elf32_le_vec ;; - - sh64l*-*-elf*) - targ_defvec=sh64_elf32_le_vec - targ_selvecs="sh64_elf32_vec sh64_elf64_le_vec sh64_elf64_vec sh_elf32_le_vec sh_elf32_vec" - targ_underscore=yes - want64=true - ;; - sh64-*-elf*) - targ_defvec=sh64_elf32_vec - targ_selvecs="sh64_elf32_le_vec sh64_elf64_vec sh64_elf64_le_vec sh_elf32_vec sh_elf32_le_vec" - targ_underscore=yes - want64=true - ;; - sh64eb-*-linux*) - targ_defvec=sh64_elf32_linux_be_vec - targ_selvecs="sh64_elf32_linux_vec sh64_elf64_linux_be_vec sh64_elf64_linux_vec sh_elf32_linux_be_vec sh_elf32_linux_vec" - want64=true - ;; - sh64-*-linux*) - targ_defvec=sh64_elf32_linux_vec - targ_selvecs="sh64_elf32_linux_be_vec sh64_elf64_linux_vec sh64_elf64_linux_be_vec sh_elf32_linux_vec sh_elf32_linux_be_vec" - want64=true - ;; - sh-*-linux*) - targ_defvec=sh_elf32_linux_be_vec - targ_selvecs="sh_elf32_linux_vec sh64_elf32_linux_vec sh64_elf32_linux_be_vec sh64_elf64_linux_vec sh64_elf64_linux_be_vec" - targ_selvecs="${targ_selvecs} sh_elf32_fdpic_le_vec sh_elf32_fdpic_be_vec" - want64=true - ;; #endif /* BFD64 */ sh*eb-*-linux*) @@ -1454,68 +1424,28 @@ case "${targ}" in sh-*-uclinux* | sh[12]-*-uclinux*) targ_defvec=sh_elf32_vec targ_selvecs="sh_elf32_le_vec sh_elf32_linux_be_vec sh_elf32_linux_vec sh_elf32_fdpic_le_vec sh_elf32_fdpic_be_vec" -#ifdef BFD64 - targ_selvecs="${targ_selvecs} sh64_elf32_linux_vec sh64_elf32_linux_be_vec sh64_elf64_linux_vec sh64_elf64_linux_be_vec" -#endif - ;; - -#ifdef BFD64 - sh5le-*-netbsd*) - targ_defvec=sh64_elf32_nbsd_le_vec - targ_selvecs="sh64_elf32_nbsd_vec sh64_elf64_nbsd_le_vec sh64_elf64_nbsd_vec sh_elf32_nbsd_vec sh_elf32_nbsd_le_vec" - want64=true - ;; - sh5-*-netbsd*) - targ_defvec=sh64_elf32_nbsd_vec - targ_selvecs="sh64_elf32_nbsd_le_vec sh64_elf64_nbsd_le_vec sh64_elf64_nbsd_vec sh_elf32_nbsd_vec sh_elf32_nbsd_le_vec" - want64=true - ;; - - sh64le-*-netbsd*) - targ_defvec=sh64_elf64_nbsd_le_vec - targ_selvecs="sh64_elf64_nbsd_vec sh64_elf32_nbsd_le_vec sh64_elf32_nbsd_vec sh_elf32_nbsd_vec sh_elf32_nbsd_le_vec" - want64=true - ;; - sh64-*-netbsd*) - targ_defvec=sh64_elf64_nbsd_vec - targ_selvecs="sh64_elf64_nbsd_le_vec sh64_elf32_nbsd_le_vec sh64_elf32_nbsd_vec sh_elf32_nbsd_vec sh_elf32_nbsd_le_vec" - want64=true ;; sh*l*-*-netbsdelf*) targ_defvec=sh_elf32_nbsd_le_vec - targ_selvecs="sh_elf32_nbsd_vec sh_coff_vec sh_coff_le_vec sh64_elf32_nbsd_le_vec sh64_elf32_nbsd_vec sh64_elf64_nbsd_le_vec sh64_elf64_nbsd_vec" - want64=true - ;; - sh-*-netbsdelf*) - targ_defvec=sh_elf32_nbsd_vec - targ_selvecs="sh_elf32_nbsd_le_vec sh_coff_vec sh_coff_le_vec sh64_elf32_nbsd_le_vec sh64_elf32_nbsd_vec sh64_elf64_nbsd_le_vec sh64_elf64_nbsd_vec" - want64=true + targ_selvecs="sh_elf32_nbsd_vec sh_coff_vec sh_coff_le_vec" ;; -#endif - sh*-*-netbsdelf*) targ_defvec=sh_elf32_nbsd_vec targ_selvecs="sh_elf32_nbsd_le_vec sh_coff_vec sh_coff_le_vec" ;; -#ifdef BFD64 shl*-*-elf* | sh[1234]l*-*-elf* | sh3el*-*-elf* | shl*-*-kaos*) targ_defvec=sh_elf32_le_vec - targ_selvecs="sh_elf32_vec sh_coff_le_vec sh_coff_vec sh_coff_small_le_vec sh_coff_small_vec sh64_elf32_vec sh64_elf32_le_vec sh64_elf64_vec sh64_elf64_le_vec" + targ_selvecs="sh_elf32_vec sh_coff_le_vec sh_coff_vec sh_coff_small_le_vec sh_coff_small_vec" targ_underscore=yes - want64=true ;; -#endif -#ifdef BFD64 sh-*-elf* | sh[1234]*-elf* | sh-*-rtems* | sh-*-kaos*) targ_defvec=sh_elf32_vec - targ_selvecs="sh_elf32_le_vec sh_coff_vec sh_coff_le_vec sh_coff_small_vec sh_coff_small_le_vec sh64_elf32_vec sh64_elf32_le_vec sh64_elf64_vec sh64_elf64_le_vec" + targ_selvecs="sh_elf32_le_vec sh_coff_vec sh_coff_le_vec sh_coff_small_vec sh_coff_small_le_vec" targ_underscore=yes - want64=true ;; -#endif sh-*-nto*) targ_defvec=sh_elf32_vec diff --git a/bfd/configure b/bfd/configure index d757d72..079ab66 100755 --- a/bfd/configure +++ b/bfd/configure @@ -14547,18 +14547,6 @@ do s390_elf64_vec) tb="$tb elf64-s390.lo elf64.lo $elf"; target_size=64 ;; score_elf32_be_vec) tb="$tb elf32-score.lo elf32-score7.lo elf32.lo $elf"; want64=true; target_size=64 ;; score_elf32_le_vec) tb="$tb elf32-score.lo elf32-score7.lo elf32.lo $elf"; want64=true; target_size=64 ;; - sh64_elf32_vec) tb="$tb elf32-sh64.lo elf32-sh64-com.lo elf-vxworks.lo elf32.lo $elf" target_size=64 ;; - sh64_elf32_le_vec) tb="$tb elf32-sh64.lo elf32-sh64-com.lo elf-vxworks.lo elf32.lo $elf" target_size=64 ;; - sh64_elf32_linux_vec) tb="$tb elf32-sh64.lo elf32-sh64-com.lo elf-vxworks.lo elf32.lo $elf" target_size=64 ;; - sh64_elf32_linux_be_vec) tb="$tb elf32-sh64.lo elf32-sh64-com.lo elf-vxworks.lo elf32.lo $elf" target_size=64 ;; - sh64_elf32_nbsd_vec) tb="$tb elf32-sh64.lo elf32-sh64-com.lo elf-vxworks.lo elf32.lo $elf" ;; - sh64_elf32_nbsd_le_vec) tb="$tb elf32-sh64.lo elf32-sh64-com.lo elf-vxworks.lo elf32.lo $elf" ;; - sh64_elf64_vec) tb="$tb elf64-sh64.lo elf64.lo $elf" target_size=64 ;; - sh64_elf64_le_vec) tb="$tb elf64-sh64.lo elf64.lo $elf" target_size=64 ;; - sh64_elf64_linux_vec) tb="$tb elf64-sh64.lo elf64.lo $elf" target_size=64 ;; - sh64_elf64_linux_be_vec) tb="$tb elf64-sh64.lo elf64.lo $elf" target_size=64 ;; - sh64_elf64_nbsd_vec) tb="$tb elf64-sh64.lo elf64.lo $elf" target_size=64 ;; - sh64_elf64_nbsd_le_vec) tb="$tb elf64-sh64.lo elf64.lo $elf" target_size=64 ;; sh_coff_vec) tb="$tb coff-sh.lo $coff" ;; sh_coff_le_vec) tb="$tb coff-sh.lo $coff" ;; sh_coff_small_vec) tb="$tb coff-sh.lo $coff" ;; diff --git a/bfd/configure.ac b/bfd/configure.ac index 9a29386..7eba3c6 100644 --- a/bfd/configure.ac +++ b/bfd/configure.ac @@ -624,18 +624,6 @@ do s390_elf64_vec) tb="$tb elf64-s390.lo elf64.lo $elf"; target_size=64 ;; score_elf32_be_vec) tb="$tb elf32-score.lo elf32-score7.lo elf32.lo $elf"; want64=true; target_size=64 ;; score_elf32_le_vec) tb="$tb elf32-score.lo elf32-score7.lo elf32.lo $elf"; want64=true; target_size=64 ;; - sh64_elf32_vec) tb="$tb elf32-sh64.lo elf32-sh64-com.lo elf-vxworks.lo elf32.lo $elf" target_size=64 ;; - sh64_elf32_le_vec) tb="$tb elf32-sh64.lo elf32-sh64-com.lo elf-vxworks.lo elf32.lo $elf" target_size=64 ;; - sh64_elf32_linux_vec) tb="$tb elf32-sh64.lo elf32-sh64-com.lo elf-vxworks.lo elf32.lo $elf" target_size=64 ;; - sh64_elf32_linux_be_vec) tb="$tb elf32-sh64.lo elf32-sh64-com.lo elf-vxworks.lo elf32.lo $elf" target_size=64 ;; - sh64_elf32_nbsd_vec) tb="$tb elf32-sh64.lo elf32-sh64-com.lo elf-vxworks.lo elf32.lo $elf" ;; - sh64_elf32_nbsd_le_vec) tb="$tb elf32-sh64.lo elf32-sh64-com.lo elf-vxworks.lo elf32.lo $elf" ;; - sh64_elf64_vec) tb="$tb elf64-sh64.lo elf64.lo $elf" target_size=64 ;; - sh64_elf64_le_vec) tb="$tb elf64-sh64.lo elf64.lo $elf" target_size=64 ;; - sh64_elf64_linux_vec) tb="$tb elf64-sh64.lo elf64.lo $elf" target_size=64 ;; - sh64_elf64_linux_be_vec) tb="$tb elf64-sh64.lo elf64.lo $elf" target_size=64 ;; - sh64_elf64_nbsd_vec) tb="$tb elf64-sh64.lo elf64.lo $elf" target_size=64 ;; - sh64_elf64_nbsd_le_vec) tb="$tb elf64-sh64.lo elf64.lo $elf" target_size=64 ;; sh_coff_vec) tb="$tb coff-sh.lo $coff" ;; sh_coff_le_vec) tb="$tb coff-sh.lo $coff" ;; sh_coff_small_vec) tb="$tb coff-sh.lo $coff" ;; diff --git a/bfd/cpu-sh.c b/bfd/cpu-sh.c index 0ab0c75..f6c493f 100644 --- a/bfd/cpu-sh.c +++ b/bfd/cpu-sh.c @@ -43,8 +43,7 @@ #define SH2A_NOFPU_OR_SH4_NOMMU_NOFPU_NEXT arch_info_struct + 16 #define SH2A_NOFPU_OR_SH3_NOMMU_NEXT arch_info_struct + 17 #define SH2A_OR_SH4_NEXT arch_info_struct + 18 -#define SH2A_OR_SH3E_NEXT arch_info_struct + 19 -#define SH64_NEXT NULL +#define SH2A_OR_SH3E_NEXT NULL static const bfd_arch_info_type arch_info_struct[] = { @@ -333,21 +332,6 @@ static const bfd_arch_info_type arch_info_struct[] = bfd_arch_default_fill, SH2A_OR_SH3E_NEXT }, - { - 64, /* 64 bits in a word. */ - 64, /* 64 bits in an address. */ - 8, /* 8 bits in a byte. */ - bfd_arch_sh, - bfd_mach_sh5, - "sh", /* Architecture name. */ - "sh5", /* Machine name. */ - 1, - FALSE, /* Not the default. */ - bfd_default_compatible, - bfd_default_scan, - bfd_arch_default_fill, - SH64_NEXT - }, }; const bfd_arch_info_type bfd_sh_arch = diff --git a/bfd/elf32-sh-relocs.h b/bfd/elf32-sh-relocs.h index 8f3ac80..8dcd1fb 100644 --- a/bfd/elf32-sh-relocs.h +++ b/bfd/elf32-sh-relocs.h @@ -575,113 +575,6 @@ 0x0f, /* dst_mask */ FALSE), /* pcrel_offset */ -#ifdef INCLUDE_SHMEDIA - /* Used in SHLLI.L and SHLRI.L. */ - HOWTO (R_SH_DIR5U, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 5, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_unsigned, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_DIR5U", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0xfc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in SHARI, SHLLI et al. */ - HOWTO (R_SH_DIR6U, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 6, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_unsigned, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_DIR6U", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0xfc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in BxxI, LDHI.L et al. */ - HOWTO (R_SH_DIR6S, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 6, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_DIR6S", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0xfc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in ADDI, ANDI et al. */ - HOWTO (R_SH_DIR10S, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 10, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_DIR10S", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0xffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in LD.UW, ST.W et al. */ - HOWTO (R_SH_DIR10SW, /* type */ - 1, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 11, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_DIR10SW", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0xffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in LD.L, FLD.S et al. */ - HOWTO (R_SH_DIR10SL, /* type */ - 2, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 12, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_DIR10SL", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0xffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in FLD.D, FST.P et al. */ - HOWTO (R_SH_DIR10SQ, /* type */ - 3, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 13, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_DIR10SQ", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0xffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - -#else EMPTY_HOWTO (45), EMPTY_HOWTO (46), EMPTY_HOWTO (47), @@ -689,7 +582,6 @@ EMPTY_HOWTO (49), EMPTY_HOWTO (50), EMPTY_HOWTO (51), -#endif EMPTY_HOWTO (52), @@ -1046,423 +938,6 @@ 0xffffffff, /* dst_mask */ FALSE), /* pcrel_offset */ -#ifdef INCLUDE_SHMEDIA - /* Used in MOVI and SHORI (x & 65536). */ - HOWTO (R_SH_GOT_LOW16, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOT_LOW16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 16) & 65536). */ - HOWTO (R_SH_GOT_MEDLOW16, /* type */ - 16, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOT_MEDLOW16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 32) & 65536). */ - HOWTO (R_SH_GOT_MEDHI16, /* type */ - 32, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOT_MEDHI16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 48) & 65536). */ - HOWTO (R_SH_GOT_HI16, /* type */ - 48, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOT_HI16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in MOVI and SHORI (x & 65536). */ - HOWTO (R_SH_GOTPLT_LOW16, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOTPLT_LOW16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 16) & 65536). */ - HOWTO (R_SH_GOTPLT_MEDLOW16, /* type */ - 16, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOTPLT_MEDLOW16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 32) & 65536). */ - HOWTO (R_SH_GOTPLT_MEDHI16, /* type */ - 32, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOTPLT_MEDHI16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 48) & 65536). */ - HOWTO (R_SH_GOTPLT_HI16, /* type */ - 48, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOTPLT_HI16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in MOVI and SHORI (x & 65536). */ - HOWTO (R_SH_PLT_LOW16, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - TRUE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_PLT_LOW16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - TRUE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 16) & 65536). */ - HOWTO (R_SH_PLT_MEDLOW16, /* type */ - 16, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - TRUE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_PLT_MEDLOW16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - TRUE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 32) & 65536). */ - HOWTO (R_SH_PLT_MEDHI16, /* type */ - 32, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - TRUE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_PLT_MEDHI16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - TRUE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 48) & 65536). */ - HOWTO (R_SH_PLT_HI16, /* type */ - 48, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - TRUE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_PLT_HI16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - TRUE), /* pcrel_offset */ - - /* Used in MOVI and SHORI (x & 65536). */ - HOWTO (R_SH_GOTOFF_LOW16, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOTOFF_LOW16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 16) & 65536). */ - HOWTO (R_SH_GOTOFF_MEDLOW16, /* type */ - 16, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOTOFF_MEDLOW16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 32) & 65536). */ - HOWTO (R_SH_GOTOFF_MEDHI16, /* type */ - 32, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOTOFF_MEDHI16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 48) & 65536). */ - HOWTO (R_SH_GOTOFF_HI16, /* type */ - 48, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOTOFF_HI16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in MOVI and SHORI (x & 65536). */ - HOWTO (R_SH_GOTPC_LOW16, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - TRUE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOTPC_LOW16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - TRUE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 16) & 65536). */ - HOWTO (R_SH_GOTPC_MEDLOW16, /* type */ - 16, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - TRUE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOTPC_MEDLOW16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - TRUE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 32) & 65536). */ - HOWTO (R_SH_GOTPC_MEDHI16, /* type */ - 32, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - TRUE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOTPC_MEDHI16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - TRUE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 48) & 65536). */ - HOWTO (R_SH_GOTPC_HI16, /* type */ - 48, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - TRUE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOTPC_HI16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - TRUE), /* pcrel_offset */ - - /* Used in LD.L, FLD.S et al. */ - HOWTO (R_SH_GOT10BY4, /* type */ - 2, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 12, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOT10BY4", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0xffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in LD.L, FLD.S et al. */ - HOWTO (R_SH_GOTPLT10BY4, /* type */ - 2, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 12, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOTPLT10BY4", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0xffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in FLD.D, FST.P et al. */ - HOWTO (R_SH_GOT10BY8, /* type */ - 3, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 13, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOT10BY8", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0xffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in FLD.D, FST.P et al. */ - HOWTO (R_SH_GOTPLT10BY8, /* type */ - 3, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 13, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOTPLT10BY8", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0xffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - HOWTO (R_SH_COPY64, /* type */ - 0, /* rightshift */ - 4, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_COPY64", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - ((bfd_vma) 0) - 1, /* dst_mask */ - FALSE), /* pcrel_offset */ - - HOWTO (R_SH_GLOB_DAT64, /* type */ - 0, /* rightshift */ - 4, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GLOB_DAT64", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - ((bfd_vma) 0) - 1, /* dst_mask */ - FALSE), /* pcrel_offset */ - - HOWTO (R_SH_JMP_SLOT64, /* type */ - 0, /* rightshift */ - 4, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_JMP_SLOT64", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - ((bfd_vma) 0) - 1, /* dst_mask */ - FALSE), /* pcrel_offset */ - - HOWTO (R_SH_RELATIVE64, /* type */ - 0, /* rightshift */ - 4, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_RELATIVE64", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - ((bfd_vma) 0) - 1, /* dst_mask */ - FALSE), /* pcrel_offset */ -#else EMPTY_HOWTO (169), EMPTY_HOWTO (170), EMPTY_HOWTO (171), @@ -1491,8 +966,6 @@ EMPTY_HOWTO (194), EMPTY_HOWTO (195), EMPTY_HOWTO (196), -#endif - EMPTY_HOWTO (197), EMPTY_HOWTO (198), EMPTY_HOWTO (199), @@ -1619,262 +1092,6 @@ 0xffffffff, /* dst_mask */ FALSE), /* pcrel_offset */ -#ifdef INCLUDE_SHMEDIA - EMPTY_HOWTO (209), - EMPTY_HOWTO (210), - EMPTY_HOWTO (211), - EMPTY_HOWTO (212), - EMPTY_HOWTO (213), - EMPTY_HOWTO (214), - EMPTY_HOWTO (215), - EMPTY_HOWTO (216), - EMPTY_HOWTO (217), - EMPTY_HOWTO (218), - EMPTY_HOWTO (219), - EMPTY_HOWTO (220), - EMPTY_HOWTO (221), - EMPTY_HOWTO (222), - EMPTY_HOWTO (223), - EMPTY_HOWTO (224), - EMPTY_HOWTO (225), - EMPTY_HOWTO (226), - EMPTY_HOWTO (227), - EMPTY_HOWTO (228), - EMPTY_HOWTO (229), - EMPTY_HOWTO (230), - EMPTY_HOWTO (231), - EMPTY_HOWTO (232), - EMPTY_HOWTO (233), - EMPTY_HOWTO (234), - EMPTY_HOWTO (235), - EMPTY_HOWTO (236), - EMPTY_HOWTO (237), - EMPTY_HOWTO (238), - EMPTY_HOWTO (239), - EMPTY_HOWTO (240), - EMPTY_HOWTO (241), - - /* Relocations for SHmedia code. None of these are partial_inplace or - use the field being relocated (except R_SH_PT_16). */ - - /* The assembler will generate this reloc before a block of SHmedia - instructions. A section should be processed as assuming it contains - data, unless this reloc is seen. Note that a block of SHcompact - instructions are instead preceded by R_SH_CODE. - This is currently not implemented, but should be used for SHmedia - linker relaxation. */ - HOWTO (R_SH_SHMEDIA_CODE, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 0, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_unsigned, /* complain_on_overflow */ - sh_elf_ignore_reloc, /* special_function */ - "R_SH_SHMEDIA_CODE", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* The assembler will generate this reloc at a PTA or PTB instruction, - and the linker checks the right type of target, or changes a PTA to a - PTB, if the original insn was PT. */ - HOWTO (R_SH_PT_16, /* type */ - 2, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 18, /* bitsize */ - TRUE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_PT_16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - TRUE), /* pcrel_offset */ - - /* Used in unexpanded MOVI. */ - HOWTO (R_SH_IMMS16, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_IMMS16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in SHORI. */ - HOWTO (R_SH_IMMU16, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_unsigned, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_IMMU16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in MOVI and SHORI (x & 65536). */ - HOWTO (R_SH_IMM_LOW16, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_IMM_LOW16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x - $) & 65536). */ - HOWTO (R_SH_IMM_LOW16_PCREL, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - TRUE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_IMM_LOW16_PCREL", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - TRUE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 16) & 65536). */ - HOWTO (R_SH_IMM_MEDLOW16, /* type */ - 16, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_IMM_MEDLOW16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in MOVI and SHORI (((x - $) >> 16) & 65536). */ - HOWTO (R_SH_IMM_MEDLOW16_PCREL, /* type */ - 16, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - TRUE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_IMM_MEDLOW16_PCREL", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - TRUE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 32) & 65536). */ - HOWTO (R_SH_IMM_MEDHI16, /* type */ - 32, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_IMM_MEDHI16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in MOVI and SHORI (((x - $) >> 32) & 65536). */ - HOWTO (R_SH_IMM_MEDHI16_PCREL, /* type */ - 32, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - TRUE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_IMM_MEDHI16_PCREL", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - TRUE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 48) & 65536). */ - HOWTO (R_SH_IMM_HI16, /* type */ - 48, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_IMM_HI16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in MOVI and SHORI (((x - $) >> 48) & 65536). */ - HOWTO (R_SH_IMM_HI16_PCREL, /* type */ - 48, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - TRUE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_IMM_HI16_PCREL", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - TRUE), /* pcrel_offset */ - - /* For the .uaquad pseudo. */ - HOWTO (R_SH_64, /* type */ - 0, /* rightshift */ - 4, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_64", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - ((bfd_vma) 0) - 1, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* For the .uaquad pseudo, (x - $). */ - HOWTO (R_SH_64_PCREL, /* type */ - 48, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - TRUE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_64_PCREL", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - ((bfd_vma) 0) - 1, /* dst_mask */ - TRUE), /* pcrel_offset */ - -#endif #undef SH_PARTIAL32 #undef SH_SRC_MASK32 #undef SH_ELF_RELOC diff --git a/bfd/elf32-sh.c b/bfd/elf32-sh.c index d0f5ac8..cd2c49c 100644 --- a/bfd/elf32-sh.c +++ b/bfd/elf32-sh.c @@ -38,10 +38,8 @@ static bfd_boolean sh_elf_relax_delete_bytes (bfd *, asection *, bfd_vma, int); static bfd_boolean sh_elf_align_loads (bfd *, asection *, Elf_Internal_Rela *, bfd_byte *, bfd_boolean *); -#ifndef SH64_ELF static bfd_boolean sh_elf_swap_insns (bfd *, asection *, void *, bfd_byte *, bfd_vma); -#endif static int sh_elf_optimized_tls_reloc (struct bfd_link_info *, int, int); static bfd_vma dtpoff_base @@ -87,7 +85,7 @@ static reloc_howto_type sh_vxworks_howto_table[] = static bfd_boolean vxworks_object_p (bfd *abfd ATTRIBUTE_UNUSED) { -#if !defined INCLUDE_SHMEDIA && !defined SH_TARGET_ALREADY_DEFINED +#if !defined SH_TARGET_ALREADY_DEFINED extern const bfd_target sh_elf32_vxworks_le_vec; extern const bfd_target sh_elf32_vxworks_vec; @@ -103,7 +101,7 @@ vxworks_object_p (bfd *abfd ATTRIBUTE_UNUSED) static bfd_boolean fdpic_object_p (bfd *abfd ATTRIBUTE_UNUSED) { -#if !defined INCLUDE_SHMEDIA && !defined SH_TARGET_ALREADY_DEFINED +#if !defined SH_TARGET_ALREADY_DEFINED extern const bfd_target sh_elf32_fdpic_le_vec; extern const bfd_target sh_elf32_fdpic_be_vec; @@ -371,57 +369,6 @@ static const struct elf_reloc_map sh_reloc_map[] = { BFD_RELOC_SH_GOTOFFFUNCDESC, R_SH_GOTOFFFUNCDESC }, { BFD_RELOC_SH_GOTOFFFUNCDESC20, R_SH_GOTOFFFUNCDESC20 }, { BFD_RELOC_SH_FUNCDESC, R_SH_FUNCDESC }, -#ifdef INCLUDE_SHMEDIA - { BFD_RELOC_SH_GOT_LOW16, R_SH_GOT_LOW16 }, - { BFD_RELOC_SH_GOT_MEDLOW16, R_SH_GOT_MEDLOW16 }, - { BFD_RELOC_SH_GOT_MEDHI16, R_SH_GOT_MEDHI16 }, - { BFD_RELOC_SH_GOT_HI16, R_SH_GOT_HI16 }, - { BFD_RELOC_SH_GOTPLT_LOW16, R_SH_GOTPLT_LOW16 }, - { BFD_RELOC_SH_GOTPLT_MEDLOW16, R_SH_GOTPLT_MEDLOW16 }, - { BFD_RELOC_SH_GOTPLT_MEDHI16, R_SH_GOTPLT_MEDHI16 }, - { BFD_RELOC_SH_GOTPLT_HI16, R_SH_GOTPLT_HI16 }, - { BFD_RELOC_SH_PLT_LOW16, R_SH_PLT_LOW16 }, - { BFD_RELOC_SH_PLT_MEDLOW16, R_SH_PLT_MEDLOW16 }, - { BFD_RELOC_SH_PLT_MEDHI16, R_SH_PLT_MEDHI16 }, - { BFD_RELOC_SH_PLT_HI16, R_SH_PLT_HI16 }, - { BFD_RELOC_SH_GOTOFF_LOW16, R_SH_GOTOFF_LOW16 }, - { BFD_RELOC_SH_GOTOFF_MEDLOW16, R_SH_GOTOFF_MEDLOW16 }, - { BFD_RELOC_SH_GOTOFF_MEDHI16, R_SH_GOTOFF_MEDHI16 }, - { BFD_RELOC_SH_GOTOFF_HI16, R_SH_GOTOFF_HI16 }, - { BFD_RELOC_SH_GOTPC_LOW16, R_SH_GOTPC_LOW16 }, - { BFD_RELOC_SH_GOTPC_MEDLOW16, R_SH_GOTPC_MEDLOW16 }, - { BFD_RELOC_SH_GOTPC_MEDHI16, R_SH_GOTPC_MEDHI16 }, - { BFD_RELOC_SH_GOTPC_HI16, R_SH_GOTPC_HI16 }, - { BFD_RELOC_SH_COPY64, R_SH_COPY64 }, - { BFD_RELOC_SH_GLOB_DAT64, R_SH_GLOB_DAT64 }, - { BFD_RELOC_SH_JMP_SLOT64, R_SH_JMP_SLOT64 }, - { BFD_RELOC_SH_RELATIVE64, R_SH_RELATIVE64 }, - { BFD_RELOC_SH_GOT10BY4, R_SH_GOT10BY4 }, - { BFD_RELOC_SH_GOT10BY8, R_SH_GOT10BY8 }, - { BFD_RELOC_SH_GOTPLT10BY4, R_SH_GOTPLT10BY4 }, - { BFD_RELOC_SH_GOTPLT10BY8, R_SH_GOTPLT10BY8 }, - { BFD_RELOC_SH_PT_16, R_SH_PT_16 }, - { BFD_RELOC_SH_SHMEDIA_CODE, R_SH_SHMEDIA_CODE }, - { BFD_RELOC_SH_IMMU5, R_SH_DIR5U }, - { BFD_RELOC_SH_IMMS6, R_SH_DIR6S }, - { BFD_RELOC_SH_IMMU6, R_SH_DIR6U }, - { BFD_RELOC_SH_IMMS10, R_SH_DIR10S }, - { BFD_RELOC_SH_IMMS10BY2, R_SH_DIR10SW }, - { BFD_RELOC_SH_IMMS10BY4, R_SH_DIR10SL }, - { BFD_RELOC_SH_IMMS10BY8, R_SH_DIR10SQ }, - { BFD_RELOC_SH_IMMS16, R_SH_IMMS16 }, - { BFD_RELOC_SH_IMMU16, R_SH_IMMU16 }, - { BFD_RELOC_SH_IMM_LOW16, R_SH_IMM_LOW16 }, - { BFD_RELOC_SH_IMM_LOW16_PCREL, R_SH_IMM_LOW16_PCREL }, - { BFD_RELOC_SH_IMM_MEDLOW16, R_SH_IMM_MEDLOW16 }, - { BFD_RELOC_SH_IMM_MEDLOW16_PCREL, R_SH_IMM_MEDLOW16_PCREL }, - { BFD_RELOC_SH_IMM_MEDHI16, R_SH_IMM_MEDHI16 }, - { BFD_RELOC_SH_IMM_MEDHI16_PCREL, R_SH_IMM_MEDHI16_PCREL }, - { BFD_RELOC_SH_IMM_HI16, R_SH_IMM_HI16 }, - { BFD_RELOC_SH_IMM_HI16_PCREL, R_SH_IMM_HI16_PCREL }, - { BFD_RELOC_64, R_SH_64 }, - { BFD_RELOC_64_PCREL, R_SH_64_PCREL }, -#endif /* not INCLUDE_SHMEDIA */ }; /* Given a BFD reloc code, return the howto structure for the @@ -526,14 +473,6 @@ sh_elf_relax_section (bfd *abfd, asection *sec, || sec->reloc_count == 0) return TRUE; -#ifdef INCLUDE_SHMEDIA - if (elf_section_data (sec)->this_hdr.sh_flags - & (SHF_SH5_ISA32 | SHF_SH5_ISA32_MIXED)) - { - return TRUE; - } -#endif - symtab_hdr = &elf_symtab_hdr (abfd); internal_relocs = (_bfd_elf_link_read_relocs @@ -1451,7 +1390,6 @@ sh_elf_align_loads (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, return FALSE; } -#ifndef SH64_ELF /* Swap two SH instructions. This is like sh_swap_insns in coff-sh.c. */ static bfd_boolean @@ -1581,7 +1519,6 @@ sh_elf_swap_insns (bfd *abfd, asection *sec, void *relocs, return TRUE; } -#endif /* defined SH64_ELF */ /* Describes one of the various PLT styles. */ @@ -1626,223 +1563,6 @@ struct elf_sh_plt_info const struct elf_sh_plt_info *short_plt; }; -#ifdef INCLUDE_SHMEDIA - -/* The size in bytes of an entry in the procedure linkage table. */ - -#define ELF_PLT_ENTRY_SIZE 64 - -/* First entry in an absolute procedure linkage table look like this. */ - -static const bfd_byte elf_sh_plt0_entry_be[ELF_PLT_ENTRY_SIZE] = -{ - 0xcc, 0x00, 0x01, 0x10, /* movi .got.plt >> 16, r17 */ - 0xc8, 0x00, 0x01, 0x10, /* shori .got.plt & 65535, r17 */ - 0x89, 0x10, 0x09, 0x90, /* ld.l r17, 8, r25 */ - 0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */ - 0x89, 0x10, 0x05, 0x10, /* ld.l r17, 4, r17 */ - 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */ - 0x6f, 0xf0, 0xff, 0xf0, /* nop */ - 0x6f, 0xf0, 0xff, 0xf0, /* nop */ - 0x6f, 0xf0, 0xff, 0xf0, /* nop */ - 0x6f, 0xf0, 0xff, 0xf0, /* nop */ - 0x6f, 0xf0, 0xff, 0xf0, /* nop */ - 0x6f, 0xf0, 0xff, 0xf0, /* nop */ - 0x6f, 0xf0, 0xff, 0xf0, /* nop */ - 0x6f, 0xf0, 0xff, 0xf0, /* nop */ - 0x6f, 0xf0, 0xff, 0xf0, /* nop */ - 0x6f, 0xf0, 0xff, 0xf0, /* nop */ -}; - -static const bfd_byte elf_sh_plt0_entry_le[ELF_PLT_ENTRY_SIZE] = -{ - 0x10, 0x01, 0x00, 0xcc, /* movi .got.plt >> 16, r17 */ - 0x10, 0x01, 0x00, 0xc8, /* shori .got.plt & 65535, r17 */ - 0x90, 0x09, 0x10, 0x89, /* ld.l r17, 8, r25 */ - 0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */ - 0x10, 0x05, 0x10, 0x89, /* ld.l r17, 4, r17 */ - 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */ - 0xf0, 0xff, 0xf0, 0x6f, /* nop */ - 0xf0, 0xff, 0xf0, 0x6f, /* nop */ - 0xf0, 0xff, 0xf0, 0x6f, /* nop */ - 0xf0, 0xff, 0xf0, 0x6f, /* nop */ - 0xf0, 0xff, 0xf0, 0x6f, /* nop */ - 0xf0, 0xff, 0xf0, 0x6f, /* nop */ - 0xf0, 0xff, 0xf0, 0x6f, /* nop */ - 0xf0, 0xff, 0xf0, 0x6f, /* nop */ - 0xf0, 0xff, 0xf0, 0x6f, /* nop */ - 0xf0, 0xff, 0xf0, 0x6f, /* nop */ -}; - -/* Sebsequent entries in an absolute procedure linkage table look like - this. */ - -static const bfd_byte elf_sh_plt_entry_be[ELF_PLT_ENTRY_SIZE] = -{ - 0xcc, 0x00, 0x01, 0x90, /* movi nameN-in-GOT >> 16, r25 */ - 0xc8, 0x00, 0x01, 0x90, /* shori nameN-in-GOT & 65535, r25 */ - 0x89, 0x90, 0x01, 0x90, /* ld.l r25, 0, r25 */ - 0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */ - 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */ - 0x6f, 0xf0, 0xff, 0xf0, /* nop */ - 0x6f, 0xf0, 0xff, 0xf0, /* nop */ - 0x6f, 0xf0, 0xff, 0xf0, /* nop */ - 0xcc, 0x00, 0x01, 0x90, /* movi .PLT0 >> 16, r25 */ - 0xc8, 0x00, 0x01, 0x90, /* shori .PLT0 & 65535, r25 */ - 0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */ - 0xcc, 0x00, 0x01, 0x50, /* movi reloc-offset >> 16, r21 */ - 0xc8, 0x00, 0x01, 0x50, /* shori reloc-offset & 65535, r21 */ - 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */ - 0x6f, 0xf0, 0xff, 0xf0, /* nop */ - 0x6f, 0xf0, 0xff, 0xf0, /* nop */ -}; - -static const bfd_byte elf_sh_plt_entry_le[ELF_PLT_ENTRY_SIZE] = -{ - 0x90, 0x01, 0x00, 0xcc, /* movi nameN-in-GOT >> 16, r25 */ - 0x90, 0x01, 0x00, 0xc8, /* shori nameN-in-GOT & 65535, r25 */ - 0x90, 0x01, 0x90, 0x89, /* ld.l r25, 0, r25 */ - 0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */ - 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */ - 0xf0, 0xff, 0xf0, 0x6f, /* nop */ - 0xf0, 0xff, 0xf0, 0x6f, /* nop */ - 0xf0, 0xff, 0xf0, 0x6f, /* nop */ - 0x90, 0x01, 0x00, 0xcc, /* movi .PLT0 >> 16, r25 */ - 0x90, 0x01, 0x00, 0xc8, /* shori .PLT0 & 65535, r25 */ - 0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */ - 0x50, 0x01, 0x00, 0xcc, /* movi reloc-offset >> 16, r21 */ - 0x50, 0x01, 0x00, 0xc8, /* shori reloc-offset & 65535, r21 */ - 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */ - 0xf0, 0xff, 0xf0, 0x6f, /* nop */ - 0xf0, 0xff, 0xf0, 0x6f, /* nop */ -}; - -/* Entries in a PIC procedure linkage table look like this. */ - -static const bfd_byte elf_sh_pic_plt_entry_be[ELF_PLT_ENTRY_SIZE] = -{ - 0xcc, 0x00, 0x01, 0x90, /* movi nameN@GOT >> 16, r25 */ - 0xc8, 0x00, 0x01, 0x90, /* shori nameN@GOT & 65535, r25 */ - 0x40, 0xc2, 0x65, 0x90, /* ldx.l r12, r25, r25 */ - 0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */ - 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */ - 0x6f, 0xf0, 0xff, 0xf0, /* nop */ - 0x6f, 0xf0, 0xff, 0xf0, /* nop */ - 0x6f, 0xf0, 0xff, 0xf0, /* nop */ - 0xce, 0x00, 0x01, 0x10, /* movi -GOT_BIAS, r17 */ - 0x00, 0xc8, 0x45, 0x10, /* add.l r12, r17, r17 */ - 0x89, 0x10, 0x09, 0x90, /* ld.l r17, 8, r25 */ - 0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */ - 0x89, 0x10, 0x05, 0x10, /* ld.l r17, 4, r17 */ - 0xcc, 0x00, 0x01, 0x50, /* movi reloc-offset >> 16, r21 */ - 0xc8, 0x00, 0x01, 0x50, /* shori reloc-offset & 65535, r21 */ - 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */ -}; - -static const bfd_byte elf_sh_pic_plt_entry_le[ELF_PLT_ENTRY_SIZE] = -{ - 0x90, 0x01, 0x00, 0xcc, /* movi nameN@GOT >> 16, r25 */ - 0x90, 0x01, 0x00, 0xc8, /* shori nameN@GOT & 65535, r25 */ - 0x90, 0x65, 0xc2, 0x40, /* ldx.l r12, r25, r25 */ - 0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */ - 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */ - 0xf0, 0xff, 0xf0, 0x6f, /* nop */ - 0xf0, 0xff, 0xf0, 0x6f, /* nop */ - 0xf0, 0xff, 0xf0, 0x6f, /* nop */ - 0x10, 0x01, 0x00, 0xce, /* movi -GOT_BIAS, r17 */ - 0x10, 0x45, 0xc8, 0x00, /* add.l r12, r17, r17 */ - 0x90, 0x09, 0x10, 0x89, /* ld.l r17, 8, r25 */ - 0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */ - 0x10, 0x05, 0x10, 0x89, /* ld.l r17, 4, r17 */ - 0x50, 0x01, 0x00, 0xcc, /* movi reloc-offset >> 16, r21 */ - 0x50, 0x01, 0x00, 0xc8, /* shori reloc-offset & 65535, r21 */ - 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */ -}; - -static const struct elf_sh_plt_info elf_sh_plts[2][2] = { - { - { - /* Big-endian non-PIC. */ - elf_sh_plt0_entry_be, - ELF_PLT_ENTRY_SIZE, - { 0, MINUS_ONE, MINUS_ONE }, - elf_sh_plt_entry_be, - ELF_PLT_ENTRY_SIZE, - { 0, 32, 48, FALSE }, - 33, /* includes ISA encoding */ - NULL - }, - { - /* Little-endian non-PIC. */ - elf_sh_plt0_entry_le, - ELF_PLT_ENTRY_SIZE, - { 0, MINUS_ONE, MINUS_ONE }, - elf_sh_plt_entry_le, - ELF_PLT_ENTRY_SIZE, - { 0, 32, 48, FALSE }, - 33, /* includes ISA encoding */ - NULL - }, - }, - { - { - /* Big-endian PIC. */ - elf_sh_plt0_entry_be, - ELF_PLT_ENTRY_SIZE, - { MINUS_ONE, MINUS_ONE, MINUS_ONE }, - elf_sh_pic_plt_entry_be, - ELF_PLT_ENTRY_SIZE, - { 0, MINUS_ONE, 52, FALSE }, - 33, /* includes ISA encoding */ - NULL - }, - { - /* Little-endian PIC. */ - elf_sh_plt0_entry_le, - ELF_PLT_ENTRY_SIZE, - { MINUS_ONE, MINUS_ONE, MINUS_ONE }, - elf_sh_pic_plt_entry_le, - ELF_PLT_ENTRY_SIZE, - { 0, MINUS_ONE, 52, FALSE }, - 33, /* includes ISA encoding */ - NULL - }, - } -}; - -/* Return offset of the linker in PLT0 entry. */ -#define elf_sh_plt0_gotplt_offset(info) 0 - -/* Install a 32-bit PLT field starting at ADDR, which occurs in OUTPUT_BFD. - VALUE is the field's value and CODE_P is true if VALUE refers to code, - not data. - - On SH64, each 32-bit field is loaded by a movi/shori pair. */ - -inline static void -install_plt_field (bfd *output_bfd, bfd_boolean code_p, - unsigned long value, bfd_byte *addr) -{ - value |= code_p; - bfd_put_32 (output_bfd, - bfd_get_32 (output_bfd, addr) - | ((value >> 6) & 0x3fffc00), - addr); - bfd_put_32 (output_bfd, - bfd_get_32 (output_bfd, addr + 4) - | ((value << 10) & 0x3fffc00), - addr + 4); -} - -/* Return the type of PLT associated with ABFD. PIC_P is true if - the object is position-independent. */ - -static const struct elf_sh_plt_info * -get_plt_info (bfd *abfd ATTRIBUTE_UNUSED, bfd_boolean pic_p) -{ - return &elf_sh_plts[pic_p][!bfd_big_endian (abfd)]; -} -#else /* The size in bytes of an entry in the procedure linkage table. */ #define ELF_PLT_ENTRY_SIZE 28 @@ -2321,7 +2041,6 @@ install_plt_field (bfd *output_bfd, bfd_boolean code_p ATTRIBUTE_UNUSED, { bfd_put_32 (output_bfd, value, addr); } -#endif /* The number of PLT entries which can use a shorter PLT, if any. Currently always 64K, since only SH-2A FDPIC uses this; a @@ -2383,14 +2102,6 @@ struct elf_sh_link_hash_entry { struct elf_link_hash_entry root; -#ifdef INCLUDE_SHMEDIA - union - { - bfd_signed_vma refcount; - bfd_vma offset; - } datalabel_got; -#endif - /* Track dynamic relocs copied for this symbol. */ struct elf_dyn_relocs *dyn_relocs; @@ -2529,9 +2240,6 @@ sh_elf_link_hash_newfunc (struct bfd_hash_entry *entry, { ret->dyn_relocs = NULL; ret->gotplt_refcount = 0; -#ifdef INCLUDE_SHMEDIA - ret->datalabel_got.refcount = ret->root.got.refcount; -#endif ret->funcdesc.refcount = 0; ret->abs_funcdesc_refcount = 0; ret->got_type = GOT_UNKNOWN; @@ -3101,32 +2809,6 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) else h->got.offset = (bfd_vma) -1; -#ifdef INCLUDE_SHMEDIA - if (eh->datalabel_got.refcount > 0) - { - asection *s; - bfd_boolean dyn; - - /* Make sure this symbol is output as a dynamic symbol. - Undefined weak syms won't yet be marked as dynamic. */ - if (h->dynindx == -1 - && !h->forced_local) - { - if (! bfd_elf_link_record_dynamic_symbol (info, h)) - return FALSE; - } - - s = htab->root.sgot; - eh->datalabel_got.offset = s->size; - s->size += 4; - dyn = htab->root.dynamic_sections_created; - if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)) - htab->root.srelgot->size += sizeof (Elf32_External_Rela); - } - else - eh->datalabel_got.offset = (bfd_vma) -1; -#endif - /* Allocate space for any dynamic relocations to function descriptors, canonical or otherwise. We need to relocate the reference unless it resolves to zero, which only happens for @@ -3406,10 +3088,6 @@ sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, symtab_hdr = &elf_symtab_hdr (ibfd); locsymcount = symtab_hdr->sh_info; -#ifdef INCLUDE_SHMEDIA - /* Count datalabel local GOT. */ - locsymcount *= 2; -#endif s = htab->root.sgot; srel = htab->root.srelgot; @@ -4030,15 +3708,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, symname = h->root.root.string; while (h->root.type == bfd_link_hash_indirect || h->root.type == bfd_link_hash_warning) - { -#ifdef INCLUDE_SHMEDIA - /* If the reference passes a symbol marked with - STT_DATALABEL, then any STO_SH5_ISA32 on the final value - doesn't count. */ - seen_stt_datalabel |= h->type == STT_DATALABEL; -#endif - h = (struct elf_link_hash_entry *) h->root.u.i.link; - } + h = (struct elf_link_hash_entry *) h->root.u.i.link; if (h->root.type == bfd_link_hash_defined || h->root.type == bfd_link_hash_defweak) { @@ -4217,11 +3887,6 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, break; default: -#ifdef INCLUDE_SHMEDIA - if (shmedia_prepare_reloc (info, input_bfd, input_section, - contents, rel, &relocation)) - goto final_link_relocate; -#endif bfd_set_error (bfd_error_bad_value); return FALSE; @@ -4298,12 +3963,6 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, case R_SH_DIR32: case R_SH_REL32: -#ifdef INCLUDE_SHMEDIA - case R_SH_IMM_LOW16_PCREL: - case R_SH_IMM_MEDLOW16_PCREL: - case R_SH_IMM_MEDHI16_PCREL: - case R_SH_IMM_HI16_PCREL: -#endif if (bfd_link_pic (info) && (h == NULL || (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT @@ -4355,17 +4014,6 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, ? bfd_get_32 (input_bfd, contents + rel->r_offset) : addend); } -#ifdef INCLUDE_SHMEDIA - else if (r_type == R_SH_IMM_LOW16_PCREL - || r_type == R_SH_IMM_MEDLOW16_PCREL - || r_type == R_SH_IMM_MEDHI16_PCREL - || r_type == R_SH_IMM_HI16_PCREL) - { - BFD_ASSERT (h != NULL && h->dynindx != -1); - outrel.r_info = ELF32_R_INFO (h->dynindx, r_type); - outrel.r_addend = addend; - } -#endif else if (fdpic_p && (h == NULL || ((info->symbolic || h->dynindx == -1) @@ -4461,14 +4109,6 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, goto final_link_relocate; case R_SH_GOTPLT32: -#ifdef INCLUDE_SHMEDIA - case R_SH_GOTPLT_LOW16: - case R_SH_GOTPLT_MEDLOW16: - case R_SH_GOTPLT_MEDHI16: - case R_SH_GOTPLT_HI16: - case R_SH_GOTPLT10BY4: - case R_SH_GOTPLT10BY8: -#endif /* Relocation is to the entry for this symbol in the procedure linkage table. */ @@ -4499,14 +4139,6 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, force_got: case R_SH_GOT32: case R_SH_GOT20: -#ifdef INCLUDE_SHMEDIA - case R_SH_GOT_LOW16: - case R_SH_GOT_MEDLOW16: - case R_SH_GOT_MEDHI16: - case R_SH_GOT_HI16: - case R_SH_GOT10BY4: - case R_SH_GOT10BY8: -#endif /* Relocation is to the entry for this symbol in the global offset table. */ @@ -4519,15 +4151,6 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, bfd_boolean dyn; off = h->got.offset; -#ifdef INCLUDE_SHMEDIA - if (seen_stt_datalabel) - { - struct elf_sh_link_hash_entry *hsh; - - hsh = (struct elf_sh_link_hash_entry *)h; - off = hsh->datalabel_got.offset; - } -#endif BFD_ASSERT (off != (bfd_vma) -1); dyn = htab->root.dynamic_sections_created; @@ -4558,17 +4181,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, { bfd_put_32 (output_bfd, relocation, sgot->contents + off); -#ifdef INCLUDE_SHMEDIA - if (seen_stt_datalabel) - { - struct elf_sh_link_hash_entry *hsh; - - hsh = (struct elf_sh_link_hash_entry *)h; - hsh->datalabel_got.offset |= 1; - } - else -#endif - h->got.offset |= 1; + h->got.offset |= 1; /* If we initialize the GOT entry here with a valid symbol address, also add a fixup. */ @@ -4587,27 +4200,10 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, } else { -#ifdef INCLUDE_SHMEDIA - if (rel->r_addend) - { - BFD_ASSERT (local_got_offsets != NULL - && (local_got_offsets[symtab_hdr->sh_info - + r_symndx] - != (bfd_vma) -1)); - - off = local_got_offsets[symtab_hdr->sh_info - + r_symndx]; - } - else - { -#endif BFD_ASSERT (local_got_offsets != NULL && local_got_offsets[r_symndx] != (bfd_vma) -1); off = local_got_offsets[r_symndx]; -#ifdef INCLUDE_SHMEDIA - } -#endif /* The offset must always be a multiple of 4. We use the least significant bit to record whether we have @@ -4651,12 +4247,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, + sgot->output_offset + off); -#ifdef INCLUDE_SHMEDIA - if (rel->r_addend) - local_got_offsets[symtab_hdr->sh_info + r_symndx] |= 1; - else -#endif - local_got_offsets[r_symndx] |= 1; + local_got_offsets[r_symndx] |= 1; } relocation = sh_elf_got_offset (htab) + off; @@ -4678,12 +4269,6 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, case R_SH_GOTOFF: case R_SH_GOTOFF20: -#ifdef INCLUDE_SHMEDIA - case R_SH_GOTOFF_LOW16: - case R_SH_GOTOFF_MEDLOW16: - case R_SH_GOTOFF_MEDHI16: - case R_SH_GOTOFF_HI16: -#endif /* GOTOFF relocations are relative to _GLOBAL_OFFSET_TABLE_, which we place at the start of the .got.plt section. This is the same as the start of the output .got section, unless there are function @@ -4711,12 +4296,6 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, goto final_link_relocate; case R_SH_GOTPC: -#ifdef INCLUDE_SHMEDIA - case R_SH_GOTPC_LOW16: - case R_SH_GOTPC_MEDLOW16: - case R_SH_GOTPC_MEDHI16: - case R_SH_GOTPC_HI16: -#endif /* Use global offset table as symbol value. */ BFD_ASSERT (sgotplt != NULL); @@ -4731,12 +4310,6 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, goto final_link_relocate; case R_SH_PLT32: -#ifdef INCLUDE_SHMEDIA - case R_SH_PLT_LOW16: - case R_SH_PLT_MEDLOW16: - case R_SH_PLT_MEDHI16: - case R_SH_PLT_HI16: -#endif /* Relocation is to the entry for this symbol in the procedure linkage table. */ @@ -4769,10 +4342,6 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, + splt->output_offset + h->plt.offset); -#ifdef INCLUDE_SHMEDIA - relocation++; -#endif - addend = rel->r_addend; goto final_link_relocate; @@ -5720,10 +5289,6 @@ sh_elf_copy_indirect_symbol (struct bfd_link_info *info, } edir->gotplt_refcount = eind->gotplt_refcount; eind->gotplt_refcount = 0; -#ifdef INCLUDE_SHMEDIA - edir->datalabel_got.refcount += eind->datalabel_got.refcount; - eind->datalabel_got.refcount = 0; -#endif edir->funcdesc.refcount += eind->funcdesc.refcount; eind->funcdesc.refcount = 0; edir->abs_funcdesc_refcount += eind->abs_funcdesc_refcount; @@ -5818,9 +5383,6 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, { struct elf_link_hash_entry *h; unsigned long r_symndx; -#ifdef INCLUDE_SHMEDIA - int seen_stt_datalabel = 0; -#endif r_symndx = ELF32_R_SYM (rel->r_info); r_type = ELF32_R_TYPE (rel->r_info); @@ -5832,12 +5394,7 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, h = sym_hashes[r_symndx - symtab_hdr->sh_info]; while (h->root.type == bfd_link_hash_indirect || h->root.type == bfd_link_hash_warning) - { -#ifdef INCLUDE_SHMEDIA - seen_stt_datalabel |= h->type == STT_DATALABEL; -#endif - h = (struct elf_link_hash_entry *) h->root.u.i.link; - } + h = (struct elf_link_hash_entry *) h->root.u.i.link; } r_type = sh_elf_optimized_tls_reloc (info, r_type, h == NULL); @@ -5895,28 +5452,6 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, case R_SH_GOTOFFFUNCDESC: case R_SH_GOTOFFFUNCDESC20: case R_SH_GOTPC: -#ifdef INCLUDE_SHMEDIA - case R_SH_GOTPLT_LOW16: - case R_SH_GOTPLT_MEDLOW16: - case R_SH_GOTPLT_MEDHI16: - case R_SH_GOTPLT_HI16: - case R_SH_GOTPLT10BY4: - case R_SH_GOTPLT10BY8: - case R_SH_GOT_LOW16: - case R_SH_GOT_MEDLOW16: - case R_SH_GOT_MEDHI16: - case R_SH_GOT_HI16: - case R_SH_GOT10BY4: - case R_SH_GOT10BY8: - case R_SH_GOTOFF_LOW16: - case R_SH_GOTOFF_MEDLOW16: - case R_SH_GOTOFF_MEDHI16: - case R_SH_GOTOFF_HI16: - case R_SH_GOTPC_LOW16: - case R_SH_GOTPC_MEDLOW16: - case R_SH_GOTPC_MEDHI16: - case R_SH_GOTPC_HI16: -#endif case R_SH_TLS_GD_32: case R_SH_TLS_LD_32: case R_SH_TLS_IE_32: @@ -5958,14 +5493,6 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, case R_SH_TLS_GD_32: case R_SH_GOT32: case R_SH_GOT20: -#ifdef INCLUDE_SHMEDIA - case R_SH_GOT_LOW16: - case R_SH_GOT_MEDLOW16: - case R_SH_GOT_MEDHI16: - case R_SH_GOT_HI16: - case R_SH_GOT10BY4: - case R_SH_GOT10BY8: -#endif case R_SH_GOTFUNCDESC: case R_SH_GOTFUNCDESC20: switch (r_type) @@ -5987,17 +5514,7 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, if (h != NULL) { -#ifdef INCLUDE_SHMEDIA - if (seen_stt_datalabel) - { - struct elf_sh_link_hash_entry *eh - = (struct elf_sh_link_hash_entry *) h; - - eh->datalabel_got.refcount += 1; - } - else -#endif - h->got.refcount += 1; + h->got.refcount += 1; old_got_type = sh_elf_hash_entry (h)->got_type; } else @@ -6013,33 +5530,16 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, size = symtab_hdr->sh_info; size *= sizeof (bfd_signed_vma); -#ifdef INCLUDE_SHMEDIA - /* Reserve space for both the datalabel and - codelabel local GOT offsets. */ - size *= 2; -#endif size += symtab_hdr->sh_info; local_got_refcounts = ((bfd_signed_vma *) bfd_zalloc (abfd, size)); if (local_got_refcounts == NULL) return FALSE; elf_local_got_refcounts (abfd) = local_got_refcounts; -#ifdef INCLUDE_SHMEDIA - /* Take care of both the datalabel and codelabel local - GOT offsets. */ - sh_elf_local_got_type (abfd) - = (char *) (local_got_refcounts + 2 * symtab_hdr->sh_info); -#else sh_elf_local_got_type (abfd) = (char *) (local_got_refcounts + symtab_hdr->sh_info); -#endif } -#ifdef INCLUDE_SHMEDIA - if (rel->r_addend & 1) - local_got_refcounts[symtab_hdr->sh_info + r_symndx] += 1; - else -#endif - local_got_refcounts[r_symndx] += 1; + local_got_refcounts[r_symndx] += 1; old_got_type = sh_elf_local_got_type (abfd) [r_symndx]; } @@ -6109,10 +5609,6 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, bfd_size_type size; size = symtab_hdr->sh_info * sizeof (union gotref); -#ifdef INCLUDE_SHMEDIA - /* Count datalabel local GOT. */ - size *= 2; -#endif local_funcdesc = (union gotref *) bfd_zalloc (abfd, size); if (local_funcdesc == NULL) return FALSE; @@ -6154,14 +5650,6 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, break; case R_SH_GOTPLT32: -#ifdef INCLUDE_SHMEDIA - case R_SH_GOTPLT_LOW16: - case R_SH_GOTPLT_MEDLOW16: - case R_SH_GOTPLT_MEDHI16: - case R_SH_GOTPLT_HI16: - case R_SH_GOTPLT10BY4: - case R_SH_GOTPLT10BY8: -#endif /* If this is a local symbol, we resolve it directly without creating a procedure linkage table entry. */ @@ -6179,12 +5667,6 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, break; case R_SH_PLT32: -#ifdef INCLUDE_SHMEDIA - case R_SH_PLT_LOW16: - case R_SH_PLT_MEDLOW16: - case R_SH_PLT_MEDHI16: - case R_SH_PLT_HI16: -#endif /* This symbol requires a procedure linkage table entry. We actually build the entry in adjust_dynamic_symbol, because this might be a case of linking PIC code which is @@ -6206,12 +5688,6 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, case R_SH_DIR32: case R_SH_REL32: -#ifdef INCLUDE_SHMEDIA - case R_SH_IMM_LOW16_PCREL: - case R_SH_IMM_MEDLOW16_PCREL: - case R_SH_IMM_MEDHI16_PCREL: - case R_SH_IMM_HI16_PCREL: -#endif if (h != NULL && ! bfd_link_pic (info)) { h->non_got_ref = 1; @@ -6307,14 +5783,7 @@ sh_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, } p->count += 1; - if (r_type == R_SH_REL32 -#ifdef INCLUDE_SHMEDIA - || r_type == R_SH_IMM_LOW16_PCREL - || r_type == R_SH_IMM_MEDLOW16_PCREL - || r_type == R_SH_IMM_MEDHI16_PCREL - || r_type == R_SH_IMM_HI16_PCREL -#endif - ) + if (r_type == R_SH_REL32) p->pc_count += 1; } @@ -6804,70 +6273,6 @@ sh_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info, bfd_elf32_swap_reloca_out (output_bfd, &rel, loc); } -#ifdef INCLUDE_SHMEDIA - { - struct elf_sh_link_hash_entry *eh; - - eh = (struct elf_sh_link_hash_entry *) h; - if (eh->datalabel_got.offset != (bfd_vma) -1) - { - asection *sgot; - asection *srelgot; - Elf_Internal_Rela rel; - bfd_byte *loc; - - /* This symbol has a datalabel entry in the global offset table. - Set it up. */ - - sgot = htab->root.sgot; - srelgot = htab->root.srelgot; - BFD_ASSERT (sgot != NULL && srelgot != NULL); - - rel.r_offset = (sgot->output_section->vma - + sgot->output_offset - + (eh->datalabel_got.offset &~ (bfd_vma) 1)); - - /* If this is a static link, or it is a -Bsymbolic link and the - symbol is defined locally or was forced to be local because - of a version file, we just want to emit a RELATIVE reloc. - The entry in the global offset table will already have been - initialized in the relocate_section function. */ - if (bfd_link_pic (info) - && SYMBOL_REFERENCES_LOCAL (info, h)) - { - if (htab->fdpic_p) - { - asection *sec = h->root.u.def.section; - int dynindx - = elf_section_data (sec->output_section)->dynindx; - - rel.r_info = ELF32_R_INFO (dynindx, R_SH_DIR32); - rel.r_addend = (h->root.u.def.value - + h->root.u.def.section->output_offset); - } - else - { - rel.r_info = ELF32_R_INFO (0, R_SH_RELATIVE); - rel.r_addend = (h->root.u.def.value - + h->root.u.def.section->output_section->vma - + h->root.u.def.section->output_offset); - } - } - else - { - bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents - + eh->datalabel_got.offset); - rel.r_info = ELF32_R_INFO (h->dynindx, R_SH_GLOB_DAT); - rel.r_addend = 0; - } - - loc = srelgot->contents; - loc += srelgot->reloc_count++ * sizeof (Elf32_External_Rela); - bfd_elf32_swap_reloca_out (output_bfd, &rel, loc); - } - } -#endif - if (h->needs_copy) { asection *s; @@ -6931,9 +6336,6 @@ sh_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info) { Elf_Internal_Dyn dyn; asection *s; -#ifdef INCLUDE_SHMEDIA - const char *name; -#endif bfd_elf32_swap_dyn_in (htab->root.dynobj, dyncon, &dyn); @@ -6945,29 +6347,6 @@ sh_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info) bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); break; -#ifdef INCLUDE_SHMEDIA - case DT_INIT: - name = info->init_function; - goto get_sym; - - case DT_FINI: - name = info->fini_function; - get_sym: - if (dyn.d_un.d_val != 0) - { - struct elf_link_hash_entry *h; - - h = elf_link_hash_lookup (&htab->root, name, - FALSE, FALSE, TRUE); - if (h != NULL && (h->other & STO_SH5_ISA32)) - { - dyn.d_un.d_val |= 1; - bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); - } - } - break; -#endif - case DT_PLTGOT: BFD_ASSERT (htab->root.hgot != NULL); s = htab->root.hgot->root.u.def.section; @@ -7317,7 +6696,7 @@ sh_elf_encode_eh_address (bfd *abfd, #define elf_backend_linux_prpsinfo32_ugid16 TRUE -#if !defined INCLUDE_SHMEDIA && !defined SH_TARGET_ALREADY_DEFINED +#if !defined SH_TARGET_ALREADY_DEFINED #include "elf32-target.h" @@ -7415,4 +6794,4 @@ sh_elf_encode_eh_address (bfd *abfd, #include "elf32-target.h" -#endif /* neither INCLUDE_SHMEDIA nor SH_TARGET_ALREADY_DEFINED */ +#endif /* not SH_TARGET_ALREADY_DEFINED */ diff --git a/bfd/elf32-sh64-com.c b/bfd/elf32-sh64-com.c deleted file mode 100644 index 1b69f88..0000000 --- a/bfd/elf32-sh64-com.c +++ /dev/null @@ -1,245 +0,0 @@ -/* SuperH SH64-specific support for 32-bit ELF - Copyright (C) 2000-2018 Free Software Foundation, Inc. - - This file is part of BFD, the Binary File Descriptor library. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, - MA 02110-1301, USA. */ - -#define SH64_ELF - -#include "sysdep.h" -#include "bfd.h" -#include "libbfd.h" -#include "elf-bfd.h" -#include "elf/sh.h" -#include "elf32-sh64.h" -#include "../opcodes/sh64-opc.h" - -static bfd_boolean sh64_address_in_cranges - (asection *cranges, bfd_vma, sh64_elf_crange *); - -/* Ordering functions of a crange, for the qsort and bsearch calls and for - different endianness. */ - -int -_bfd_sh64_crange_qsort_cmpb (const void *p1, const void *p2) -{ - bfd_vma a1 = bfd_getb32 (p1); - bfd_vma a2 = bfd_getb32 (p2); - - /* Preserve order if there's ambiguous contents. */ - if (a1 == a2) - return (char *) p1 - (char *) p2; - - return a1 - a2; -} - -int -_bfd_sh64_crange_qsort_cmpl (const void *p1, const void *p2) -{ - bfd_vma a1 = (bfd_vma) bfd_getl32 (p1); - bfd_vma a2 = (bfd_vma) bfd_getl32 (p2); - - /* Preserve order if there's ambiguous contents. */ - if (a1 == a2) - return (char *) p1 - (char *) p2; - - return a1 - a2; -} - -int -_bfd_sh64_crange_bsearch_cmpb (const void *p1, const void *p2) -{ - bfd_vma a1 = *(bfd_vma *) p1; - bfd_vma a2 = (bfd_vma) bfd_getb32 (p2); - bfd_size_type size - = (bfd_size_type) bfd_getb32 (SH64_CRANGE_CR_SIZE_OFFSET + (char *) p2); - - if (a1 >= a2 + size) - return 1; - if (a1 < a2) - return -1; - return 0; -} - -int -_bfd_sh64_crange_bsearch_cmpl (const void *p1, const void *p2) -{ - bfd_vma a1 = *(bfd_vma *) p1; - bfd_vma a2 = (bfd_vma) bfd_getl32 (p2); - bfd_size_type size - = (bfd_size_type) bfd_getl32 (SH64_CRANGE_CR_SIZE_OFFSET + (char *) p2); - - if (a1 >= a2 + size) - return 1; - if (a1 < a2) - return -1; - return 0; -} - -/* Check whether a specific address is specified within a .cranges - section. Return FALSE if not found, and TRUE if found, and the region - filled into RANGEP if non-NULL. */ - -static bfd_boolean -sh64_address_in_cranges (asection *cranges, bfd_vma addr, - sh64_elf_crange *rangep) -{ - bfd_byte *cranges_contents; - bfd_byte *found_rangep; - bfd_size_type cranges_size = cranges->size; - - /* If the size is not a multiple of the cranges entry size, then - something is badly wrong. */ - if ((cranges_size % SH64_CRANGE_SIZE) != 0) - return FALSE; - - /* If this section has relocations, then we can't do anything sane. */ - if (bfd_get_section_flags (cranges->owner, cranges) & SEC_RELOC) - return FALSE; - - /* Has some kind soul (or previous call) left processed, sorted contents - for us? */ - if ((bfd_get_section_flags (cranges->owner, cranges) & SEC_IN_MEMORY) - && elf_section_data (cranges)->this_hdr.sh_type == SHT_SH5_CR_SORTED) - cranges_contents = cranges->contents; - else - { - if (!bfd_malloc_and_get_section (cranges->owner, cranges, - &cranges_contents)) - goto error_return; - - /* Is it sorted? */ - if (elf_section_data (cranges)->this_hdr.sh_type - != SHT_SH5_CR_SORTED) - /* Nope. Lets sort it. */ - qsort (cranges_contents, cranges_size / SH64_CRANGE_SIZE, - SH64_CRANGE_SIZE, - bfd_big_endian (cranges->owner) - ? _bfd_sh64_crange_qsort_cmpb : _bfd_sh64_crange_qsort_cmpl); - - /* Let's keep it around. */ - cranges->contents = cranges_contents; - bfd_set_section_flags (cranges->owner, cranges, - bfd_get_section_flags (cranges->owner, cranges) - | SEC_IN_MEMORY); - - /* It's sorted now. */ - elf_section_data (cranges)->this_hdr.sh_type = SHT_SH5_CR_SORTED; - } - - /* Try and find a matching range. */ - found_rangep - = bsearch (&addr, cranges_contents, cranges_size / SH64_CRANGE_SIZE, - SH64_CRANGE_SIZE, - bfd_big_endian (cranges->owner) - ? _bfd_sh64_crange_bsearch_cmpb - : _bfd_sh64_crange_bsearch_cmpl); - - /* Fill in a few return values if we found a matching range. */ - if (found_rangep) - { - enum sh64_elf_cr_type cr_type - = bfd_get_16 (cranges->owner, - SH64_CRANGE_CR_TYPE_OFFSET + found_rangep); - bfd_vma cr_addr - = bfd_get_32 (cranges->owner, - SH64_CRANGE_CR_ADDR_OFFSET - + (char *) found_rangep); - bfd_size_type cr_size - = bfd_get_32 (cranges->owner, - SH64_CRANGE_CR_SIZE_OFFSET - + (char *) found_rangep); - - rangep->cr_addr = cr_addr; - rangep->cr_size = cr_size; - rangep->cr_type = cr_type; - - return TRUE; - } - - /* There is a .cranges section, but it does not have a descriptor - matching this address. */ - return FALSE; - -error_return: - if (cranges_contents != NULL) - free (cranges_contents); - return FALSE; -} - -/* Determine what ADDR points to in SEC, and fill in a range descriptor in - *RANGEP if it's non-NULL. */ - -enum sh64_elf_cr_type -sh64_get_contents_type (asection *sec, bfd_vma addr, sh64_elf_crange *rangep) -{ - asection *cranges; - - /* Fill in the range with the boundaries of the section as a default. */ - if (bfd_get_flavour (sec->owner) == bfd_target_elf_flavour - && elf_elfheader (sec->owner)->e_type == ET_EXEC) - { - rangep->cr_addr = bfd_get_section_vma (sec->owner, sec); - rangep->cr_size = sec->size; - rangep->cr_type = CRT_NONE; - } - else - return FALSE; - - /* If none of the pertinent bits are set, then it's a SHcompact (or at - least not SHmedia). */ - if ((elf_section_data (sec)->this_hdr.sh_flags - & (SHF_SH5_ISA32 | SHF_SH5_ISA32_MIXED)) == 0) - { - enum sh64_elf_cr_type cr_type - = ((bfd_get_section_flags (sec->owner, sec) & SEC_CODE) != 0 - ? CRT_SH5_ISA16 : CRT_DATA); - rangep->cr_type = cr_type; - return cr_type; - } - - /* If only the SHF_SH5_ISA32 bit is set, then we have SHmedia. */ - if ((elf_section_data (sec)->this_hdr.sh_flags - & (SHF_SH5_ISA32 | SHF_SH5_ISA32_MIXED)) == SHF_SH5_ISA32) - { - rangep->cr_type = CRT_SH5_ISA32; - return CRT_SH5_ISA32; - } - - /* Otherwise, we have to look up the .cranges section. */ - cranges = bfd_get_section_by_name (sec->owner, SH64_CRANGES_SECTION_NAME); - - if (cranges == NULL) - /* A mixed section but there's no .cranges section. This is probably - bad input; it does not comply to specs. */ - return CRT_NONE; - - /* If this call fails, we will still have CRT_NONE in rangep->cr_type - and that will be suitable to return. */ - sh64_address_in_cranges (cranges, addr, rangep); - - return rangep->cr_type; -} - -/* This is a simpler exported interface for the benefit of gdb et al. */ - -bfd_boolean -sh64_address_is_shmedia (asection *sec, bfd_vma addr) -{ - sh64_elf_crange dummy; - return sh64_get_contents_type (sec, addr, &dummy) == CRT_SH5_ISA32; -} diff --git a/bfd/elf32-sh64.c b/bfd/elf32-sh64.c deleted file mode 100644 index b635841..0000000 --- a/bfd/elf32-sh64.c +++ /dev/null @@ -1,814 +0,0 @@ -/* SuperH SH64-specific support for 32-bit ELF - Copyright (C) 2000-2018 Free Software Foundation, Inc. - - This file is part of BFD, the Binary File Descriptor library. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, - MA 02110-1301, USA. */ - -#define SH64_ELF - -#include "sysdep.h" -#include "bfd.h" -#include "elf-bfd.h" -#include "../opcodes/sh64-opc.h" -#include "elf32-sh64.h" - -/* Add a suffix for datalabel indirection symbols. It must not match any - other symbols; user symbols with or without version or other - decoration. It must only be used internally and not emitted by any - means. */ -#define DATALABEL_SUFFIX " DL" - -/* Used to hold data for function called through bfd_map_over_sections. */ -struct sh64_find_section_vma_data - { - asection *section; - bfd_vma addr; - }; - -static bfd_boolean sh64_elf_new_section_hook - (bfd *, asection *); -static bfd_boolean sh64_elf_copy_private_data - (bfd *, bfd *); -static bfd_boolean sh64_elf_merge_private_data - (bfd *, struct bfd_link_info *); -static bfd_boolean sh64_elf_fake_sections - (bfd *, Elf_Internal_Shdr *, asection *); -static bfd_boolean sh64_elf_set_private_flags - (bfd *, flagword); -static bfd_boolean sh64_elf_set_mach_from_flags - (bfd *); -static bfd_boolean shmedia_prepare_reloc - (struct bfd_link_info *, bfd *, asection *, bfd_byte *, - const Elf_Internal_Rela *, bfd_vma *); -static int sh64_elf_get_symbol_type - (Elf_Internal_Sym *, int); -static bfd_boolean sh64_elf_add_symbol_hook - (bfd *, struct bfd_link_info *, Elf_Internal_Sym *, const char **, - flagword *, asection **, bfd_vma *); -static int sh64_elf_link_output_symbol_hook - (struct bfd_link_info *, const char *, Elf_Internal_Sym *, asection *, - struct elf_link_hash_entry *); -static bfd_boolean sh64_backend_section_from_shdr - (bfd *, Elf_Internal_Shdr *, const char *, int); -static void sh64_elf_final_write_processing - (bfd *, bfd_boolean); -static bfd_boolean sh64_bfd_elf_copy_private_section_data - (bfd *, asection *, bfd *, asection *); -static void sh64_find_section_for_address - (bfd *, asection *, void *); - -/* Let elf32-sh.c handle the "bfd_" definitions, so we only have to - intrude with an #ifndef around the function definition. */ -#define sh_elf_copy_private_data sh64_elf_copy_private_data -#define sh_elf_merge_private_data sh64_elf_merge_private_data -#define sh_elf_set_private_flags sh64_elf_set_private_flags -/* Typo in elf32-sh.c (and unlinear name). */ -#define bfd_elf32_bfd_set_private_flags sh64_elf_set_private_flags -#define sh_elf_set_mach_from_flags sh64_elf_set_mach_from_flags - -#define elf_backend_sign_extend_vma 1 -#define elf_backend_fake_sections sh64_elf_fake_sections -#define elf_backend_get_symbol_type sh64_elf_get_symbol_type -#define elf_backend_add_symbol_hook sh64_elf_add_symbol_hook -#define elf_backend_link_output_symbol_hook \ - sh64_elf_link_output_symbol_hook -#define elf_backend_merge_symbol_attribute sh64_elf_merge_symbol_attribute -#define elf_backend_final_write_processing sh64_elf_final_write_processing -#define elf_backend_section_from_shdr sh64_backend_section_from_shdr -#define elf_backend_special_sections sh64_elf_special_sections -#define elf_backend_section_flags sh64_elf_section_flags - -#define bfd_elf32_new_section_hook sh64_elf_new_section_hook - -/* For objcopy, we need to set up sh64_elf_section_data (asection *) from - incoming section flags. This is otherwise done in sh64elf.em when - linking or tc-sh64.c when assembling. */ -#define bfd_elf32_bfd_copy_private_section_data \ - sh64_bfd_elf_copy_private_section_data - -/* This COFF-only function (only compiled with COFF support, making - ELF-only chains problematic) returns TRUE early for SH4, so let's just - define it TRUE here. */ -#define _bfd_sh_align_load_span(a,b,c,d,e,f,g,h,i,j) \ - ((void) f, (void) h, (void) i, TRUE) - -#define GOT_BIAS (-((long)-32768)) -#define INCLUDE_SHMEDIA -#define SH_TARGET_ALREADY_DEFINED -#include "elf32-sh.c" - -/* Tack some extra info on struct bfd_elf_section_data. */ - -static bfd_boolean -sh64_elf_new_section_hook (bfd *abfd, asection *sec) -{ - if (!sec->used_by_bfd) - { - struct _sh64_elf_section_data *sdata; - bfd_size_type amt = sizeof (*sdata); - - sdata = bfd_zalloc (abfd, amt); - if (sdata == NULL) - return FALSE; - sec->used_by_bfd = sdata; - } - - return _bfd_elf_new_section_hook (abfd, sec); -} - -/* Set the SHF_SH5_ISA32 flag for ISA SHmedia code sections, and pass - through SHT_SH5_CR_SORTED on a sorted .cranges section. */ - -bfd_boolean -sh64_elf_fake_sections (bfd *output_bfd ATTRIBUTE_UNUSED, - Elf_Internal_Shdr *elf_section_hdr, - asection *asect) -{ - if (sh64_elf_section_data (asect)->sh64_info != NULL) - elf_section_hdr->sh_flags - |= sh64_elf_section_data (asect)->sh64_info->contents_flags; - - /* If this section has the SEC_SORT_ENTRIES flag set, it is a sorted - .cranges section passing through objcopy. */ - if ((bfd_get_section_flags (output_bfd, asect) & SEC_SORT_ENTRIES) != 0 - && strcmp (bfd_get_section_name (output_bfd, asect), - SH64_CRANGES_SECTION_NAME) == 0) - elf_section_hdr->sh_type = SHT_SH5_CR_SORTED; - - return TRUE; -} - -static bfd_boolean -sh64_elf_set_mach_from_flags (bfd *abfd) -{ - flagword flags = elf_elfheader (abfd)->e_flags; - - switch (flags & EF_SH_MACH_MASK) - { - case EF_SH5: - /* These are fit to execute on SH5. Just one but keep the switch - construct to make additions easy. */ - bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh5); - break; - - default: - bfd_set_error (bfd_error_wrong_format); - return FALSE; - } - - return TRUE; -} - -static bfd_boolean -sh64_elf_section_flags (flagword *flags, - const Elf_Internal_Shdr *hdr) -{ - if (hdr->bfd_section == NULL) - return FALSE; - - if (strcmp (hdr->bfd_section->name, SH64_CRANGES_SECTION_NAME) == 0) - *flags |= SEC_DEBUGGING; - - return TRUE; -} - -static bfd_boolean -sh64_elf_copy_private_data (bfd * ibfd, bfd * obfd) -{ - if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour - || bfd_get_flavour (obfd) != bfd_target_elf_flavour) - return TRUE; - - BFD_ASSERT (!elf_flags_init (obfd) - || (elf_elfheader (obfd)->e_flags - == elf_elfheader (ibfd)->e_flags)); - - elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags; - - return _bfd_elf_copy_private_bfd_data (ibfd, obfd); -} - -static bfd_boolean -sh64_elf_merge_private_data (bfd *ibfd, struct bfd_link_info *info) -{ - bfd *obfd = info->output_bfd; - flagword old_flags, new_flags; - - if (! _bfd_generic_verify_endian_match (ibfd, info)) - return FALSE; - - if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour - || bfd_get_flavour (obfd) != bfd_target_elf_flavour) - return TRUE; - - if (bfd_get_arch_size (ibfd) != bfd_get_arch_size (obfd)) - { - const char *msg; - - if (bfd_get_arch_size (ibfd) == 32 - && bfd_get_arch_size (obfd) == 64) - /* xgettext:c-format */ - msg = _("%pB: compiled as 32-bit object and %pB is 64-bit"); - else if (bfd_get_arch_size (ibfd) == 64 - && bfd_get_arch_size (obfd) == 32) - /* xgettext:c-format */ - msg = _("%pB: compiled as 64-bit object and %pB is 32-bit"); - else - /* xgettext:c-format */ - msg = _("%pB: object size does not match that of target %pB"); - - _bfd_error_handler (msg, ibfd, obfd); - bfd_set_error (bfd_error_wrong_format); - return FALSE; - } - - old_flags = elf_elfheader (obfd)->e_flags; - new_flags = elf_elfheader (ibfd)->e_flags; - if (! elf_flags_init (obfd)) - { - /* This happens when ld starts out with a 'blank' output file. */ - elf_flags_init (obfd) = TRUE; - elf_elfheader (obfd)->e_flags = old_flags = new_flags; - } - /* We don't allow linking in non-SH64 code. */ - else if ((new_flags & EF_SH_MACH_MASK) != EF_SH5) - { - _bfd_error_handler - ("%pB: uses non-SH64 instructions while previous modules" - " use SH64 instructions", - ibfd); - bfd_set_error (bfd_error_bad_value); - return FALSE; - } - - /* I can't think of anything sane other than old_flags being EF_SH5 and - that we need to preserve that. */ - elf_elfheader (obfd)->e_flags = old_flags; - return sh64_elf_set_mach_from_flags (obfd); -} - -/* Handle a SH64-specific section when reading an object file. This - is called when bfd_section_from_shdr finds a section with an unknown - type. - - We only recognize SHT_SH5_CR_SORTED, on the .cranges section. */ - -bfd_boolean -sh64_backend_section_from_shdr (bfd *abfd, Elf_Internal_Shdr *hdr, - const char *name, int shindex) -{ - flagword flags = 0; - - /* We do like MIPS with a bit switch for recognized types, and returning - FALSE for a recognized section type with an unexpected name. Right - now we only have one recognized type, but that might change. */ - switch (hdr->sh_type) - { - case SHT_SH5_CR_SORTED: - if (strcmp (name, SH64_CRANGES_SECTION_NAME) != 0) - return FALSE; - - /* We set the SEC_SORT_ENTRIES flag so it can be passed on to - sh64_elf_fake_sections, keeping SHT_SH5_CR_SORTED if this object - passes through objcopy. Perhaps it is brittle; the flag can - suddenly be used by other BFD parts, but it seems not really used - anywhere at the moment. */ - flags = SEC_DEBUGGING | SEC_SORT_ENTRIES; - break; - - default: - return FALSE; - } - - if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex)) - return FALSE; - - if (flags - && ! bfd_set_section_flags (abfd, hdr->bfd_section, - bfd_get_section_flags (abfd, - hdr->bfd_section) - | flags)) - return FALSE; - - return TRUE; -} - -/* In contrast to sh64_backend_section_from_shdr, this is called for all - sections, but only when copying sections, not when linking or - assembling. We need to set up the sh64_elf_section_data (asection *) - structure for the SH64 ELF section flags to be copied correctly. */ - -bfd_boolean -sh64_bfd_elf_copy_private_section_data (bfd *ibfd, asection *isec, - bfd *obfd, asection *osec) -{ - struct sh64_section_data *sh64_sec_data; - - if (ibfd->xvec->flavour != bfd_target_elf_flavour - || obfd->xvec->flavour != bfd_target_elf_flavour) - return TRUE; - - if (! _bfd_elf_copy_private_section_data (ibfd, isec, obfd, osec)) - return FALSE; - - sh64_sec_data = sh64_elf_section_data (isec)->sh64_info; - if (sh64_sec_data == NULL) - { - sh64_sec_data = bfd_zmalloc (sizeof (struct sh64_section_data)); - - if (sh64_sec_data == NULL) - return FALSE; - - sh64_sec_data->contents_flags - = (elf_section_data (isec)->this_hdr.sh_flags - & (SHF_SH5_ISA32 | SHF_SH5_ISA32_MIXED)); - - sh64_elf_section_data (osec)->sh64_info = sh64_sec_data; - } - - return TRUE; -} - -/* Function to keep SH64 specific file flags. */ - -static bfd_boolean -sh64_elf_set_private_flags (bfd *abfd, flagword flags) -{ - BFD_ASSERT (! elf_flags_init (abfd) - || elf_elfheader (abfd)->e_flags == flags); - - elf_elfheader (abfd)->e_flags = flags; - elf_flags_init (abfd) = TRUE; - return sh64_elf_set_mach_from_flags (abfd); -} - -/* Called when writing out an object file to decide the type of a symbol. */ - -static int -sh64_elf_get_symbol_type (Elf_Internal_Sym *elf_sym, int type) -{ - if (ELF_ST_TYPE (elf_sym->st_info) == STT_DATALABEL) - return STT_DATALABEL; - - return type; -} - -/* Hook called by the linker routine which adds symbols from an object - file. We must make indirect symbols for undefined symbols marked with - STT_DATALABEL, so relocations passing them will pick up that attribute - and neutralize STO_SH5_ISA32 found on the symbol definition. - - There is a problem, though: We want to fill in the hash-table entry for - this symbol and signal to the caller that no further processing is - needed. But we don't have the index for this hash-table entry. We - rely here on that the current entry is the first hash-entry with NULL, - which seems brittle. Also, iterating over the hash-table to find that - entry is a linear operation on the number of symbols in this input - file, and this function should take constant time, so that's not good - too. Only comfort is that DataLabel references should only be found in - hand-written assembly code and thus be rare. FIXME: Talk maintainers - into adding an option to elf_add_symbol_hook (preferably) for the index - or the hash entry, alternatively adding the index to Elf_Internal_Sym - (not so good). */ - -static bfd_boolean -sh64_elf_add_symbol_hook (bfd *abfd, struct bfd_link_info *info, - Elf_Internal_Sym *sym, const char **namep, - flagword *flagsp ATTRIBUTE_UNUSED, - asection **secp, bfd_vma *valp) -{ - /* We want to do this for relocatable as well as final linking. */ - if (ELF_ST_TYPE (sym->st_info) == STT_DATALABEL - && is_elf_hash_table (info->hash)) - { - struct elf_link_hash_entry *h; - - /* For relocatable links, we register the DataLabel sym in its own - right, and tweak the name when it's output. Otherwise, we make - an indirect symbol of it. */ - flagword flags - = bfd_link_relocatable (info) || info->emitrelocations - ? BSF_GLOBAL : BSF_GLOBAL | BSF_INDIRECT; - - char *dl_name - = bfd_malloc (strlen (*namep) + sizeof (DATALABEL_SUFFIX)); - struct elf_link_hash_entry ** sym_hash = elf_sym_hashes (abfd); - - BFD_ASSERT (sym_hash != NULL); - - /* Allocation may fail. */ - if (dl_name == NULL) - return FALSE; - - strcpy (dl_name, *namep); - strcat (dl_name, DATALABEL_SUFFIX); - - h = (struct elf_link_hash_entry *) - bfd_link_hash_lookup (info->hash, dl_name, FALSE, FALSE, FALSE); - - if (h == NULL) - { - /* No previous datalabel symbol. Make one. */ - struct bfd_link_hash_entry *bh = NULL; - const struct elf_backend_data *bed = get_elf_backend_data (abfd); - - if (! _bfd_generic_link_add_one_symbol (info, abfd, dl_name, - flags, *secp, *valp, - *namep, FALSE, - bed->collect, &bh)) - { - free (dl_name); - return FALSE; - } - - h = (struct elf_link_hash_entry *) bh; - h->non_elf = 0; - h->type = STT_DATALABEL; - } - else - /* If a new symbol was created, it holds the allocated name. - Otherwise, we don't need it anymore and should deallocate it. */ - free (dl_name); - - if (h->type != STT_DATALABEL - || ((bfd_link_relocatable (info) || info->emitrelocations) - && h->root.type != bfd_link_hash_undefined) - || (! bfd_link_relocatable (info) && !info->emitrelocations - && h->root.type != bfd_link_hash_indirect)) - { - /* Make sure we don't get confused on invalid input. */ - _bfd_error_handler - (_("%pB: encountered datalabel symbol in input"), abfd); - bfd_set_error (bfd_error_bad_value); - return FALSE; - } - - /* Now find the hash-table slot for this entry and fill it in. */ - while (*sym_hash != NULL) - sym_hash++; - *sym_hash = h; - - /* Signal to caller to skip this symbol - we've handled it. */ - *namep = NULL; - } - - return TRUE; -} - -/* This hook function is called before the linker writes out a global - symbol. For relocatable links, DataLabel symbols will be present in - linker output. We cut off the special suffix on those symbols, so the - right name appears in the output. - - When linking and emitting relocations, there can appear global symbols - that are not referenced by relocs, but rather only implicitly through - DataLabel references, a relation that is not visible to the linker. - Since no stripping of global symbols in done when doing such linking, - we don't need to look up and make sure to emit the main symbol for each - DataLabel symbol. */ - -static int -sh64_elf_link_output_symbol_hook (struct bfd_link_info *info, - const char *cname, - Elf_Internal_Sym *sym, - asection *input_sec ATTRIBUTE_UNUSED, - struct elf_link_hash_entry *h ATTRIBUTE_UNUSED) -{ - char *name = (char *) cname; - - if (bfd_link_relocatable (info) || info->emitrelocations) - { - if (ELF_ST_TYPE (sym->st_info) == STT_DATALABEL) - name[strlen (name) - strlen (DATALABEL_SUFFIX)] = 0; - } - - return 1; -} - -/* Check a SH64-specific reloc and put the value to relocate to into - RELOCATION, ready to pass to _bfd_final_link_relocate. Return FALSE if - bad value, TRUE if ok. */ - -static bfd_boolean -shmedia_prepare_reloc (struct bfd_link_info *info, bfd *abfd, - asection *input_section, bfd_byte *contents, - const Elf_Internal_Rela *rel, bfd_vma *relocation) -{ - bfd_vma disp, dropped; - - switch (ELF32_R_TYPE (rel->r_info)) - { - case R_SH_PT_16: - /* Check the lowest bit of the destination field. If it is 1, we - check the ISA type of the destination (i.e. the low bit of the - "relocation" value, and emit an error if the instruction does not - match). If it is 0, we change a PTA to PTB. There should never - be a PTB that should change to a PTA; that indicates a toolchain - error; a mismatch with GAS. */ - { - char *msg = NULL; - bfd_vma insn = bfd_get_32 (abfd, contents + rel->r_offset); - - if (insn & (1 << 10)) - { - /* Check matching insn and ISA (address of target). */ - if ((insn & SHMEDIA_PTB_BIT) != 0 - && ((*relocation + rel->r_addend) & 1) != 0) - msg = _("PTB mismatch: a SHmedia address (bit 0 == 1)"); - else if ((insn & SHMEDIA_PTB_BIT) == 0 - && ((*relocation + rel->r_addend) & 1) == 0) - msg = _("PTA mismatch: a SHcompact address (bit 0 == 0)"); - - if (msg != NULL) - (*info->callbacks->reloc_dangerous) - (info, msg, abfd, input_section, rel->r_offset); - } - else - { - /* We shouldn't get here with a PTB insn and a R_SH_PT_16. It - means GAS output does not match expectations; a PTA or PTB - expressed as such (or a PT found at assembly to be PTB) - would match the test above, and PT expansion with an - unknown destination (or when relaxing) will get us here. */ - if ((insn & SHMEDIA_PTB_BIT) != 0) - { - _bfd_error_handler - (_("%pB: GAS error: unexpected PTB insn with R_SH_PT_16"), - input_section->owner); - return FALSE; - } - - /* Change the PTA to a PTB, if destination indicates so. */ - if (((*relocation + rel->r_addend) & 1) == 0) - bfd_put_32 (abfd, insn | SHMEDIA_PTB_BIT, - contents + rel->r_offset); - } - } - - case R_SH_SHMEDIA_CODE: - case R_SH_DIR5U: - case R_SH_DIR6S: - case R_SH_DIR6U: - case R_SH_DIR10S: - case R_SH_DIR10SW: - case R_SH_DIR10SL: - case R_SH_DIR10SQ: - case R_SH_IMMS16: - case R_SH_IMMU16: - case R_SH_IMM_LOW16: - case R_SH_IMM_LOW16_PCREL: - case R_SH_IMM_MEDLOW16: - case R_SH_IMM_MEDLOW16_PCREL: - case R_SH_IMM_MEDHI16: - case R_SH_IMM_MEDHI16_PCREL: - case R_SH_IMM_HI16: - case R_SH_IMM_HI16_PCREL: - case R_SH_64: - case R_SH_64_PCREL: - break; - - default: - return FALSE; - } - - disp = (*relocation & 0xf); - dropped = 0; - switch (ELF32_R_TYPE (rel->r_info)) - { - case R_SH_DIR10SW: dropped = disp & 1; break; - case R_SH_DIR10SL: dropped = disp & 3; break; - case R_SH_DIR10SQ: dropped = disp & 7; break; - } - if (dropped != 0) - { - _bfd_error_handler - /* xgettext:c-format */ - (_("%pB: error: unaligned relocation type %d " - "at %#" PRIx64 " reloc %#" PRIx64), - input_section->owner, (int) ELF32_R_TYPE (rel->r_info), - (uint64_t) rel->r_offset, (uint64_t) *relocation); - return FALSE; - } - - return TRUE; -} - -/* Helper function to locate the section holding a certain address. This - is called via bfd_map_over_sections. */ - -static void -sh64_find_section_for_address (bfd *abfd ATTRIBUTE_UNUSED, - asection *section, void *data) -{ - bfd_vma vma; - bfd_size_type size; - - struct sh64_find_section_vma_data *fsec_datap - = (struct sh64_find_section_vma_data *) data; - - /* Return if already found. */ - if (fsec_datap->section) - return; - - /* If this section isn't part of the addressable contents, skip it. */ - if ((bfd_get_section_flags (abfd, section) & SEC_ALLOC) == 0) - return; - - vma = bfd_get_section_vma (abfd, section); - if (fsec_datap->addr < vma) - return; - - size = section->size; - if (fsec_datap->addr >= vma + size) - return; - - fsec_datap->section = section; -} - -/* Make sure to write out the generated entries in the .cranges section - when doing partial linking, and set bit 0 on the entry address if it - points to SHmedia code and write sorted .cranges entries when writing - executables (final linking and objcopy). */ - -static void -sh64_elf_final_write_processing (bfd *abfd, - bfd_boolean linker ATTRIBUTE_UNUSED) -{ - bfd_vma ld_generated_cranges_size; - asection *cranges - = bfd_get_section_by_name (abfd, SH64_CRANGES_SECTION_NAME); - - /* If no new .cranges were added, the generic ELF linker parts will - write it all out. If not, we need to write them out when doing - partial linking. For a final link, we will sort them and write them - all out further below. */ - if (linker - && cranges != NULL - && elf_elfheader (abfd)->e_type != ET_EXEC - && (ld_generated_cranges_size - = sh64_elf_section_data (cranges)->sh64_info->cranges_growth) != 0) - { - bfd_vma incoming_cranges_size - = cranges->size - ld_generated_cranges_size; - - if (! bfd_set_section_contents (abfd, cranges, - cranges->contents - + incoming_cranges_size, - cranges->output_offset - + incoming_cranges_size, - ld_generated_cranges_size)) - { - bfd_set_error (bfd_error_file_truncated); - _bfd_error_handler - (_("%pB: could not write out added .cranges entries"), abfd); - } - } - - /* Only set entry address bit 0 and sort .cranges when linking to an - executable; never with objcopy or strip. */ - if (linker && elf_elfheader (abfd)->e_type == ET_EXEC) - { - struct sh64_find_section_vma_data fsec_data; - sh64_elf_crange dummy; - - /* For a final link, set the low bit of the entry address to - reflect whether or not it is a SHmedia address. - FIXME: Perhaps we shouldn't do this if the entry address was - supplied numerically, but we currently lack the infrastructure to - recognize that: The entry symbol, and info whether it is numeric - or a symbol name is kept private in the linker. */ - fsec_data.addr = elf_elfheader (abfd)->e_entry; - fsec_data.section = NULL; - - bfd_map_over_sections (abfd, sh64_find_section_for_address, - &fsec_data); - if (fsec_data.section - && (sh64_get_contents_type (fsec_data.section, - elf_elfheader (abfd)->e_entry, - &dummy) == CRT_SH5_ISA32)) - elf_elfheader (abfd)->e_entry |= 1; - - /* If we have a .cranges section, sort the entries. */ - if (cranges != NULL) - { - bfd_size_type cranges_size = cranges->size; - - /* We know we always have these in memory at this time. */ - BFD_ASSERT (cranges->contents != NULL); - - /* The .cranges may already have been sorted in the process of - finding out the ISA-type of the entry address. If not, we do - it here. */ - if (elf_section_data (cranges)->this_hdr.sh_type - != SHT_SH5_CR_SORTED) - { - qsort (cranges->contents, cranges_size / SH64_CRANGE_SIZE, - SH64_CRANGE_SIZE, - bfd_big_endian (cranges->owner) - ? _bfd_sh64_crange_qsort_cmpb - : _bfd_sh64_crange_qsort_cmpl); - elf_section_data (cranges)->this_hdr.sh_type - = SHT_SH5_CR_SORTED; - } - - /* We need to write it out in whole as sorted. */ - if (! bfd_set_section_contents (abfd, cranges, - cranges->contents, - cranges->output_offset, - cranges_size)) - { - bfd_set_error (bfd_error_file_truncated); - _bfd_error_handler - (_("%pB: could not write out sorted .cranges entries"), abfd); - } - } - } -} - -/* Merge non visibility st_other attribute when the symbol comes from - a dynamic object. */ -static void -sh64_elf_merge_symbol_attribute (struct elf_link_hash_entry *h, - const Elf_Internal_Sym *isym, - bfd_boolean definition, - bfd_boolean dynamic ATTRIBUTE_UNUSED) -{ - if ((isym->st_other & ~ELF_ST_VISIBILITY (-1)) != 0) - { - unsigned char other; - - /* Take the balance of OTHER from the definition. */ - other = (definition ? isym->st_other : h->other); - other &= ~ ELF_ST_VISIBILITY (-1); - h->other = other | ELF_ST_VISIBILITY (h->other); - } - - return; -} - -static const struct bfd_elf_special_section sh64_elf_special_sections[] = -{ - { STRING_COMMA_LEN (".cranges"), 0, SHT_PROGBITS, 0 }, - { NULL, 0, 0, 0, 0 } -}; - -#undef TARGET_BIG_SYM -#define TARGET_BIG_SYM sh64_elf32_vec -#undef TARGET_BIG_NAME -#define TARGET_BIG_NAME "elf32-sh64" -#undef TARGET_LITTLE_SYM -#define TARGET_LITTLE_SYM sh64_elf32_le_vec -#undef TARGET_LITTLE_NAME -#define TARGET_LITTLE_NAME "elf32-sh64l" - -#include "elf32-target.h" - -/* NetBSD support. */ -#undef TARGET_BIG_SYM -#define TARGET_BIG_SYM sh64_elf32_nbsd_vec -#undef TARGET_BIG_NAME -#define TARGET_BIG_NAME "elf32-sh64-nbsd" -#undef TARGET_LITTLE_SYM -#define TARGET_LITTLE_SYM sh64_elf32_nbsd_le_vec -#undef TARGET_LITTLE_NAME -#define TARGET_LITTLE_NAME "elf32-sh64l-nbsd" -#undef ELF_MAXPAGESIZE -#define ELF_MAXPAGESIZE 0x10000 -#undef ELF_COMMONPAGESIZE -#undef elf_symbol_leading_char -#define elf_symbol_leading_char 0 -#undef elf32_bed -#define elf32_bed elf32_sh64_nbsd_bed - -#include "elf32-target.h" - -/* Linux support. */ -#undef TARGET_BIG_SYM -#define TARGET_BIG_SYM sh64_elf32_linux_be_vec -#undef TARGET_BIG_NAME -#define TARGET_BIG_NAME "elf32-sh64big-linux" -#undef TARGET_LITTLE_SYM -#define TARGET_LITTLE_SYM sh64_elf32_linux_vec -#undef TARGET_LITTLE_NAME -#define TARGET_LITTLE_NAME "elf32-sh64-linux" -#undef elf32_bed -#define elf32_bed elf32_sh64_lin_bed -#undef ELF_COMMONPAGESIZE -#define ELF_COMMONPAGESIZE 0x1000 - -#include "elf32-target.h" - diff --git a/bfd/elf32-sh64.h b/bfd/elf32-sh64.h deleted file mode 100644 index 83065e7..0000000 --- a/bfd/elf32-sh64.h +++ /dev/null @@ -1,88 +0,0 @@ -/* SH ELF support for BFD. - Copyright (C) 2003-2018 Free Software Foundation, Inc. - - This file is part of BFD, the Binary File Descriptor library. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ - -#ifndef ELF32_SH64_H -#define ELF32_SH64_H - -#define SH64_CRANGES_SECTION_NAME ".cranges" -enum sh64_elf_cr_type { - CRT_NONE = 0, - CRT_DATA = 1, - CRT_SH5_ISA16 = 2, - CRT_SH5_ISA32 = 3 -}; - -/* The official definition is this: - - typedef struct { - Elf32_Addr cr_addr; - Elf32_Word cr_size; - Elf32_Half cr_type; - } Elf32_CRange; - - but we have no use for that exact type. Instead we use this struct for - the internal representation. */ -typedef struct { - bfd_vma cr_addr; - bfd_size_type cr_size; - enum sh64_elf_cr_type cr_type; -} sh64_elf_crange; - -#define SH64_CRANGE_SIZE (4 + 4 + 2) -#define SH64_CRANGE_CR_ADDR_OFFSET 0 -#define SH64_CRANGE_CR_SIZE_OFFSET 4 -#define SH64_CRANGE_CR_TYPE_OFFSET (4 + 4) - -/* Get the contents type of an arbitrary address, or return CRT_NONE. */ -extern enum sh64_elf_cr_type sh64_get_contents_type - (asection *, bfd_vma, sh64_elf_crange *); - -/* Simpler interface. - FIXME: This seems redundant now that we export the interface above. */ -extern bfd_boolean sh64_address_is_shmedia - (asection *, bfd_vma); - -extern int _bfd_sh64_crange_qsort_cmpb - (const void *, const void *); -extern int _bfd_sh64_crange_qsort_cmpl - (const void *, const void *); -extern int _bfd_sh64_crange_bsearch_cmpb - (const void *, const void *); -extern int _bfd_sh64_crange_bsearch_cmpl - (const void *, const void *); - -struct sh64_section_data -{ - flagword contents_flags; - - /* Only used in the cranges section, but we don't have an official - backend-specific bfd field. */ - bfd_size_type cranges_growth; -}; - -struct _sh64_elf_section_data -{ - struct bfd_elf_section_data elf; - struct sh64_section_data *sh64_info; -}; - -#define sh64_elf_section_data(sec) \ - ((struct _sh64_elf_section_data *) elf_section_data (sec)) - -#endif /* ELF32_SH64_H */ diff --git a/bfd/elf64-sh64.c b/bfd/elf64-sh64.c deleted file mode 100644 index b771759..0000000 --- a/bfd/elf64-sh64.c +++ /dev/null @@ -1,3987 +0,0 @@ -/* SuperH SH64-specific support for 64-bit ELF - Copyright (C) 2000-2018 Free Software Foundation, Inc. - - This file is part of BFD, the Binary File Descriptor library. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, - MA 02110-1301, USA. */ - -#define SH64_ELF64 - -#include "sysdep.h" -#include "bfd.h" -#include "bfdlink.h" -#include "libbfd.h" -#include "elf-bfd.h" -#include "elf/sh.h" - -/* Add a suffix for datalabel indirection symbols. It must not match any - other symbols; user symbols with or without version or other - decoration. It must only be used internally and not emitted by any - means. */ -#define DATALABEL_SUFFIX " DL" - -#define GOT_BIAS (-((long)-32768)) - -#define PLT_ENTRY_SIZE 64 - -/* Return size of a PLT entry. */ -#define elf_sh64_sizeof_plt(info) PLT_ENTRY_SIZE - -/* Return offset of the PLT0 address in an absolute PLT entry. */ -#define elf_sh64_plt_plt0_offset(info) 32 - -/* Return offset of the linker in PLT0 entry. */ -#define elf_sh64_plt0_gotplt_offset(info) 0 - -/* Return offset of the trampoline in PLT entry */ -#define elf_sh64_plt_temp_offset(info) 33 /* Add one because it's SHmedia. */ - -/* Return offset of the symbol in PLT entry. */ -#define elf_sh64_plt_symbol_offset(info) 0 - -/* Return offset of the relocation in PLT entry. */ -#define elf_sh64_plt_reloc_offset(info) (bfd_link_pic (info) ? 52 : 44) - -#define ELF_DYNAMIC_INTERPRETER "/usr/lib/libc.so.1" - -/* The sh linker needs to keep track of the number of relocs that it - decides to copy in check_relocs for each symbol. This is so that - it can discard PC relative relocs if it doesn't need them when - linking with -Bsymbolic. We store the information in a field - extending the regular ELF linker hash table. */ - -/* This structure keeps track of the number of PC relative relocs we - have copied for a given symbol. */ - -struct elf_sh64_pcrel_relocs_copied -{ - /* Next section. */ - struct elf_sh64_pcrel_relocs_copied *next; - /* A section in dynobj. */ - asection *section; - /* Number of relocs copied in this section. */ - bfd_size_type count; -}; - -/* sh ELF linker hash entry. */ - -struct elf_sh64_link_hash_entry -{ - struct elf_link_hash_entry root; - - bfd_vma datalabel_got_offset; - - /* Number of PC relative relocs copied for this symbol. */ - struct elf_sh64_pcrel_relocs_copied *pcrel_relocs_copied; -}; - -/* Traverse an sh ELF linker hash table. */ - -#define sh64_elf64_link_hash_traverse(table, func, info) \ - (elf_link_hash_traverse \ - ((table), \ - (bfd_boolean (*) (struct elf_link_hash_entry *, void *)) (func), \ - (info))) - -static bfd_reloc_status_type sh_elf64_ignore_reloc - (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); -static bfd_reloc_status_type sh_elf64_reloc - (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **); - -static reloc_howto_type sh_elf64_howto_table[] = { - /* No relocation. */ - HOWTO (R_SH_NONE, /* type */ - 0, /* rightshift */ - 3, /* size (0 = byte, 1 = short, 2 = long) */ - 0, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - sh_elf64_ignore_reloc, /* special_function */ - "R_SH_NONE", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* 32 bit absolute relocation. Setting partial_inplace to TRUE and - src_mask to a non-zero value is similar to the COFF toolchain. */ - HOWTO (R_SH_DIR32, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ - sh_elf64_reloc, /* special_function */ - "R_SH_DIR32", /* name */ - TRUE, /* partial_inplace */ - 0xffffffff, /* src_mask */ - 0xffffffff, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* 32 bit PC relative relocation. */ - HOWTO (R_SH_REL32, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - TRUE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - sh_elf64_ignore_reloc, /* special_function */ - "R_SH_REL32", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0xffffffff, /* dst_mask */ - TRUE), /* pcrel_offset */ - - /* For 32-bit sh, this is R_SH_DIR8WPN. */ - EMPTY_HOWTO (3), - - /* For 32-bit sh, this is R_SH_IND12W. */ - EMPTY_HOWTO (4), - - /* For 32-bit sh, this is R_SH_DIR8WPL. */ - EMPTY_HOWTO (5), - - /* For 32-bit sh, this is R_SH_DIR8WPZ. */ - EMPTY_HOWTO (6), - - /* For 32-bit sh, this is R_SH_DIR8BP. */ - EMPTY_HOWTO (7), - - /* For 32-bit sh, this is R_SH_DIR8W. */ - EMPTY_HOWTO (8), - - /* For 32-bit sh, this is R_SH_DIR8L. */ - EMPTY_HOWTO (9), - - EMPTY_HOWTO (10), - EMPTY_HOWTO (11), - EMPTY_HOWTO (12), - EMPTY_HOWTO (13), - EMPTY_HOWTO (14), - EMPTY_HOWTO (15), - EMPTY_HOWTO (16), - EMPTY_HOWTO (17), - EMPTY_HOWTO (18), - EMPTY_HOWTO (19), - EMPTY_HOWTO (20), - EMPTY_HOWTO (21), - EMPTY_HOWTO (22), - EMPTY_HOWTO (23), - EMPTY_HOWTO (24), - - /* The remaining relocs are a GNU extension used for relaxing. The - final pass of the linker never needs to do anything with any of - these relocs. Any required operations are handled by the - relaxation code. */ - - /* A 16 bit switch table entry. This is generated for an expression - such as ``.word L1 - L2''. The offset holds the difference - between the reloc address and L2. */ - HOWTO (R_SH_SWITCH16, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_unsigned, /* complain_on_overflow */ - sh_elf64_ignore_reloc, /* special_function */ - "R_SH_SWITCH16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - TRUE), /* pcrel_offset */ - - /* A 32 bit switch table entry. This is generated for an expression - such as ``.long L1 - L2''. The offset holds the difference - between the reloc address and L2. */ - HOWTO (R_SH_SWITCH32, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_unsigned, /* complain_on_overflow */ - sh_elf64_ignore_reloc, /* special_function */ - "R_SH_SWITCH32", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - TRUE), /* pcrel_offset */ - - /* For 32-bit sh, this is R_SH_USES. */ - EMPTY_HOWTO (27), - - /* For 32-bit sh, this is R_SH_COUNT. */ - EMPTY_HOWTO (28), - - /* For 32-bit sh, this is R_SH_ALIGN. FIXME: For linker relaxation, - this might be emitted. When linker relaxation is implemented, we - might want to use it. */ - EMPTY_HOWTO (29), - - /* For 32-bit sh, this is R_SH_CODE. FIXME: For linker relaxation, - this might be emitted. When linker relaxation is implemented, we - might want to use it. */ - EMPTY_HOWTO (30), - - /* For 32-bit sh, this is R_SH_DATA. FIXME: For linker relaxation, - this might be emitted. When linker relaxation is implemented, we - might want to use it. */ - EMPTY_HOWTO (31), - - /* For 32-bit sh, this is R_SH_LABEL. FIXME: For linker relaxation, - this might be emitted. When linker relaxation is implemented, we - might want to use it. */ - EMPTY_HOWTO (32), - - /* An 8 bit switch table entry. This is generated for an expression - such as ``.word L1 - L2''. The offset holds the difference - between the reloc address and L2. */ - HOWTO (R_SH_SWITCH8, /* type */ - 0, /* rightshift */ - 0, /* size (0 = byte, 1 = short, 2 = long) */ - 8, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_unsigned, /* complain_on_overflow */ - sh_elf64_ignore_reloc, /* special_function */ - "R_SH_SWITCH8", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - TRUE), /* pcrel_offset */ - - /* GNU extension to record C++ vtable hierarchy */ - HOWTO (R_SH_GNU_VTINHERIT, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 0, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - NULL, /* special_function */ - "R_SH_GNU_VTINHERIT", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* GNU extension to record C++ vtable member usage */ - HOWTO (R_SH_GNU_VTENTRY, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 0, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - _bfd_elf_rel_vtable_reloc_fn, /* special_function */ - "R_SH_GNU_VTENTRY", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* For 32-bit sh, this is R_SH_LOOP_START. */ - EMPTY_HOWTO (36), - - /* For 32-bit sh, this is R_SH_LOOP_END. */ - EMPTY_HOWTO (37), - - EMPTY_HOWTO (38), - EMPTY_HOWTO (39), - EMPTY_HOWTO (40), - EMPTY_HOWTO (41), - EMPTY_HOWTO (42), - EMPTY_HOWTO (43), - EMPTY_HOWTO (44), - - /* Used in SHLLI.L and SHLRI.L. */ - HOWTO (R_SH_DIR5U, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 5, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_unsigned, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_DIR5U", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0xfc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in SHARI, SHLLI et al. */ - HOWTO (R_SH_DIR6U, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 6, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_unsigned, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_DIR6U", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0xfc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in BxxI, LDHI.L et al. */ - HOWTO (R_SH_DIR6S, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 6, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_DIR6S", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0xfc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in ADDI, ANDI et al. */ - HOWTO (R_SH_DIR10S, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 10, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_DIR10S", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0xffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in LD.UW, ST.W et al. */ - HOWTO (R_SH_DIR10SW, /* type */ - 1, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 11, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_DIR10SW", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0xffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in LD.L, FLD.S et al. */ - HOWTO (R_SH_DIR10SL, /* type */ - 2, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 12, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_DIR10SL", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0xffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in FLD.D, FST.P et al. */ - HOWTO (R_SH_DIR10SQ, /* type */ - 3, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 13, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_DIR10SQ", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0xffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - EMPTY_HOWTO (52), - EMPTY_HOWTO (53), - EMPTY_HOWTO (54), - EMPTY_HOWTO (55), - EMPTY_HOWTO (56), - EMPTY_HOWTO (57), - EMPTY_HOWTO (58), - EMPTY_HOWTO (59), - EMPTY_HOWTO (60), - EMPTY_HOWTO (61), - EMPTY_HOWTO (62), - EMPTY_HOWTO (63), - EMPTY_HOWTO (64), - EMPTY_HOWTO (65), - EMPTY_HOWTO (66), - EMPTY_HOWTO (67), - EMPTY_HOWTO (68), - EMPTY_HOWTO (69), - EMPTY_HOWTO (70), - EMPTY_HOWTO (71), - EMPTY_HOWTO (72), - EMPTY_HOWTO (73), - EMPTY_HOWTO (74), - EMPTY_HOWTO (75), - EMPTY_HOWTO (76), - EMPTY_HOWTO (77), - EMPTY_HOWTO (78), - EMPTY_HOWTO (79), - EMPTY_HOWTO (80), - EMPTY_HOWTO (81), - EMPTY_HOWTO (82), - EMPTY_HOWTO (83), - EMPTY_HOWTO (84), - EMPTY_HOWTO (85), - EMPTY_HOWTO (86), - EMPTY_HOWTO (87), - EMPTY_HOWTO (88), - EMPTY_HOWTO (89), - EMPTY_HOWTO (90), - EMPTY_HOWTO (91), - EMPTY_HOWTO (92), - EMPTY_HOWTO (93), - EMPTY_HOWTO (94), - EMPTY_HOWTO (95), - EMPTY_HOWTO (96), - EMPTY_HOWTO (97), - EMPTY_HOWTO (98), - EMPTY_HOWTO (99), - EMPTY_HOWTO (100), - EMPTY_HOWTO (101), - EMPTY_HOWTO (102), - EMPTY_HOWTO (103), - EMPTY_HOWTO (104), - EMPTY_HOWTO (105), - EMPTY_HOWTO (106), - EMPTY_HOWTO (107), - EMPTY_HOWTO (108), - EMPTY_HOWTO (109), - EMPTY_HOWTO (110), - EMPTY_HOWTO (111), - EMPTY_HOWTO (112), - EMPTY_HOWTO (113), - EMPTY_HOWTO (114), - EMPTY_HOWTO (115), - EMPTY_HOWTO (116), - EMPTY_HOWTO (117), - EMPTY_HOWTO (118), - EMPTY_HOWTO (119), - EMPTY_HOWTO (120), - EMPTY_HOWTO (121), - EMPTY_HOWTO (122), - EMPTY_HOWTO (123), - EMPTY_HOWTO (124), - EMPTY_HOWTO (125), - EMPTY_HOWTO (126), - EMPTY_HOWTO (127), - EMPTY_HOWTO (128), - EMPTY_HOWTO (129), - EMPTY_HOWTO (130), - EMPTY_HOWTO (131), - EMPTY_HOWTO (132), - EMPTY_HOWTO (133), - EMPTY_HOWTO (134), - EMPTY_HOWTO (135), - EMPTY_HOWTO (136), - EMPTY_HOWTO (137), - EMPTY_HOWTO (138), - EMPTY_HOWTO (139), - EMPTY_HOWTO (140), - EMPTY_HOWTO (141), - EMPTY_HOWTO (142), - EMPTY_HOWTO (143), - EMPTY_HOWTO (144), - EMPTY_HOWTO (145), - EMPTY_HOWTO (146), - EMPTY_HOWTO (147), - EMPTY_HOWTO (148), - EMPTY_HOWTO (149), - EMPTY_HOWTO (150), - EMPTY_HOWTO (151), - EMPTY_HOWTO (152), - EMPTY_HOWTO (153), - EMPTY_HOWTO (154), - EMPTY_HOWTO (155), - EMPTY_HOWTO (156), - EMPTY_HOWTO (157), - EMPTY_HOWTO (158), - EMPTY_HOWTO (159), - - /* Relocs for dynamic linking for 32-bit SH would follow. We don't have - any dynamic linking support for 64-bit SH at present. */ - - EMPTY_HOWTO (160), - EMPTY_HOWTO (161), - EMPTY_HOWTO (162), - EMPTY_HOWTO (163), - EMPTY_HOWTO (164), - EMPTY_HOWTO (165), - EMPTY_HOWTO (166), - EMPTY_HOWTO (167), - EMPTY_HOWTO (168), - - /* Back to SH5 relocations. */ - /* Used in MOVI and SHORI (x & 65536). */ - HOWTO (R_SH_GOT_LOW16, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOT_LOW16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 16) & 65536). */ - HOWTO (R_SH_GOT_MEDLOW16, /* type */ - 16, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOT_MEDLOW16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 32) & 65536). */ - HOWTO (R_SH_GOT_MEDHI16, /* type */ - 32, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOT_MEDHI16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 48) & 65536). */ - HOWTO (R_SH_GOT_HI16, /* type */ - 48, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOT_HI16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in MOVI and SHORI (x & 65536). */ - HOWTO (R_SH_GOTPLT_LOW16, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOTPLT_LOW16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 16) & 65536). */ - HOWTO (R_SH_GOTPLT_MEDLOW16, /* type */ - 16, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOTPLT_MEDLOW16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 32) & 65536). */ - HOWTO (R_SH_GOTPLT_MEDHI16, /* type */ - 32, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOTPLT_MEDHI16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 48) & 65536). */ - HOWTO (R_SH_GOTPLT_HI16, /* type */ - 48, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOTPLT_HI16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in MOVI and SHORI (x & 65536). */ - HOWTO (R_SH_PLT_LOW16, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - TRUE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_PLT_LOW16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - TRUE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 16) & 65536). */ - HOWTO (R_SH_PLT_MEDLOW16, /* type */ - 16, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - TRUE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_PLT_MEDLOW16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - TRUE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 32) & 65536). */ - HOWTO (R_SH_PLT_MEDHI16, /* type */ - 32, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - TRUE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_PLT_MEDHI16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - TRUE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 48) & 65536). */ - HOWTO (R_SH_PLT_HI16, /* type */ - 48, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - TRUE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_PLT_HI16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - TRUE), /* pcrel_offset */ - - /* Used in MOVI and SHORI (x & 65536). */ - HOWTO (R_SH_GOTOFF_LOW16, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOTOFF_LOW16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 16) & 65536). */ - HOWTO (R_SH_GOTOFF_MEDLOW16, /* type */ - 16, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOTOFF_MEDLOW16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 32) & 65536). */ - HOWTO (R_SH_GOTOFF_MEDHI16, /* type */ - 32, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOTOFF_MEDHI16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 48) & 65536). */ - HOWTO (R_SH_GOTOFF_HI16, /* type */ - 48, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOTOFF_HI16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in MOVI and SHORI (x & 65536). */ - HOWTO (R_SH_GOTPC_LOW16, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - TRUE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOTPC_LOW16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - TRUE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 16) & 65536). */ - HOWTO (R_SH_GOTPC_MEDLOW16, /* type */ - 16, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - TRUE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOTPC_MEDLOW16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - TRUE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 32) & 65536). */ - HOWTO (R_SH_GOTPC_MEDHI16, /* type */ - 32, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - TRUE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOTPC_MEDHI16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - TRUE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 48) & 65536). */ - HOWTO (R_SH_GOTPC_HI16, /* type */ - 48, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - TRUE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOTPC_HI16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - TRUE), /* pcrel_offset */ - - /* Used in LD.L, FLD.S et al. */ - HOWTO (R_SH_GOT10BY4, /* type */ - 2, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 12, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOT10BY4", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0xffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in LD.L, FLD.S et al. */ - HOWTO (R_SH_GOTPLT10BY4, /* type */ - 2, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 12, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOTPLT10BY4", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0xffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in FLD.D, FST.P et al. */ - HOWTO (R_SH_GOT10BY8, /* type */ - 3, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 13, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOT10BY8", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0xffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in FLD.D, FST.P et al. */ - HOWTO (R_SH_GOTPLT10BY8, /* type */ - 3, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 13, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GOTPLT10BY8", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0xffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - HOWTO (R_SH_COPY64, /* type */ - 0, /* rightshift */ - 4, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_COPY64", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - ((bfd_vma) 0) - 1, /* dst_mask */ - FALSE), /* pcrel_offset */ - - HOWTO (R_SH_GLOB_DAT64, /* type */ - 0, /* rightshift */ - 4, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_GLOB_DAT64", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - ((bfd_vma) 0) - 1, /* dst_mask */ - FALSE), /* pcrel_offset */ - - HOWTO (R_SH_JMP_SLOT64, /* type */ - 0, /* rightshift */ - 4, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_JMP_SLOT64", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - ((bfd_vma) 0) - 1, /* dst_mask */ - FALSE), /* pcrel_offset */ - - HOWTO (R_SH_RELATIVE64, /* type */ - 0, /* rightshift */ - 4, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_RELATIVE64", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - ((bfd_vma) 0) - 1, /* dst_mask */ - FALSE), /* pcrel_offset */ - - EMPTY_HOWTO (197), - EMPTY_HOWTO (198), - EMPTY_HOWTO (199), - EMPTY_HOWTO (200), - EMPTY_HOWTO (201), - EMPTY_HOWTO (202), - EMPTY_HOWTO (203), - EMPTY_HOWTO (204), - EMPTY_HOWTO (205), - EMPTY_HOWTO (206), - EMPTY_HOWTO (207), - EMPTY_HOWTO (208), - EMPTY_HOWTO (209), - EMPTY_HOWTO (210), - EMPTY_HOWTO (211), - EMPTY_HOWTO (212), - EMPTY_HOWTO (213), - EMPTY_HOWTO (214), - EMPTY_HOWTO (215), - EMPTY_HOWTO (216), - EMPTY_HOWTO (217), - EMPTY_HOWTO (218), - EMPTY_HOWTO (219), - EMPTY_HOWTO (220), - EMPTY_HOWTO (221), - EMPTY_HOWTO (222), - EMPTY_HOWTO (223), - EMPTY_HOWTO (224), - EMPTY_HOWTO (225), - EMPTY_HOWTO (226), - EMPTY_HOWTO (227), - EMPTY_HOWTO (228), - EMPTY_HOWTO (229), - EMPTY_HOWTO (230), - EMPTY_HOWTO (231), - EMPTY_HOWTO (232), - EMPTY_HOWTO (233), - EMPTY_HOWTO (234), - EMPTY_HOWTO (235), - EMPTY_HOWTO (236), - EMPTY_HOWTO (237), - EMPTY_HOWTO (238), - EMPTY_HOWTO (239), - EMPTY_HOWTO (240), - EMPTY_HOWTO (241), - - /* Relocations for SHmedia code. None of these are partial_inplace or - use the field being relocated. */ - - /* The assembler will generate this reloc before a block of SHmedia - instructions. A section should be processed as assuming it contains - data, unless this reloc is seen. Note that a block of SHcompact - instructions are instead preceded by R_SH_CODE. - This is currently not implemented, but should be used for SHmedia - linker relaxation. */ - HOWTO (R_SH_SHMEDIA_CODE, /* type */ - 0, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ - 0, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_unsigned, /* complain_on_overflow */ - sh_elf64_ignore_reloc, /* special_function */ - "R_SH_SHMEDIA_CODE", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* The assembler will generate this reloc at a PTA or PTB instruction, - and the linker checks the right type of target, or changes a PTA to a - PTB, if the original insn was PT. */ - HOWTO (R_SH_PT_16, /* type */ - 2, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 18, /* bitsize */ - TRUE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_PT_16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - TRUE), /* pcrel_offset */ - - /* Used in unexpanded MOVI. */ - HOWTO (R_SH_IMMS16, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_signed, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_IMMS16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in SHORI. */ - HOWTO (R_SH_IMMU16, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 16, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_unsigned, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_IMMU16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in MOVI and SHORI (x & 65536). */ - HOWTO (R_SH_IMM_LOW16, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_IMM_LOW16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x - $) & 65536). */ - HOWTO (R_SH_IMM_LOW16_PCREL, /* type */ - 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - TRUE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_IMM_LOW16_PCREL", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - TRUE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 16) & 65536). */ - HOWTO (R_SH_IMM_MEDLOW16, /* type */ - 16, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_IMM_MEDLOW16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in MOVI and SHORI (((x - $) >> 16) & 65536). */ - HOWTO (R_SH_IMM_MEDLOW16_PCREL, /* type */ - 16, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - TRUE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_IMM_MEDLOW16_PCREL", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - TRUE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 32) & 65536). */ - HOWTO (R_SH_IMM_MEDHI16, /* type */ - 32, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_IMM_MEDHI16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in MOVI and SHORI (((x - $) >> 32) & 65536). */ - HOWTO (R_SH_IMM_MEDHI16_PCREL, /* type */ - 32, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - TRUE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_IMM_MEDHI16_PCREL", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - TRUE), /* pcrel_offset */ - - /* Used in MOVI and SHORI ((x >> 48) & 65536). */ - HOWTO (R_SH_IMM_HI16, /* type */ - 48, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_IMM_HI16", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* Used in MOVI and SHORI (((x - $) >> 48) & 65536). */ - HOWTO (R_SH_IMM_HI16_PCREL, /* type */ - 48, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - TRUE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_IMM_HI16_PCREL", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0x3fffc00, /* dst_mask */ - TRUE), /* pcrel_offset */ - - /* For the .uaquad pseudo. */ - HOWTO (R_SH_64, /* type */ - 0, /* rightshift */ - 4, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - FALSE, /* pc_relative */ - 0, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_64", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - ((bfd_vma) 0) - 1, /* dst_mask */ - FALSE), /* pcrel_offset */ - - /* For the .uaquad pseudo, (x - $). */ - HOWTO (R_SH_64_PCREL, /* type */ - 48, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 64, /* bitsize */ - TRUE, /* pc_relative */ - 10, /* bitpos */ - complain_overflow_dont, /* complain_on_overflow */ - bfd_elf_generic_reloc, /* special_function */ - "R_SH_64_PCREL", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - ((bfd_vma) 0) - 1, /* dst_mask */ - TRUE), /* pcrel_offset */ - -}; - -/* This function is used for relocs which are only used for relaxing, - which the linker should otherwise ignore. */ - -static bfd_reloc_status_type -sh_elf64_ignore_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry, - asymbol *symbol ATTRIBUTE_UNUSED, - void *data ATTRIBUTE_UNUSED, asection *input_section, - bfd *output_bfd, - char **error_message ATTRIBUTE_UNUSED) -{ - if (output_bfd != NULL) - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; -} - -/* This function is used for normal relocs. This used to be like the COFF - function, and is almost certainly incorrect for other ELF targets. - - See sh_elf_reloc in elf32-sh.c for the original. */ - -static bfd_reloc_status_type -sh_elf64_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol_in, - void *data, asection *input_section, bfd *output_bfd, - char **error_message ATTRIBUTE_UNUSED) -{ - unsigned long insn; - bfd_vma sym_value; - enum elf_sh_reloc_type r_type; - bfd_vma addr = reloc_entry->address; - bfd_byte *hit_data = addr + (bfd_byte *) data; - - r_type = (enum elf_sh_reloc_type) reloc_entry->howto->type; - - if (output_bfd != NULL) - { - /* Partial linking--do nothing. */ - reloc_entry->address += input_section->output_offset; - return bfd_reloc_ok; - } - - if (symbol_in != NULL - && bfd_is_und_section (symbol_in->section)) - return bfd_reloc_undefined; - - if (bfd_is_com_section (symbol_in->section)) - sym_value = 0; - else - sym_value = (symbol_in->value + - symbol_in->section->output_section->vma + - symbol_in->section->output_offset); - - switch (r_type) - { - case R_SH_DIR32: - insn = bfd_get_32 (abfd, hit_data); - insn += sym_value + reloc_entry->addend; - bfd_put_32 (abfd, insn, hit_data); - break; - - default: - abort (); - break; - } - - return bfd_reloc_ok; -} - -/* This structure is used to map BFD reloc codes to SH ELF relocs. */ - -struct elf_reloc_map -{ - bfd_reloc_code_real_type bfd_reloc_val; - unsigned char elf_reloc_val; -}; - -/* An array mapping BFD reloc codes to SH ELF relocs. */ - -static const struct elf_reloc_map sh64_reloc_map[] = -{ - { BFD_RELOC_NONE, R_SH_NONE }, - { BFD_RELOC_32, R_SH_DIR32 }, - { BFD_RELOC_CTOR, R_SH_DIR32 }, - { BFD_RELOC_32_PCREL, R_SH_REL32 }, - { BFD_RELOC_8_PCREL, R_SH_SWITCH8 }, - { BFD_RELOC_SH_SWITCH16, R_SH_SWITCH16 }, - { BFD_RELOC_SH_SWITCH32, R_SH_SWITCH32 }, - { BFD_RELOC_VTABLE_INHERIT, R_SH_GNU_VTINHERIT }, - { BFD_RELOC_VTABLE_ENTRY, R_SH_GNU_VTENTRY }, - { BFD_RELOC_SH_GOT_LOW16, R_SH_GOT_LOW16 }, - { BFD_RELOC_SH_GOT_MEDLOW16, R_SH_GOT_MEDLOW16 }, - { BFD_RELOC_SH_GOT_MEDHI16, R_SH_GOT_MEDHI16 }, - { BFD_RELOC_SH_GOT_HI16, R_SH_GOT_HI16 }, - { BFD_RELOC_SH_GOTPLT_LOW16, R_SH_GOTPLT_LOW16 }, - { BFD_RELOC_SH_GOTPLT_MEDLOW16, R_SH_GOTPLT_MEDLOW16 }, - { BFD_RELOC_SH_GOTPLT_MEDHI16, R_SH_GOTPLT_MEDHI16 }, - { BFD_RELOC_SH_GOTPLT_HI16, R_SH_GOTPLT_HI16 }, - { BFD_RELOC_SH_PLT_LOW16, R_SH_PLT_LOW16 }, - { BFD_RELOC_SH_PLT_MEDLOW16, R_SH_PLT_MEDLOW16 }, - { BFD_RELOC_SH_PLT_MEDHI16, R_SH_PLT_MEDHI16 }, - { BFD_RELOC_SH_PLT_HI16, R_SH_PLT_HI16 }, - { BFD_RELOC_SH_GOTOFF_LOW16, R_SH_GOTOFF_LOW16 }, - { BFD_RELOC_SH_GOTOFF_MEDLOW16, R_SH_GOTOFF_MEDLOW16 }, - { BFD_RELOC_SH_GOTOFF_MEDHI16, R_SH_GOTOFF_MEDHI16 }, - { BFD_RELOC_SH_GOTOFF_HI16, R_SH_GOTOFF_HI16 }, - { BFD_RELOC_SH_GOTPC_LOW16, R_SH_GOTPC_LOW16 }, - { BFD_RELOC_SH_GOTPC_MEDLOW16, R_SH_GOTPC_MEDLOW16 }, - { BFD_RELOC_SH_GOTPC_MEDHI16, R_SH_GOTPC_MEDHI16 }, - { BFD_RELOC_SH_GOTPC_HI16, R_SH_GOTPC_HI16 }, - { BFD_RELOC_SH_COPY64, R_SH_COPY64 }, - { BFD_RELOC_SH_GLOB_DAT64, R_SH_GLOB_DAT64 }, - { BFD_RELOC_SH_JMP_SLOT64, R_SH_JMP_SLOT64 }, - { BFD_RELOC_SH_RELATIVE64, R_SH_RELATIVE64 }, - { BFD_RELOC_SH_GOT10BY4, R_SH_GOT10BY4 }, - { BFD_RELOC_SH_GOT10BY8, R_SH_GOT10BY8 }, - { BFD_RELOC_SH_GOTPLT10BY4, R_SH_GOTPLT10BY4 }, - { BFD_RELOC_SH_GOTPLT10BY8, R_SH_GOTPLT10BY8 }, - { BFD_RELOC_SH_PT_16, R_SH_PT_16 }, - { BFD_RELOC_SH_SHMEDIA_CODE, R_SH_SHMEDIA_CODE }, - { BFD_RELOC_SH_IMMU5, R_SH_DIR5U }, - { BFD_RELOC_SH_IMMS6, R_SH_DIR6S }, - { BFD_RELOC_SH_IMMU6, R_SH_DIR6U }, - { BFD_RELOC_SH_IMMS10, R_SH_DIR10S }, - { BFD_RELOC_SH_IMMS10BY2, R_SH_DIR10SW }, - { BFD_RELOC_SH_IMMS10BY4, R_SH_DIR10SL }, - { BFD_RELOC_SH_IMMS10BY8, R_SH_DIR10SQ }, - { BFD_RELOC_SH_IMMS16, R_SH_IMMS16 }, - { BFD_RELOC_SH_IMMU16, R_SH_IMMU16 }, - { BFD_RELOC_SH_IMM_LOW16, R_SH_IMM_LOW16 }, - { BFD_RELOC_SH_IMM_LOW16_PCREL, R_SH_IMM_LOW16_PCREL }, - { BFD_RELOC_SH_IMM_MEDLOW16, R_SH_IMM_MEDLOW16 }, - { BFD_RELOC_SH_IMM_MEDLOW16_PCREL, R_SH_IMM_MEDLOW16_PCREL }, - { BFD_RELOC_SH_IMM_MEDHI16, R_SH_IMM_MEDHI16 }, - { BFD_RELOC_SH_IMM_MEDHI16_PCREL, R_SH_IMM_MEDHI16_PCREL }, - { BFD_RELOC_SH_IMM_HI16, R_SH_IMM_HI16 }, - { BFD_RELOC_SH_IMM_HI16_PCREL, R_SH_IMM_HI16_PCREL }, - { BFD_RELOC_64, R_SH_64 }, - { BFD_RELOC_64_PCREL, R_SH_64_PCREL }, -}; - -/* Given a BFD reloc code, return the howto structure for the - corresponding SH ELf reloc. */ - -static reloc_howto_type * -sh_elf64_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, - bfd_reloc_code_real_type code) -{ - unsigned int i; - - for (i = 0; i < sizeof (sh64_reloc_map) / sizeof (struct elf_reloc_map); i++) - { - if (sh64_reloc_map[i].bfd_reloc_val == code) - return &sh_elf64_howto_table[(int) sh64_reloc_map[i].elf_reloc_val]; - } - - return NULL; -} - -static reloc_howto_type * -sh_elf64_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, - const char *r_name) -{ - unsigned int i; - - for (i = 0; - i < sizeof (sh_elf64_howto_table) / sizeof (sh_elf64_howto_table[0]); - i++) - if (sh_elf64_howto_table[i].name != NULL - && strcasecmp (sh_elf64_howto_table[i].name, r_name) == 0) - return &sh_elf64_howto_table[i]; - - return NULL; -} - -/* Given an ELF reloc, fill in the howto field of a relent. - - See sh_elf_info_to_howto in elf32-sh.c for the original. */ - -static bfd_boolean -sh_elf64_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr, - Elf_Internal_Rela *dst) -{ - unsigned int r; - - r = ELF64_R_TYPE (dst->r_info); - - if (r > (unsigned int) R_SH_64_PCREL) - { - /* xgettext:c-format */ - _bfd_error_handler (_("%pB: unsupported relocation type %#x"), abfd, r); - bfd_set_error (bfd_error_bad_value); - return FALSE; - } - - BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC || r > R_SH_LAST_INVALID_RELOC); - BFD_ASSERT (r < R_SH_DIR8WPN || r > R_SH_LAST_INVALID_RELOC_2); - BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_3 || r > R_SH_GOTPLT32); - BFD_ASSERT (r < R_SH_FIRST_INVALID_RELOC_4 || r > R_SH_LAST_INVALID_RELOC_4); - - cache_ptr->howto = &sh_elf64_howto_table[r]; - return cache_ptr->howto != NULL; -} - -/* Relocate an SH ELF section. - - See sh_elf_info_to_howto in elf32-sh.c for the original. */ - -static bfd_boolean -sh_elf64_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED, - struct bfd_link_info *info, bfd *input_bfd, - asection *input_section, bfd_byte *contents, - Elf_Internal_Rela *relocs, - Elf_Internal_Sym *local_syms, - asection **local_sections) -{ - Elf_Internal_Shdr *symtab_hdr; - struct elf_link_hash_entry **sym_hashes; - Elf_Internal_Rela *rel, *relend; - bfd_vma *local_got_offsets; - asection *sgot; - asection *sgotplt; - asection *splt; - asection *sreloc; - bfd_vma disp, dropped; - - symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; - sym_hashes = elf_sym_hashes (input_bfd); - local_got_offsets = elf_local_got_offsets (input_bfd); - - sreloc = NULL; - - rel = relocs; - relend = relocs + input_section->reloc_count; - for (; rel < relend; rel++) - { - int r_type; - reloc_howto_type *howto; - unsigned long r_symndx; - Elf_Internal_Sym *sym; - asection *sec; - struct elf_link_hash_entry *h; - bfd_vma relocation; - bfd_vma addend = (bfd_vma)0; - bfd_reloc_status_type r; - int seen_stt_datalabel = 0; - - r_symndx = ELF64_R_SYM (rel->r_info); - - r_type = ELF64_R_TYPE (rel->r_info); - - if (r_type == (int) R_SH_NONE) - continue; - - if (r_type < 0 - || r_type > R_SH_64_PCREL - || (r_type >= (int) R_SH_FIRST_INVALID_RELOC - && r_type <= (int) R_SH_LAST_INVALID_RELOC) - || (r_type >= (int) R_SH_DIR8WPN - && r_type <= (int) R_SH_LAST_INVALID_RELOC) - || (r_type >= (int) R_SH_GNU_VTINHERIT - && r_type <= (int) R_SH_PSHL) - || (r_type >= (int) R_SH_FIRST_INVALID_RELOC_2 - && r_type <= R_SH_GOTPLT32) - || (r_type >= (int) R_SH_FIRST_INVALID_RELOC_4 - && r_type <= (int) R_SH_LAST_INVALID_RELOC_4)) - { - bfd_set_error (bfd_error_bad_value); - return FALSE; - } - - howto = sh_elf64_howto_table + r_type; - - h = NULL; - sym = NULL; - sec = NULL; - relocation = 0; - if (r_symndx < symtab_hdr->sh_info) - { - sym = local_syms + r_symndx; - sec = local_sections[r_symndx]; - relocation = ((sec->output_section->vma - + sec->output_offset - + sym->st_value) - | ((sym->st_other & STO_SH5_ISA32) != 0)); - - /* A local symbol never has STO_SH5_ISA32, so we don't need - datalabel processing here. Make sure this does not change - without notice. */ - if ((sym->st_other & STO_SH5_ISA32) != 0) - (*info->callbacks->reloc_dangerous) - (info, - _("unexpected STO_SH5_ISA32 on local symbol is not handled"), - input_bfd, input_section, rel->r_offset); - - if (sec != NULL && discarded_section (sec)) - /* Handled below. */ - ; - else if (bfd_link_relocatable (info)) - { - /* This is a relocatable link. We don't have to change - anything, unless the reloc is against a section symbol, - in which case we have to adjust according to where the - section symbol winds up in the output section. */ - if (ELF_ST_TYPE (sym->st_info) == STT_SECTION) - goto final_link_relocate; - - continue; - } - else if (! howto->partial_inplace) - { - relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); - relocation |= ((sym->st_other & STO_SH5_ISA32) != 0); - } - else if ((sec->flags & SEC_MERGE) - && ELF_ST_TYPE (sym->st_info) == STT_SECTION) - { - asection *msec; - - if (howto->rightshift || howto->src_mask != 0xffffffff) - { - _bfd_error_handler - /* xgettext:c-format */ - (_("%pB(%pA+%#" PRIx64 "): " - "%s relocation against SEC_MERGE section"), - input_bfd, input_section, - (uint64_t) rel->r_offset, howto->name); - return FALSE; - } - - addend = bfd_get_32 (input_bfd, contents + rel->r_offset); - msec = sec; - addend = - _bfd_elf_rel_local_sym (output_bfd, sym, &msec, addend) - - relocation; - addend += msec->output_section->vma + msec->output_offset; - bfd_put_32 (input_bfd, addend, contents + rel->r_offset); - addend = 0; - } - } - else - { - /* ??? Could we use the RELOC_FOR_GLOBAL_SYMBOL macro here ? */ - - h = sym_hashes[r_symndx - symtab_hdr->sh_info]; - while (h->root.type == bfd_link_hash_indirect - || h->root.type == bfd_link_hash_warning) - { - /* If the reference passes a symbol marked with - STT_DATALABEL, then any STO_SH5_ISA32 on the final value - doesn't count. */ - seen_stt_datalabel |= h->type == STT_DATALABEL; - h = (struct elf_link_hash_entry *) h->root.u.i.link; - } - - if (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak) - { - sec = h->root.u.def.section; - /* In these cases, we don't need the relocation value. - We check specially because in some obscure cases - sec->output_section will be NULL. */ - if (r_type == R_SH_GOTPC_LOW16 - || r_type == R_SH_GOTPC_MEDLOW16 - || r_type == R_SH_GOTPC_MEDHI16 - || r_type == R_SH_GOTPC_HI16 - || ((r_type == R_SH_PLT_LOW16 - || r_type == R_SH_PLT_MEDLOW16 - || r_type == R_SH_PLT_MEDHI16 - || r_type == R_SH_PLT_HI16) - && h->plt.offset != (bfd_vma) -1) - || ((r_type == R_SH_GOT_LOW16 - || r_type == R_SH_GOT_MEDLOW16 - || r_type == R_SH_GOT_MEDHI16 - || r_type == R_SH_GOT_HI16) - && elf_hash_table (info)->dynamic_sections_created - && (! bfd_link_pic (info) - || (! info->symbolic && h->dynindx != -1) - || !h->def_regular)) - /* The cases above are those in which relocation is - overwritten in the switch block below. The cases - below are those in which we must defer relocation - to run-time, because we can't resolve absolute - addresses when creating a shared library. */ - || (bfd_link_pic (info) - && ((! info->symbolic && h->dynindx != -1) - || !h->def_regular) - && ((r_type == R_SH_64 - && !(ELF_ST_VISIBILITY (h->other) == STV_INTERNAL - || ELF_ST_VISIBILITY (h->other) == STV_HIDDEN)) - || r_type == R_SH_64_PCREL) - && ((input_section->flags & SEC_ALLOC) != 0 - /* DWARF will emit R_SH_DIR32 relocations in its - sections against symbols defined externally - in shared libraries. We can't do anything - with them here. */ - || (input_section->flags & SEC_DEBUGGING) != 0)) - /* Dynamic relocs are not propagated for SEC_DEBUGGING - sections because such sections are not SEC_ALLOC and - thus ld.so will not process them. */ - || (sec->output_section == NULL - && ((input_section->flags & SEC_DEBUGGING) != 0 - && h->def_dynamic))) - ; - else if (sec->output_section != NULL) - relocation = ((h->root.u.def.value - + sec->output_section->vma - + sec->output_offset) - /* A STO_SH5_ISA32 causes a "bitor 1" to the - symbol value, unless we've seen - STT_DATALABEL on the way to it. */ - | ((h->other & STO_SH5_ISA32) != 0 - && ! seen_stt_datalabel)); - else if (!bfd_link_relocatable (info) - && (_bfd_elf_section_offset (output_bfd, info, - input_section, - rel->r_offset) - != (bfd_vma) -1)) - { - _bfd_error_handler - /* xgettext:c-format */ - (_("%pB(%pA+%#" PRIx64 "): " - "unresolvable %s relocation against symbol `%s'"), - input_bfd, - input_section, - (uint64_t) rel->r_offset, - howto->name, - h->root.root.string); - } - } - else if (h->root.type == bfd_link_hash_undefweak) - ; - else if (info->unresolved_syms_in_objects == RM_IGNORE - && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT) - ; - else if (!bfd_link_relocatable (info)) - (*info->callbacks->undefined_symbol) - (info, h->root.root.string, input_bfd, - input_section, rel->r_offset, - (info->unresolved_syms_in_objects == RM_GENERATE_ERROR - || ELF_ST_VISIBILITY (h->other))); - } - - if (sec != NULL && discarded_section (sec)) - RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section, - rel, 1, relend, howto, 0, contents); - - if (bfd_link_relocatable (info)) - continue; - - disp = (relocation - - input_section->output_section->vma - - input_section->output_offset - - rel->r_offset); - dropped = 0; - switch ((int)r_type) - { - case R_SH_PT_16: dropped = disp & 2; break; - case R_SH_DIR10SW: dropped = disp & 1; break; - case R_SH_DIR10SL: dropped = disp & 3; break; - case R_SH_DIR10SQ: dropped = disp & 7; break; - } - if (dropped != 0) - { - _bfd_error_handler - /* xgettext:c-format */ - (_("%pB: error: unaligned relocation type %d at " - "%08" PRIx64 " reloc %08" PRIx64 ""), - input_bfd, (int) r_type, - (uint64_t) rel->r_offset, (uint64_t) relocation); - bfd_set_error (bfd_error_bad_value); - return FALSE; - } - switch ((int)r_type) - { - case R_SH_64: - case R_SH_64_PCREL: - if (bfd_link_pic (info) - && (input_section->flags & SEC_ALLOC) != 0 - && (r_type != R_SH_64_PCREL - || (h != NULL - && h->dynindx != -1 - && (! info->symbolic - || !h->def_regular)))) - { - Elf_Internal_Rela outrel; - bfd_byte *loc; - bfd_boolean skip, relocate; - - /* When generating a shared object, these relocations - are copied into the output file to be resolved at run - time. */ - - if (sreloc == NULL) - { - sreloc = _bfd_elf_get_dynamic_reloc_section - (input_bfd, input_section, /*rela?*/ TRUE); - if (sreloc == NULL) - return FALSE; - } - - skip = FALSE; - relocate = FALSE; - - outrel.r_offset - = _bfd_elf_section_offset (output_bfd, info, - input_section, rel->r_offset); - - if (outrel.r_offset == (bfd_vma) -1) - skip = TRUE; - else if (outrel.r_offset == (bfd_vma) -2) - skip = TRUE, relocate = TRUE; - - outrel.r_offset += (input_section->output_section->vma - + input_section->output_offset); - - if (skip) - memset (&outrel, 0, sizeof outrel); - else if (r_type == R_SH_64_PCREL) - { - BFD_ASSERT (h != NULL && h->dynindx != -1); - outrel.r_info = ELF64_R_INFO (h->dynindx, R_SH_64_PCREL); - outrel.r_addend = rel->r_addend; - } - else - { - /* h->dynindx may be -1 if this symbol was marked to - become local. */ - if (h == NULL - || ((info->symbolic || h->dynindx == -1) - && h->def_regular)) - { - relocate = TRUE; - outrel.r_info = ELF64_R_INFO (0, R_SH_RELATIVE64); - outrel.r_addend = relocation + rel->r_addend; - } - else - { - BFD_ASSERT (h->dynindx != -1); - outrel.r_info = ELF64_R_INFO (h->dynindx, R_SH_64); - outrel.r_addend = relocation + rel->r_addend; - } - } - - loc = sreloc->contents; - loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela); - bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc); - - /* If this reloc is against an external symbol, we do - not want to fiddle with the addend. Otherwise, we - need to include the symbol value so that it becomes - an addend for the dynamic reloc. */ - if (! relocate) - continue; - } - else if (r_type == R_SH_64) - addend = rel->r_addend; - goto final_link_relocate; - - case R_SH_GOTPLT_LOW16: - case R_SH_GOTPLT_MEDLOW16: - case R_SH_GOTPLT_MEDHI16: - case R_SH_GOTPLT_HI16: - case R_SH_GOTPLT10BY4: - case R_SH_GOTPLT10BY8: - /* Relocation is to the entry for this symbol in the - procedure linkage table. */ - - if (h == NULL - || ELF_ST_VISIBILITY (h->other) == STV_INTERNAL - || ELF_ST_VISIBILITY (h->other) == STV_HIDDEN - || ! bfd_link_pic (info) - || info->symbolic - || h->dynindx == -1 - || h->plt.offset == (bfd_vma) -1 - || h->got.offset != (bfd_vma) -1) - goto force_got; - - /* Relocation is to the entry for this symbol in the global - offset table extension for the procedure linkage table. */ - sgotplt = elf_hash_table (info)->sgotplt; - BFD_ASSERT (sgotplt != NULL); - - relocation = (sgotplt->output_offset - + ((h->plt.offset / elf_sh64_sizeof_plt (info) - - 1 + 3) * 8)); - - relocation -= GOT_BIAS; - - goto final_link_relocate; - - force_got: - case R_SH_GOT_LOW16: - case R_SH_GOT_MEDLOW16: - case R_SH_GOT_MEDHI16: - case R_SH_GOT_HI16: - case R_SH_GOT10BY4: - case R_SH_GOT10BY8: - /* Relocation is to the entry for this symbol in the global - offset table. */ - sgot = elf_hash_table (info)->sgot; - BFD_ASSERT (sgot != NULL); - - if (h != NULL) - { - bfd_vma off; - - off = h->got.offset; - if (seen_stt_datalabel) - { - struct elf_sh64_link_hash_entry *hsh; - - hsh = (struct elf_sh64_link_hash_entry *)h; - off = hsh->datalabel_got_offset; - } - BFD_ASSERT (off != (bfd_vma) -1); - - if (! elf_hash_table (info)->dynamic_sections_created - || (bfd_link_pic (info) - && (info->symbolic || h->dynindx == -1 - || ELF_ST_VISIBILITY (h->other) == STV_INTERNAL - || ELF_ST_VISIBILITY (h->other) == STV_HIDDEN) - && h->def_regular)) - { - /* This is actually a static link, or it is a - -Bsymbolic link and the symbol is defined - locally, or the symbol was forced to be local - because of a version file. We must initialize - this entry in the global offset table. Since the - offset must always be a multiple of 4, we use the - least significant bit to record whether we have - initialized it already. - - When doing a dynamic link, we create a .rela.got - relocation entry to initialize the value. This - is done in the finish_dynamic_symbol routine. */ - if ((off & 1) != 0) - off &= ~1; - else - { - bfd_put_64 (output_bfd, relocation, - sgot->contents + off); - if (seen_stt_datalabel) - { - struct elf_sh64_link_hash_entry *hsh; - - hsh = (struct elf_sh64_link_hash_entry *)h; - hsh->datalabel_got_offset |= 1; - } - else - h->got.offset |= 1; - } - } - - relocation = sgot->output_offset + off; - } - else - { - bfd_vma off; - - if (rel->r_addend) - { - BFD_ASSERT (local_got_offsets != NULL - && (local_got_offsets[symtab_hdr->sh_info - + r_symndx] - != (bfd_vma) -1)); - - off = local_got_offsets[symtab_hdr->sh_info - + r_symndx]; - } - else - { - BFD_ASSERT (local_got_offsets != NULL - && local_got_offsets[r_symndx] != (bfd_vma) -1); - - off = local_got_offsets[r_symndx]; - } - - /* The offset must always be a multiple of 8. We use - the least significant bit to record whether we have - already generated the necessary reloc. */ - if ((off & 1) != 0) - off &= ~1; - else - { - bfd_put_64 (output_bfd, relocation, sgot->contents + off); - - if (bfd_link_pic (info)) - { - asection *s; - Elf_Internal_Rela outrel; - bfd_byte *loc; - - s = elf_hash_table (info)->srelgot; - BFD_ASSERT (s != NULL); - - outrel.r_offset = (sgot->output_section->vma - + sgot->output_offset - + off); - outrel.r_info = ELF64_R_INFO (0, R_SH_RELATIVE64); - outrel.r_addend = relocation; - loc = s->contents; - loc += s->reloc_count++ * sizeof (Elf64_External_Rela); - bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc); - } - - if (rel->r_addend) - local_got_offsets[symtab_hdr->sh_info + r_symndx] |= 1; - else - local_got_offsets[r_symndx] |= 1; - } - - relocation = sgot->output_offset + off; - } - - relocation -= GOT_BIAS; - - goto final_link_relocate; - - case R_SH_GOTOFF_LOW16: - case R_SH_GOTOFF_MEDLOW16: - case R_SH_GOTOFF_MEDHI16: - case R_SH_GOTOFF_HI16: - /* Relocation is relative to the start of the global offset - table. */ - - sgot = elf_hash_table (info)->sgot; - BFD_ASSERT (sgot != NULL); - - /* Note that sgot->output_offset is not involved in this - calculation. We always want the start of .got. If we - defined _GLOBAL_OFFSET_TABLE in a different way, as is - permitted by the ABI, we might have to change this - calculation. */ - relocation -= sgot->output_section->vma; - - relocation -= GOT_BIAS; - - addend = rel->r_addend; - - goto final_link_relocate; - - case R_SH_GOTPC_LOW16: - case R_SH_GOTPC_MEDLOW16: - case R_SH_GOTPC_MEDHI16: - case R_SH_GOTPC_HI16: - /* Use global offset table as symbol value. */ - - sgot = elf_hash_table (info)->sgot; - BFD_ASSERT (sgot != NULL); - - relocation = sgot->output_section->vma; - - relocation += GOT_BIAS; - - addend = rel->r_addend; - - goto final_link_relocate; - - case R_SH_PLT_LOW16: - case R_SH_PLT_MEDLOW16: - case R_SH_PLT_MEDHI16: - case R_SH_PLT_HI16: - /* Relocation is to the entry for this symbol in the - procedure linkage table. */ - - /* Resolve a PLT reloc against a local symbol directly, - without using the procedure linkage table. */ - if (h == NULL) - goto final_link_relocate; - - if (ELF_ST_VISIBILITY (h->other) == STV_INTERNAL - || ELF_ST_VISIBILITY (h->other) == STV_HIDDEN) - goto final_link_relocate; - - if (h->plt.offset == (bfd_vma) -1) - { - /* We didn't make a PLT entry for this symbol. This - happens when statically linking PIC code, or when - using -Bsymbolic. */ - goto final_link_relocate; - } - - splt = elf_hash_table (info)->splt; - BFD_ASSERT (splt != NULL); - - relocation = (splt->output_section->vma - + splt->output_offset - + h->plt.offset); - relocation++; - - addend = rel->r_addend; - - goto final_link_relocate; - - case R_SH_DIR32: - case R_SH_SHMEDIA_CODE: - case R_SH_PT_16: - case R_SH_DIR5U: - case R_SH_DIR6S: - case R_SH_DIR6U: - case R_SH_DIR10S: - case R_SH_DIR10SW: - case R_SH_DIR10SL: - case R_SH_DIR10SQ: - case R_SH_IMMS16: - case R_SH_IMMU16: - case R_SH_IMM_LOW16: - case R_SH_IMM_LOW16_PCREL: - case R_SH_IMM_MEDLOW16: - case R_SH_IMM_MEDLOW16_PCREL: - case R_SH_IMM_MEDHI16: - case R_SH_IMM_MEDHI16_PCREL: - case R_SH_IMM_HI16: - case R_SH_IMM_HI16_PCREL: - addend = rel->r_addend; - /* Fall through. */ - case R_SH_REL32: - final_link_relocate: - r = _bfd_final_link_relocate (howto, input_bfd, input_section, - contents, rel->r_offset, - relocation, addend); - break; - - default: - bfd_set_error (bfd_error_bad_value); - return FALSE; - - } - - if (r != bfd_reloc_ok) - { - switch (r) - { - default: - case bfd_reloc_outofrange: - abort (); - case bfd_reloc_overflow: - { - const char *name; - - if (h != NULL) - name = NULL; - else - { - name = (bfd_elf_string_from_elf_section - (input_bfd, symtab_hdr->sh_link, sym->st_name)); - if (name == NULL) - return FALSE; - if (*name == '\0') - name = bfd_section_name (input_bfd, sec); - } - (*info->callbacks->reloc_overflow) - (info, (h ? &h->root : NULL), name, howto->name, - (bfd_vma) 0, input_bfd, input_section, rel->r_offset); - } - break; - } - } - } - - return TRUE; -} - -/* This is a version of bfd_generic_get_relocated_section_contents - that uses sh_elf64_relocate_section. - - See sh_elf_relocate_section in elf32-sh.c for the original. */ - -static bfd_byte * -sh_elf64_get_relocated_section_contents (bfd *output_bfd, - struct bfd_link_info *link_info, - struct bfd_link_order *link_order, - bfd_byte *data, - bfd_boolean relocatable, - asymbol **symbols) -{ - Elf_Internal_Shdr *symtab_hdr; - asection *input_section = link_order->u.indirect.section; - bfd *input_bfd = input_section->owner; - asection **sections = NULL; - Elf_Internal_Rela *internal_relocs = NULL; - Elf_Internal_Sym *isymbuf = NULL; - - /* We only need to handle the case of relaxing, or of having a - particular set of section contents, specially. */ - if (relocatable - || elf_section_data (input_section)->this_hdr.contents == NULL) - return bfd_generic_get_relocated_section_contents (output_bfd, link_info, - link_order, data, - relocatable, - symbols); - - symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; - - memcpy (data, elf_section_data (input_section)->this_hdr.contents, - input_section->size); - - if ((input_section->flags & SEC_RELOC) != 0 - && input_section->reloc_count > 0) - { - Elf_Internal_Sym *isymp; - Elf_Internal_Sym *isymend; - asection **secpp; - - /* Read this BFD's local symbols. */ - if (symtab_hdr->sh_info != 0) - { - isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents; - if (isymbuf == NULL) - isymbuf = bfd_elf_get_elf_syms (input_bfd, symtab_hdr, - symtab_hdr->sh_info, 0, - NULL, NULL, NULL); - if (isymbuf == NULL) - goto error_return; - } - - internal_relocs = (_bfd_elf_link_read_relocs - (input_bfd, input_section, NULL, - (Elf_Internal_Rela *) NULL, FALSE)); - if (internal_relocs == NULL) - goto error_return; - - sections = (asection **) bfd_malloc (symtab_hdr->sh_info - * sizeof (asection *)); - if (sections == NULL && symtab_hdr->sh_info > 0) - goto error_return; - - secpp = sections; - isymend = isymbuf + symtab_hdr->sh_info; - for (isymp = isymbuf; isymp < isymend; ++isymp, ++secpp) - { - asection *isec; - - if (isymp->st_shndx == SHN_UNDEF) - isec = bfd_und_section_ptr; - else if (isymp->st_shndx == SHN_ABS) - isec = bfd_abs_section_ptr; - else if (isymp->st_shndx == SHN_COMMON) - isec = bfd_com_section_ptr; - else - isec = bfd_section_from_elf_index (input_bfd, isymp->st_shndx); - - *secpp = isec; - } - - if (! sh_elf64_relocate_section (output_bfd, link_info, input_bfd, - input_section, data, internal_relocs, - isymbuf, sections)) - goto error_return; - - if (sections != NULL) - free (sections); - if (internal_relocs != elf_section_data (input_section)->relocs) - free (internal_relocs); - if (isymbuf != NULL - && (unsigned char *) isymbuf != symtab_hdr->contents) - free (isymbuf); - } - - return data; - - error_return: - if (sections != NULL) - free (sections); - if (internal_relocs != NULL - && internal_relocs != elf_section_data (input_section)->relocs) - free (internal_relocs); - if (isymbuf != NULL - && (unsigned char *) isymbuf != symtab_hdr->contents) - free (isymbuf); - return NULL; -} - -/* Set the SHF_SH5_ISA32 flag for ISA SHmedia code sections. */ - -static bfd_boolean -sh64_elf64_fake_sections (bfd *output_bfd ATTRIBUTE_UNUSED, - Elf_Internal_Shdr *elf_section_hdr, - asection *asect) -{ - /* Code sections can only contain SH64 code, so mark them as such. */ - if (bfd_get_section_flags (output_bfd, asect) & SEC_CODE) - elf_section_hdr->sh_flags |= SHF_SH5_ISA32; - - return TRUE; -} - -static bfd_boolean -sh_elf64_set_mach_from_flags (bfd *abfd) -{ - flagword flags = elf_elfheader (abfd)->e_flags; - - switch (flags & EF_SH_MACH_MASK) - { - case EF_SH5: - /* Just one, but keep the switch construct to make additions easy. */ - bfd_default_set_arch_mach (abfd, bfd_arch_sh, bfd_mach_sh5); - break; - - default: - bfd_set_error (bfd_error_wrong_format); - return FALSE; - } - return TRUE; -} - -/* Function to keep SH64 specific file flags. - - See sh64_elf_set_private_flags in elf32-sh64.c for the original. */ - -static bfd_boolean -sh_elf64_set_private_flags (bfd *abfd, flagword flags) -{ - BFD_ASSERT (! elf_flags_init (abfd) - || elf_elfheader (abfd)->e_flags == flags); - - elf_elfheader (abfd)->e_flags = flags; - elf_flags_init (abfd) = TRUE; - return sh_elf64_set_mach_from_flags (abfd); -} - -/* Copy the SHF_SH5_ISA32 attribute that we keep on all sections with - code, to keep attributes the same as for SHmedia in 32-bit ELF. */ - -static bfd_boolean -sh_elf64_copy_private_data_internal (bfd *ibfd, bfd *obfd) -{ - if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour - || bfd_get_flavour (obfd) != bfd_target_elf_flavour) - return TRUE; - - /* Copy object attributes. */ - _bfd_elf_copy_private_bfd_data (ibfd, obfd); - - return sh_elf64_set_private_flags (obfd, elf_elfheader (ibfd)->e_flags); -} - -static bfd_boolean -sh_elf64_copy_private_data (bfd *ibfd, bfd *obfd) -{ - return sh_elf64_copy_private_data_internal (ibfd, obfd); -} - -static bfd_boolean -sh_elf64_merge_private_data (bfd *ibfd, struct bfd_link_info *info) -{ - bfd *obfd = info->output_bfd; - flagword old_flags, new_flags; - - if (! _bfd_generic_verify_endian_match (ibfd, info)) - return FALSE; - - if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour - || bfd_get_flavour (obfd) != bfd_target_elf_flavour) - return TRUE; - - if (bfd_get_arch_size (ibfd) != bfd_get_arch_size (obfd)) - { - const char *msg; - - if (bfd_get_arch_size (ibfd) == 32 - && bfd_get_arch_size (obfd) == 64) - /* xgettext:c-format */ - msg = _("%pB: compiled as 32-bit object and %pB is 64-bit"); - else if (bfd_get_arch_size (ibfd) == 64 - && bfd_get_arch_size (obfd) == 32) - /* xgettext:c-format */ - msg = _("%pB: compiled as 64-bit object and %pB is 32-bit"); - else - /* xgettext:c-format */ - msg = _("%pB: object size does not match that of target %pB"); - - _bfd_error_handler (msg, ibfd, obfd); - bfd_set_error (bfd_error_wrong_format); - return FALSE; - } - - old_flags = elf_elfheader (obfd)->e_flags; - new_flags = elf_elfheader (ibfd)->e_flags; - if (! elf_flags_init (obfd)) - { - /* This happens when ld starts out with a 'blank' output file. */ - elf_flags_init (obfd) = TRUE; - elf_elfheader (obfd)->e_flags = old_flags = new_flags; - } - /* We don't allow linking in anything else than SH64 code, and since - this is a 64-bit ELF, we assume the 64-bit ABI is used. Add code - here as things change. */ - else if ((new_flags & EF_SH_MACH_MASK) != EF_SH5) - { - _bfd_error_handler - ("%pB: does not use the SH64 64-bit ABI as previous modules do", ibfd); - bfd_set_error (bfd_error_bad_value); - return FALSE; - } - - sh_elf64_copy_private_data_internal (ibfd, obfd); - - /* I can't think of anything sane other than old_flags being EF_SH5 and - that we need to preserve that. */ - elf_elfheader (obfd)->e_flags = old_flags; - - return sh_elf64_set_mach_from_flags (obfd); -} - -/* Return the section that should be marked against GC for a given - relocation. */ - -static asection * -sh_elf64_gc_mark_hook (asection *sec, - struct bfd_link_info *info, - Elf_Internal_Rela *rel, - struct elf_link_hash_entry *h, - Elf_Internal_Sym *sym) -{ - if (h != NULL) - switch (ELF64_R_TYPE (rel->r_info)) - { - case R_SH_GNU_VTINHERIT: - case R_SH_GNU_VTENTRY: - return NULL; - } - - return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym); -} - -/* Look through the relocs for a section during the first phase. - Since we don't do .gots or .plts, we just need to consider the - virtual table relocs for gc. */ - -static bfd_boolean -sh_elf64_check_relocs (bfd *abfd, struct bfd_link_info *info, - asection *sec, const Elf_Internal_Rela *relocs) -{ - Elf_Internal_Shdr *symtab_hdr; - struct elf_link_hash_entry **sym_hashes; - const Elf_Internal_Rela *rel; - const Elf_Internal_Rela *rel_end; - bfd *dynobj; - bfd_vma *local_got_offsets; - asection *sgot; - asection *srelgot; - asection *sreloc; - - sreloc = NULL; - - if (bfd_link_relocatable (info)) - return TRUE; - - symtab_hdr = &elf_tdata (abfd)->symtab_hdr; - sym_hashes = elf_sym_hashes (abfd); - - dynobj = elf_hash_table (info)->dynobj; - local_got_offsets = elf_local_got_offsets (abfd); - - rel_end = relocs + sec->reloc_count; - for (rel = relocs; rel < rel_end; rel++) - { - struct elf_link_hash_entry *h; - unsigned long r_symndx; - - r_symndx = ELF64_R_SYM (rel->r_info); - if (r_symndx < symtab_hdr->sh_info) - h = NULL; - else - { - h = sym_hashes[r_symndx - symtab_hdr->sh_info]; - while (h->root.type == bfd_link_hash_indirect - || h->root.type == bfd_link_hash_warning) - h = (struct elf_link_hash_entry *) h->root.u.i.link; - } - - /* Some relocs require a global offset table. */ - if (dynobj == NULL) - { - switch (ELF64_R_TYPE (rel->r_info)) - { - case R_SH_GOTPLT_LOW16: - case R_SH_GOTPLT_MEDLOW16: - case R_SH_GOTPLT_MEDHI16: - case R_SH_GOTPLT_HI16: - case R_SH_GOTPLT10BY4: - case R_SH_GOTPLT10BY8: - case R_SH_GOT_LOW16: - case R_SH_GOT_MEDLOW16: - case R_SH_GOT_MEDHI16: - case R_SH_GOT_HI16: - case R_SH_GOT10BY4: - case R_SH_GOT10BY8: - case R_SH_GOTOFF_LOW16: - case R_SH_GOTOFF_MEDLOW16: - case R_SH_GOTOFF_MEDHI16: - case R_SH_GOTOFF_HI16: - case R_SH_GOTPC_LOW16: - case R_SH_GOTPC_MEDLOW16: - case R_SH_GOTPC_MEDHI16: - case R_SH_GOTPC_HI16: - elf_hash_table (info)->dynobj = dynobj = abfd; - if (! _bfd_elf_create_got_section (dynobj, info)) - return FALSE; - break; - - default: - break; - } - } - - switch (ELF64_R_TYPE (rel->r_info)) - { - /* This relocation describes the C++ object vtable hierarchy. - Reconstruct it for later use during GC. */ - case R_SH_GNU_VTINHERIT: - if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset)) - return FALSE; - break; - - /* This relocation describes which C++ vtable entries are actually - used. Record for later use during GC. */ - case R_SH_GNU_VTENTRY: - BFD_ASSERT (h != NULL); - if (h != NULL - && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend)) - return FALSE; - break; - - force_got: - case R_SH_GOT_LOW16: - case R_SH_GOT_MEDLOW16: - case R_SH_GOT_MEDHI16: - case R_SH_GOT_HI16: - case R_SH_GOT10BY4: - case R_SH_GOT10BY8: - /* This symbol requires a global offset table entry. */ - - sgot = elf_hash_table (info)->sgot; - srelgot = elf_hash_table (info)->srelgot; - BFD_ASSERT (sgot != NULL && srelgot != NULL); - - if (h != NULL) - { - if (h->type == STT_DATALABEL) - { - struct elf_sh64_link_hash_entry *hsh; - - h = (struct elf_link_hash_entry *) h->root.u.i.link; - hsh = (struct elf_sh64_link_hash_entry *)h; - if (hsh->datalabel_got_offset != (bfd_vma) -1) - break; - - hsh->datalabel_got_offset = sgot->size; - } - else - { - if (h->got.offset != (bfd_vma) -1) - { - /* We have already allocated space in the .got. */ - break; - } - h->got.offset = sgot->size; - } - - /* Make sure this symbol is output as a dynamic symbol. */ - if (h->dynindx == -1) - { - if (! bfd_elf_link_record_dynamic_symbol (info, h)) - return FALSE; - } - - srelgot->size += sizeof (Elf64_External_Rela); - } - else - { - /* This is a global offset table entry for a local - symbol. */ - if (local_got_offsets == NULL) - { - size_t size; - register unsigned int i; - - size = symtab_hdr->sh_info * sizeof (bfd_vma); - /* Reserve space for both the datalabel and - codelabel local GOT offsets. */ - size *= 2; - local_got_offsets = (bfd_vma *) bfd_alloc (abfd, size); - if (local_got_offsets == NULL) - return FALSE; - elf_local_got_offsets (abfd) = local_got_offsets; - for (i = 0; i < symtab_hdr->sh_info; i++) - local_got_offsets[i] = (bfd_vma) -1; - for (; i < 2 * symtab_hdr->sh_info; i++) - local_got_offsets[i] = (bfd_vma) -1; - } - if ((rel->r_addend & 1) != 0) - { - if (local_got_offsets[symtab_hdr->sh_info - + r_symndx] != (bfd_vma) -1) - { - /* We have already allocated space in the .got. */ - break; - } - local_got_offsets[symtab_hdr->sh_info - + r_symndx] = sgot->size; - } - else - { - if (local_got_offsets[r_symndx] != (bfd_vma) -1) - { - /* We have already allocated space in the .got. */ - break; - } - local_got_offsets[r_symndx] = sgot->size; - } - - if (bfd_link_pic (info)) - { - /* If we are generating a shared object, we need to - output a R_SH_RELATIVE reloc so that the dynamic - linker can adjust this GOT entry. */ - srelgot->size += sizeof (Elf64_External_Rela); - } - } - - sgot->size += 8; - - break; - - case R_SH_GOTPLT_LOW16: - case R_SH_GOTPLT_MEDLOW16: - case R_SH_GOTPLT_MEDHI16: - case R_SH_GOTPLT_HI16: - case R_SH_GOTPLT10BY4: - case R_SH_GOTPLT10BY8: - /* If this is a local symbol, we resolve it directly without - creating a procedure linkage table entry. */ - - if (h == NULL - || ELF_ST_VISIBILITY (h->other) == STV_INTERNAL - || ELF_ST_VISIBILITY (h->other) == STV_HIDDEN - || ! bfd_link_pic (info) - || info->symbolic - || h->dynindx == -1 - || h->got.offset != (bfd_vma) -1) - goto force_got; - - /* Make sure this symbol is output as a dynamic symbol. */ - if (h->dynindx == -1) - { - if (! bfd_elf_link_record_dynamic_symbol (info, h)) - return FALSE; - } - - h->needs_plt = 1; - - break; - - case R_SH_PLT_LOW16: - case R_SH_PLT_MEDLOW16: - case R_SH_PLT_MEDHI16: - case R_SH_PLT_HI16: - /* This symbol requires a procedure linkage table entry. We - actually build the entry in adjust_dynamic_symbol, - because this might be a case of linking PIC code which is - never referenced by a dynamic object, in which case we - don't need to generate a procedure linkage table entry - after all. */ - - /* If this is a local symbol, we resolve it directly without - creating a procedure linkage table entry. */ - if (h == NULL) - continue; - - if (ELF_ST_VISIBILITY (h->other) == STV_INTERNAL - || ELF_ST_VISIBILITY (h->other) == STV_HIDDEN) - break; - - h->needs_plt = 1; - - break; - - case R_SH_64: - case R_SH_64_PCREL: - if (h != NULL) - h->non_got_ref = 1; - - /* If we are creating a shared library, and this is a reloc - against a global symbol, or a non PC relative reloc - against a local symbol, then we need to copy the reloc - into the shared library. However, if we are linking with - -Bsymbolic, we do not need to copy a reloc against a - global symbol which is defined in an object we are - including in the link (i.e., DEF_REGULAR is set). At - this point we have not seen all the input files, so it is - possible that DEF_REGULAR is not set now but will be set - later (it is never cleared). We account for that - possibility below by storing information in the - pcrel_relocs_copied field of the hash table entry. */ - if (bfd_link_pic (info) - && (sec->flags & SEC_ALLOC) != 0 - && (ELF32_R_TYPE (rel->r_info) != R_SH_64_PCREL - || (h != NULL - && (! info->symbolic - || !h->def_regular)))) - { - /* When creating a shared object, we must copy these - reloc types into the output file. We create a reloc - section in dynobj and make room for this reloc. */ - if (sreloc == NULL) - { - sreloc = _bfd_elf_make_dynamic_reloc_section - (sec, dynobj, 2, abfd, /*rela?*/ TRUE); - - if (sreloc == NULL) - return FALSE; - } - - sreloc->size += sizeof (Elf64_External_Rela); - - /* If we are linking with -Bsymbolic, and this is a - global symbol, we count the number of PC relative - relocations we have entered for this symbol, so that - we can discard them again if the symbol is later - defined by a regular object. Note that this function - is only called if we are using an elf_sh linker - hash table, which means that h is really a pointer to - an elf_sh_link_hash_entry. */ - if (h != NULL && info->symbolic - && ELF64_R_TYPE (rel->r_info) == R_SH_64_PCREL) - { - struct elf_sh64_link_hash_entry *eh; - struct elf_sh64_pcrel_relocs_copied *p; - - eh = (struct elf_sh64_link_hash_entry *) h; - - for (p = eh->pcrel_relocs_copied; p != NULL; p = p->next) - if (p->section == sreloc) - break; - - if (p == NULL) - { - p = ((struct elf_sh64_pcrel_relocs_copied *) - bfd_alloc (dynobj, sizeof *p)); - if (p == NULL) - return FALSE; - p->next = eh->pcrel_relocs_copied; - eh->pcrel_relocs_copied = p; - p->section = sreloc; - p->count = 0; - } - - ++p->count; - } - } - - break; - } - } - - return TRUE; -} - -static int -sh64_elf64_get_symbol_type (Elf_Internal_Sym * elf_sym, int type) -{ - if (ELF_ST_TYPE (elf_sym->st_info) == STT_DATALABEL) - return STT_DATALABEL; - - return type; -} - -/* FIXME: This is a copy of sh64_elf_add_symbol_hook in elf32-sh64.c. - Either file can presumably exist without the other, but do not differ - in elf-size-ness. How to share? - - Hook called by the linker routine which adds symbols from an object - file. We must make indirect symbols for undefined symbols marked with - STT_DATALABEL, so relocations passing them will pick up that attribute - and neutralize STO_SH5_ISA32 found on the symbol definition. - - There is a problem, though: We want to fill in the hash-table entry for - this symbol and signal to the caller that no further processing is - needed. But we don't have the index for this hash-table entry. We - rely here on that the current entry is the first hash-entry with NULL, - which seems brittle. Also, iterating over the hash-table to find that - entry is a linear operation on the number of symbols in this input - file, and this function should take constant time, so that's not good - too. Only comfort is that DataLabel references should only be found in - hand-written assembly code and thus be rare. FIXME: Talk maintainers - into adding an option to elf_add_symbol_hook (preferably) for the index - or the hash entry, alternatively adding the index to Elf_Internal_Sym - (not so good). */ - -static bfd_boolean -sh64_elf64_add_symbol_hook (bfd *abfd, struct bfd_link_info *info, - Elf_Internal_Sym *sym, const char **namep, - flagword *flagsp ATTRIBUTE_UNUSED, - asection **secp, bfd_vma *valp) -{ - /* We want to do this for relocatable as well as final linking. */ - if (ELF_ST_TYPE (sym->st_info) == STT_DATALABEL - && is_elf_hash_table (info->hash)) - { - struct elf_link_hash_entry *h; - - /* For relocatable links, we register the DataLabel sym in its own - right, and tweak the name when it's output. Otherwise, we make - an indirect symbol of it. */ - flagword flags - = bfd_link_relocatable (info) || info->emitrelocations - ? BSF_GLOBAL : BSF_GLOBAL | BSF_INDIRECT; - - char *dl_name - = bfd_malloc (strlen (*namep) + sizeof (DATALABEL_SUFFIX)); - struct elf_link_hash_entry ** sym_hash = elf_sym_hashes (abfd); - - BFD_ASSERT (sym_hash != NULL); - - /* Allocation may fail. */ - if (dl_name == NULL) - return FALSE; - - strcpy (dl_name, *namep); - strcat (dl_name, DATALABEL_SUFFIX); - - h = (struct elf_link_hash_entry *) - bfd_link_hash_lookup (info->hash, dl_name, FALSE, FALSE, FALSE); - - if (h == NULL) - { - /* No previous datalabel symbol. Make one. */ - struct bfd_link_hash_entry *bh = NULL; - const struct elf_backend_data *bed = get_elf_backend_data (abfd); - - if (! _bfd_generic_link_add_one_symbol (info, abfd, dl_name, - flags, *secp, *valp, - *namep, FALSE, - bed->collect, &bh)) - { - free (dl_name); - return FALSE; - } - - h = (struct elf_link_hash_entry *) bh; - h->non_elf = 0; - h->type = STT_DATALABEL; - } - else - /* If a new symbol was created, it holds the allocated name. - Otherwise, we don't need it anymore and should deallocate it. */ - free (dl_name); - - if (h->type != STT_DATALABEL - || ((bfd_link_relocatable (info) || info->emitrelocations) - && h->root.type != bfd_link_hash_undefined) - || (! bfd_link_relocatable (info) && !info->emitrelocations - && h->root.type != bfd_link_hash_indirect)) - { - /* Make sure we don't get confused on invalid input. */ - _bfd_error_handler - (_("%pB: encountered datalabel symbol in input"), abfd); - bfd_set_error (bfd_error_bad_value); - return FALSE; - } - - /* Now find the hash-table slot for this entry and fill it in. */ - while (*sym_hash != NULL) - sym_hash++; - *sym_hash = h; - - /* Signal to caller to skip this symbol - we've handled it. */ - *namep = NULL; - } - - return TRUE; -} - -/* This hook function is called before the linker writes out a global - symbol. For relocatable links, DataLabel symbols will be present in - linker output. We cut off the special suffix on those symbols, so the - right name appears in the output. - - When linking and emitting relocations, there can appear global symbols - that are not referenced by relocs, but rather only implicitly through - DataLabel references, a relation that is not visible to the linker. - Since no stripping of global symbols in done when doing such linking, - we don't need to look up and make sure to emit the main symbol for each - DataLabel symbol. */ - -static int -sh64_elf64_link_output_symbol_hook (struct bfd_link_info *info, - const char *cname, - Elf_Internal_Sym *sym, - asection *input_sec ATTRIBUTE_UNUSED, - struct elf_link_hash_entry *h ATTRIBUTE_UNUSED) -{ - char *name = (char *) cname; - - if (bfd_link_relocatable (info) || info->emitrelocations) - { - if (ELF_ST_TYPE (sym->st_info) == STT_DATALABEL) - name[strlen (name) - strlen (DATALABEL_SUFFIX)] = 0; - } - - return 1; -} - -/* Set bit 0 on the entry address; it always points to SHmedia code. This - is mostly for symmetry with the 32-bit format, where code can be - SHcompact and we need to make a distinction to make sure execution - starts in the right ISA mode. It is also convenient for a loader, - which would otherwise have to set this bit when loading a TR register - before jumping to the program entry. */ - -static void -sh64_elf64_final_write_processing (bfd *abfd, - bfd_boolean linker ATTRIBUTE_UNUSED) -{ - /* FIXME: Perhaps we shouldn't do this if the entry address was supplied - numerically, but we currently lack the infrastructure to recognize - that: The entry symbol, and info whether it is numeric or a symbol - name is kept private in the linker. */ - if (elf_elfheader (abfd)->e_type == ET_EXEC) - elf_elfheader (abfd)->e_entry |= 1; -} - -/* First entry in an absolute procedure linkage table look like this. */ - -static const bfd_byte elf_sh64_plt0_entry_be[PLT_ENTRY_SIZE] = -{ - 0xcc, 0x00, 0x01, 0x10, /* movi .got.plt >> 48, r17 */ - 0xc8, 0x00, 0x01, 0x10, /* shori (.got.plt >> 32) & 65535, r17 */ - 0xc8, 0x00, 0x01, 0x10, /* shori (.got.plt >> 16) & 65535, r17 */ - 0xc8, 0x00, 0x01, 0x10, /* shori .got.plt & 65535, r17 */ - 0x8d, 0x10, 0x09, 0x90, /* ld.q r17, 16, r25 */ - 0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */ - 0x8d, 0x10, 0x05, 0x10, /* ld.q r17, 8, r17 */ - 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */ - 0x6f, 0xf0, 0xff, 0xf0, /* nop */ - 0x6f, 0xf0, 0xff, 0xf0, /* nop */ - 0x6f, 0xf0, 0xff, 0xf0, /* nop */ - 0x6f, 0xf0, 0xff, 0xf0, /* nop */ - 0x6f, 0xf0, 0xff, 0xf0, /* nop */ - 0x6f, 0xf0, 0xff, 0xf0, /* nop */ - 0x6f, 0xf0, 0xff, 0xf0, /* nop */ - 0x6f, 0xf0, 0xff, 0xf0, /* nop */ -}; - -static const bfd_byte elf_sh64_plt0_entry_le[PLT_ENTRY_SIZE] = -{ - 0x10, 0x01, 0x00, 0xcc, /* movi .got.plt >> 16, r17 */ - 0x10, 0x01, 0x00, 0xc8, /* shori (.got.plt >> 32) & 65535, r17 */ - 0x10, 0x01, 0x00, 0xc8, /* shori (.got.plt >> 16) & 65535, r17 */ - 0x10, 0x01, 0x00, 0xc8, /* shori .got.plt & 65535, r17 */ - 0x90, 0x09, 0x10, 0x8d, /* ld.q r17, 16, r25 */ - 0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */ - 0x10, 0x05, 0x10, 0x8d, /* ld.q r17, 8, r17 */ - 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */ - 0xf0, 0xff, 0xf0, 0x6f, /* nop */ - 0xf0, 0xff, 0xf0, 0x6f, /* nop */ - 0xf0, 0xff, 0xf0, 0x6f, /* nop */ - 0xf0, 0xff, 0xf0, 0x6f, /* nop */ - 0xf0, 0xff, 0xf0, 0x6f, /* nop */ - 0xf0, 0xff, 0xf0, 0x6f, /* nop */ - 0xf0, 0xff, 0xf0, 0x6f, /* nop */ - 0xf0, 0xff, 0xf0, 0x6f, /* nop */ -}; - -/* Sebsequent entries in an absolute procedure linkage table look like - this. */ - -static const bfd_byte elf_sh64_plt_entry_be[PLT_ENTRY_SIZE] = -{ - 0xcc, 0x00, 0x01, 0x90, /* movi nameN-in-GOT >> 48, r25 */ - 0xc8, 0x00, 0x01, 0x90, /* shori (nameN-in-GOT >> 32) & 65535, r25 */ - 0xc8, 0x00, 0x01, 0x90, /* shori (nameN-in-GOT >> 16) & 65535, r25 */ - 0xc8, 0x00, 0x01, 0x90, /* shori nameN-in-GOT & 65535, r25 */ - 0x8d, 0x90, 0x01, 0x90, /* ld.q r25, 0, r25 */ - 0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */ - 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */ - 0x6f, 0xf0, 0xff, 0xf0, /* nop */ - 0xcc, 0x00, 0x01, 0x90, /* movi (.+8-.PLT0) >> 16, r25 */ - 0xc8, 0x00, 0x01, 0x90, /* shori (.+4-.PLT0) & 65535, r25 */ - 0x6b, 0xf5, 0x66, 0x00, /* ptrel r25, tr0 */ - 0xcc, 0x00, 0x01, 0x50, /* movi reloc-offset >> 16, r21 */ - 0xc8, 0x00, 0x01, 0x50, /* shori reloc-offset & 65535, r21 */ - 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */ - 0x6f, 0xf0, 0xff, 0xf0, /* nop */ - 0x6f, 0xf0, 0xff, 0xf0, /* nop */ -}; - -static const bfd_byte elf_sh64_plt_entry_le[PLT_ENTRY_SIZE] = -{ - 0x90, 0x01, 0x00, 0xcc, /* movi nameN-in-GOT >> 16, r25 */ - 0x90, 0x01, 0x00, 0xc8, /* shori nameN-in-GOT & 65535, r25 */ - 0x90, 0x01, 0x00, 0xc8, /* shori nameN-in-GOT & 65535, r25 */ - 0x90, 0x01, 0x00, 0xc8, /* shori nameN-in-GOT & 65535, r25 */ - 0x90, 0x01, 0x90, 0x8d, /* ld.q r25, 0, r25 */ - 0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */ - 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */ - 0xf0, 0xff, 0xf0, 0x6f, /* nop */ - 0x90, 0x01, 0x00, 0xcc, /* movi (.+8-.PLT0) >> 16, r25 */ - 0x90, 0x01, 0x00, 0xc8, /* shori (.+4-.PLT0) & 65535, r25 */ - 0x00, 0x66, 0xf5, 0x6b, /* ptrel r25, tr0 */ - 0x50, 0x01, 0x00, 0xcc, /* movi reloc-offset >> 16, r21 */ - 0x50, 0x01, 0x00, 0xc8, /* shori reloc-offset & 65535, r21 */ - 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */ - 0xf0, 0xff, 0xf0, 0x6f, /* nop */ - 0xf0, 0xff, 0xf0, 0x6f, /* nop */ -}; - -/* Entries in a PIC procedure linkage table look like this. */ - -static const bfd_byte elf_sh64_pic_plt_entry_be[PLT_ENTRY_SIZE] = -{ - 0xcc, 0x00, 0x01, 0x90, /* movi nameN@GOT >> 16, r25 */ - 0xc8, 0x00, 0x01, 0x90, /* shori nameN@GOT & 65535, r25 */ - 0x40, 0xc3, 0x65, 0x90, /* ldx.q r12, r25, r25 */ - 0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */ - 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */ - 0x6f, 0xf0, 0xff, 0xf0, /* nop */ - 0x6f, 0xf0, 0xff, 0xf0, /* nop */ - 0x6f, 0xf0, 0xff, 0xf0, /* nop */ - 0xce, 0x00, 0x01, 0x10, /* movi -GOT_BIAS, r17 */ - 0x00, 0xc9, 0x45, 0x10, /* add r12, r17, r17 */ - 0x8d, 0x10, 0x09, 0x90, /* ld.q r17, 16, r25 */ - 0x6b, 0xf1, 0x66, 0x00, /* ptabs r25, tr0 */ - 0x8d, 0x10, 0x05, 0x10, /* ld.q r17, 8, r17 */ - 0xcc, 0x00, 0x01, 0x50, /* movi reloc-offset >> 16, r21 */ - 0xc8, 0x00, 0x01, 0x50, /* shori reloc-offset & 65535, r21 */ - 0x44, 0x01, 0xff, 0xf0, /* blink tr0, r63 */ -}; - -static const bfd_byte elf_sh64_pic_plt_entry_le[PLT_ENTRY_SIZE] = -{ - 0x90, 0x01, 0x00, 0xcc, /* movi nameN@GOT >> 16, r25 */ - 0x90, 0x01, 0x00, 0xc8, /* shori nameN@GOT & 65535, r25 */ - 0x90, 0x65, 0xc3, 0x40, /* ldx.q r12, r25, r25 */ - 0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */ - 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */ - 0xf0, 0xff, 0xf0, 0x6f, /* nop */ - 0xf0, 0xff, 0xf0, 0x6f, /* nop */ - 0xf0, 0xff, 0xf0, 0x6f, /* nop */ - 0x10, 0x01, 0x00, 0xce, /* movi -GOT_BIAS, r17 */ - 0x10, 0x45, 0xc9, 0x00, /* add r12, r17, r17 */ - 0x90, 0x09, 0x10, 0x8d, /* ld.q r17, 16, r25 */ - 0x00, 0x66, 0xf1, 0x6b, /* ptabs r25, tr0 */ - 0x10, 0x05, 0x10, 0x8d, /* ld.q r17, 8, r17 */ - 0x50, 0x01, 0x00, 0xcc, /* movi reloc-offset >> 16, r21 */ - 0x50, 0x01, 0x00, 0xc8, /* shori reloc-offset & 65535, r21 */ - 0xf0, 0xff, 0x01, 0x44, /* blink tr0, r63 */ -}; - -static const bfd_byte *elf_sh64_plt0_entry; -static const bfd_byte *elf_sh64_plt_entry; -static const bfd_byte *elf_sh64_pic_plt_entry; - -/* Create an entry in an sh ELF linker hash table. */ - -static struct bfd_hash_entry * -sh64_elf64_link_hash_newfunc (struct bfd_hash_entry *entry, - struct bfd_hash_table *table, - const char *string) -{ - struct elf_sh64_link_hash_entry *ret = - (struct elf_sh64_link_hash_entry *) entry; - - /* Allocate the structure if it has not already been allocated by a - subclass. */ - if (ret == (struct elf_sh64_link_hash_entry *) NULL) - ret = ((struct elf_sh64_link_hash_entry *) - bfd_hash_allocate (table, - sizeof (struct elf_sh64_link_hash_entry))); - if (ret == (struct elf_sh64_link_hash_entry *) NULL) - return (struct bfd_hash_entry *) ret; - - /* Call the allocation method of the superclass. */ - ret = ((struct elf_sh64_link_hash_entry *) - _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret, - table, string)); - if (ret != (struct elf_sh64_link_hash_entry *) NULL) - { - ret->pcrel_relocs_copied = NULL; - ret->datalabel_got_offset = (bfd_vma) -1; - } - - return (struct bfd_hash_entry *) ret; -} - -/* Create an sh64 ELF linker hash table. */ - -static struct bfd_link_hash_table * -sh64_elf64_link_hash_table_create (bfd *abfd) -{ - struct elf_link_hash_table *ret; - - ret = (struct elf_link_hash_table *) bfd_zmalloc (sizeof (* ret)); - if (ret == (struct elf_link_hash_table *) NULL) - return NULL; - - if (!_bfd_elf_link_hash_table_init (ret, abfd, - sh64_elf64_link_hash_newfunc, - sizeof (struct elf_sh64_link_hash_entry), - GENERIC_ELF_DATA)) - { - free (ret); - return NULL; - } - - return &ret->root; -} - -inline static void -movi_shori_putval (bfd *output_bfd, unsigned long value, bfd_byte *addr) -{ - bfd_put_32 (output_bfd, - bfd_get_32 (output_bfd, addr) - | ((value >> 6) & 0x3fffc00), - addr); - bfd_put_32 (output_bfd, - bfd_get_32 (output_bfd, addr + 4) - | ((value << 10) & 0x3fffc00), - addr + 4); -} - -inline static void -movi_3shori_putval (bfd *output_bfd, bfd_vma value, bfd_byte *addr) -{ - bfd_put_32 (output_bfd, - bfd_get_32 (output_bfd, addr) - | ((value >> 38) & 0x3fffc00), - addr); - bfd_put_32 (output_bfd, - bfd_get_32 (output_bfd, addr + 4) - | ((value >> 22) & 0x3fffc00), - addr + 4); - bfd_put_32 (output_bfd, - bfd_get_32 (output_bfd, addr + 8) - | ((value >> 6) & 0x3fffc00), - addr + 8); - bfd_put_32 (output_bfd, - bfd_get_32 (output_bfd, addr + 12) - | ((value << 10) & 0x3fffc00), - addr + 12); -} - -/* Create dynamic sections when linking against a dynamic object. */ - -static bfd_boolean -sh64_elf64_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) -{ - flagword flags, pltflags; - register asection *s; - const struct elf_backend_data *bed = get_elf_backend_data (abfd); - int ptralign = 0; - - switch (bed->s->arch_size) - { - case 32: - ptralign = 2; - break; - - case 64: - ptralign = 3; - break; - - default: - bfd_set_error (bfd_error_bad_value); - return FALSE; - } - - /* We need to create .plt, .rel[a].plt, .got, .got.plt, .dynbss, and - .rel[a].bss sections. */ - - flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY - | SEC_LINKER_CREATED); - - pltflags = flags; - pltflags |= SEC_CODE; - if (bed->plt_not_loaded) - pltflags &= ~ (SEC_LOAD | SEC_HAS_CONTENTS); - if (bed->plt_readonly) - pltflags |= SEC_READONLY; - - s = bfd_make_section_anyway_with_flags (abfd, ".plt", pltflags); - if (s == NULL - || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment)) - return FALSE; - - if (bed->want_plt_sym) - { - /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the - .plt section. */ - struct elf_link_hash_entry *h; - struct bfd_link_hash_entry *bh = NULL; - - if (! (_bfd_generic_link_add_one_symbol - (info, abfd, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL, s, - (bfd_vma) 0, (const char *) NULL, FALSE, bed->collect, &bh))) - return FALSE; - - h = (struct elf_link_hash_entry *) bh; - h->def_regular = 1; - h->type = STT_OBJECT; - elf_hash_table (info)->hplt = h; - - if (bfd_link_pic (info) - && ! bfd_elf_link_record_dynamic_symbol (info, h)) - return FALSE; - } - - s = bfd_make_section_anyway_with_flags (abfd, - bed->default_use_rela_p - ? ".rela.plt" : ".rel.plt", - flags | SEC_READONLY); - if (s == NULL - || ! bfd_set_section_alignment (abfd, s, ptralign)) - return FALSE; - - if (! _bfd_elf_create_got_section (abfd, info)) - return FALSE; - - if (bed->want_dynbss) - { - /* The .dynbss section is a place to put symbols which are defined - by dynamic objects, are referenced by regular objects, and are - not functions. We must allocate space for them in the process - image and use a R_*_COPY reloc to tell the dynamic linker to - initialize them at run time. The linker script puts the .dynbss - section into the .bss section of the final image. */ - s = bfd_make_section_anyway_with_flags (abfd, ".dynbss", - SEC_ALLOC | SEC_LINKER_CREATED); - if (s == NULL) - return FALSE; - - /* The .rel[a].bss section holds copy relocs. This section is not - normally needed. We need to create it here, though, so that the - linker will map it to an output section. We can't just create it - only if we need it, because we will not know whether we need it - until we have seen all the input files, and the first time the - main linker code calls BFD after examining all the input files - (size_dynamic_sections) the input sections have already been - mapped to the output sections. If the section turns out not to - be needed, we can discard it later. We will never need this - section when generating a shared object, since they do not use - copy relocs. */ - if (! bfd_link_pic (info)) - { - s = bfd_make_section_anyway_with_flags (abfd, - (bed->default_use_rela_p - ? ".rela.bss" : ".rel.bss"), - flags | SEC_READONLY); - if (s == NULL - || ! bfd_set_section_alignment (abfd, s, ptralign)) - return FALSE; - } - } - - return TRUE; -} - -/* Adjust a symbol defined by a dynamic object and referenced by a - regular object. The current definition is in some section of the - dynamic object, but we're not including those sections. We have to - change the definition to something the rest of the link can - understand. */ - -static bfd_boolean -sh64_elf64_adjust_dynamic_symbol (struct bfd_link_info *info, - struct elf_link_hash_entry *h) -{ - bfd *dynobj; - asection *s; - - dynobj = elf_hash_table (info)->dynobj; - - /* Make sure we know what is going on here. */ - BFD_ASSERT (dynobj != NULL - && (h->needs_plt - || h->is_weakalias - || (h->def_dynamic - && h->ref_regular - && !h->def_regular))); - - /* If this is a function, put it in the procedure linkage table. We - will fill in the contents of the procedure linkage table later, - when we know the address of the .got section. */ - if (h->type == STT_FUNC - || h->needs_plt) - { - if (! bfd_link_pic (info) - && !h->def_dynamic - && !h->ref_dynamic) - { - /* This case can occur if we saw a PLT reloc in an input - file, but the symbol was never referred to by a dynamic - object. In such a case, we don't actually need to build - a procedure linkage table, and we can just do a REL64 - reloc instead. */ - BFD_ASSERT (h->needs_plt); - return TRUE; - } - - /* Make sure this symbol is output as a dynamic symbol. */ - if (h->dynindx == -1) - { - if (! bfd_elf_link_record_dynamic_symbol (info, h)) - return FALSE; - } - - s = elf_hash_table (info)->splt; - BFD_ASSERT (s != NULL); - - /* If this is the first .plt entry, make room for the special - first entry. */ - if (s->size == 0) - s->size += PLT_ENTRY_SIZE; - - /* If this symbol is not defined in a regular file, and we are - not generating a shared library, then set the symbol to this - location in the .plt. This is required to make function - pointers compare as equal between the normal executable and - the shared library. */ - if (! bfd_link_pic (info) - && !h->def_regular) - { - h->root.u.def.section = s; - h->root.u.def.value = s->size; - } - - h->plt.offset = s->size; - - /* Make room for this entry. */ - s->size += elf_sh64_sizeof_plt (info); - - /* We also need to make an entry in the .got.plt section, which - will be placed in the .got section by the linker script. */ - - s = elf_hash_table (info)->sgotplt; - BFD_ASSERT (s != NULL); - s->size += 8; - - /* We also need to make an entry in the .rela.plt section. */ - - s = elf_hash_table (info)->srelplt; - BFD_ASSERT (s != NULL); - s->size += sizeof (Elf64_External_Rela); - - return TRUE; - } - - /* If this is a weak symbol, and there is a real definition, the - processor independent code will have arranged for us to see the - real definition first, and we can just use the same value. */ - if (h->is_weakalias) - { - struct elf_link_hash_entry *def = weakdef (h); - BFD_ASSERT (def->root.type == bfd_link_hash_defined); - h->root.u.def.section = def->root.u.def.section; - h->root.u.def.value = def->root.u.def.value; - return TRUE; - } - - /* This is a reference to a symbol defined by a dynamic object which - is not a function. */ - - /* If we are creating a shared library, we must presume that the - only references to the symbol are via the global offset table. - For such cases we need not do anything here; the relocations will - be handled correctly by relocate_section. */ - if (bfd_link_pic (info)) - return TRUE; - - /* If there are no references to this symbol that do not use the - GOT, we don't need to generate a copy reloc. */ - if (!h->non_got_ref) - return TRUE; - - /* We must allocate the symbol in our .dynbss section, which will - become part of the .bss section of the executable. There will be - an entry for this symbol in the .dynsym section. The dynamic - object will contain position independent code, so all references - from the dynamic object to this symbol will go through the global - offset table. The dynamic linker will use the .dynsym entry to - determine the address it must put in the global offset table, so - both the dynamic object and the regular object will refer to the - same memory location for the variable. */ - - s = bfd_get_linker_section (dynobj, ".dynbss"); - BFD_ASSERT (s != NULL); - - /* We must generate a R_SH_COPY reloc to tell the dynamic linker to - copy the initial value out of the dynamic object and into the - runtime process image. We need to remember the offset into the - .rela.bss section we are going to use. */ - if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0) - { - asection *srel; - - srel = bfd_get_linker_section (dynobj, ".rela.bss"); - BFD_ASSERT (srel != NULL); - srel->size += sizeof (Elf64_External_Rela); - h->needs_copy = 1; - } - - return _bfd_elf_adjust_dynamic_copy (info, h, s); -} - -/* This function is called via sh_elf_link_hash_traverse if we are - creating a shared object with -Bsymbolic. It discards the space - allocated to copy PC relative relocs against symbols which are - defined in regular objects. We allocated space for them in the - check_relocs routine, but we won't fill them in in the - relocate_section routine. */ - -static bfd_boolean -sh64_elf64_discard_copies (struct elf_sh64_link_hash_entry *h, - void *ignore ATTRIBUTE_UNUSED) -{ - struct elf_sh64_pcrel_relocs_copied *s; - - /* We only discard relocs for symbols defined in a regular object. */ - if (!h->root.def_regular) - return TRUE; - - for (s = h->pcrel_relocs_copied; s != NULL; s = s->next) - s->section->size -= s->count * sizeof (Elf64_External_Rela); - - return TRUE; -} - -/* Set the sizes of the dynamic sections. */ - -static bfd_boolean -sh64_elf64_size_dynamic_sections (bfd *output_bfd, - struct bfd_link_info *info) -{ - bfd *dynobj; - asection *s; - bfd_boolean plt; - bfd_boolean relocs; - bfd_boolean reltext; - - dynobj = elf_hash_table (info)->dynobj; - BFD_ASSERT (dynobj != NULL); - - if (elf_hash_table (info)->dynamic_sections_created) - { - /* Set the contents of the .interp section to the interpreter. */ - if (bfd_link_executable (info) && !info->nointerp) - { - s = bfd_get_linker_section (dynobj, ".interp"); - BFD_ASSERT (s != NULL); - s->size = sizeof ELF_DYNAMIC_INTERPRETER; - s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER; - } - } - else - { - /* We may have created entries in the .rela.got section. - However, if we are not creating the dynamic sections, we will - not actually use these entries. Reset the size of .rela.got, - which will cause it to get stripped from the output file - below. */ - s = elf_hash_table (info)->srelgot; - if (s != NULL) - s->size = 0; - } - - /* If this is a -Bsymbolic shared link, then we need to discard all - PC relative relocs against symbols defined in a regular object. - We allocated space for them in the check_relocs routine, but we - will not fill them in in the relocate_section routine. */ - if (bfd_link_pic (info) && info->symbolic) - sh64_elf64_link_hash_traverse (elf_hash_table (info), - sh64_elf64_discard_copies, NULL); - - /* The check_relocs and adjust_dynamic_symbol entry points have - determined the sizes of the various dynamic sections. Allocate - memory for them. */ - plt = FALSE; - relocs = FALSE; - reltext = FALSE; - for (s = dynobj->sections; s != NULL; s = s->next) - { - const char *name; - - if ((s->flags & SEC_LINKER_CREATED) == 0) - continue; - - /* It's OK to base decisions on the section name, because none - of the dynobj section names depend upon the input files. */ - name = bfd_get_section_name (dynobj, s); - - if (strcmp (name, ".plt") == 0) - { - /* Remember whether there is a PLT. */ - plt = s->size != 0; - } - else if (CONST_STRNEQ (name, ".rela")) - { - if (s->size != 0) - { - asection *target; - - /* Remember whether there are any reloc sections other - than .rela.plt. */ - if (strcmp (name, ".rela.plt") != 0) - { - const char *outname; - - relocs = TRUE; - - /* If this relocation section applies to a read only - section, then we probably need a DT_TEXTREL - entry. The entries in the .rela.plt section - really apply to the .got section, which we - created ourselves and so know is not readonly. */ - outname = bfd_get_section_name (output_bfd, - s->output_section); - target = bfd_get_section_by_name (output_bfd, outname + 5); - if (target != NULL - && (target->flags & SEC_READONLY) != 0 - && (target->flags & SEC_ALLOC) != 0) - reltext = TRUE; - } - - /* We use the reloc_count field as a counter if we need - to copy relocs into the output file. */ - s->reloc_count = 0; - } - } - else if (! CONST_STRNEQ (name, ".got") - && strcmp (name, ".dynbss") != 0) - { - /* It's not one of our sections, so don't allocate space. */ - continue; - } - - if (s->size == 0) - { - /* If we don't need this section, strip it from the - output file. This is mostly to handle .rela.bss and - .rela.plt. We must create both sections in - create_dynamic_sections, because they must be created - before the linker maps input sections to output - sections. The linker does that before - adjust_dynamic_symbol is called, and it is that - function which decides whether anything needs to go - into these sections. */ - s->flags |= SEC_EXCLUDE; - continue; - } - - if ((s->flags & SEC_HAS_CONTENTS) == 0) - continue; - - /* Allocate memory for the section contents. */ - s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size); - if (s->contents == NULL) - return FALSE; - } - - if (elf_hash_table (info)->dynamic_sections_created) - { - /* Add some entries to the .dynamic section. We fill in the - values later, in sh64_elf64_finish_dynamic_sections, but we - must add the entries now so that we get the correct size for - the .dynamic section. The DT_DEBUG entry is filled in by the - dynamic linker and used by the debugger. */ - if (bfd_link_executable (info)) - { - if (!_bfd_elf_add_dynamic_entry (info, DT_DEBUG, 0)) - return FALSE; - } - - if (plt) - { - if (!_bfd_elf_add_dynamic_entry (info, DT_PLTGOT, 0) - || !_bfd_elf_add_dynamic_entry (info, DT_PLTRELSZ, 0) - || !_bfd_elf_add_dynamic_entry (info, DT_PLTREL, DT_RELA) - || !_bfd_elf_add_dynamic_entry (info, DT_JMPREL, 0)) - return FALSE; - } - - if (relocs) - { - if (!_bfd_elf_add_dynamic_entry (info, DT_RELA, 0) - || !_bfd_elf_add_dynamic_entry (info, DT_RELASZ, 0) - || !_bfd_elf_add_dynamic_entry (info, DT_RELAENT, - sizeof (Elf64_External_Rela))) - return FALSE; - } - - if (reltext) - { - if (!_bfd_elf_add_dynamic_entry (info, DT_TEXTREL, 0)) - return FALSE; - } - } - - return TRUE; -} - -/* Finish up dynamic symbol handling. We set the contents of various - dynamic sections here. */ - -static bfd_boolean -sh64_elf64_finish_dynamic_symbol (bfd *output_bfd, - struct bfd_link_info *info, - struct elf_link_hash_entry *h, - Elf_Internal_Sym *sym) -{ - bfd *dynobj; - - dynobj = elf_hash_table (info)->dynobj; - - if (h->plt.offset != (bfd_vma) -1) - { - asection *splt; - asection *sgot; - asection *srel; - - bfd_vma plt_index; - bfd_vma got_offset; - Elf_Internal_Rela rel; - bfd_byte *loc; - - /* This symbol has an entry in the procedure linkage table. Set - it up. */ - - BFD_ASSERT (h->dynindx != -1); - - splt = elf_hash_table (info)->splt; - sgot = elf_hash_table (info)->sgotplt; - srel = elf_hash_table (info)->srelplt; - BFD_ASSERT (splt != NULL && sgot != NULL && srel != NULL); - - /* Get the index in the procedure linkage table which - corresponds to this symbol. This is the index of this symbol - in all the symbols for which we are making plt entries. The - first entry in the procedure linkage table is reserved. */ - plt_index = h->plt.offset / elf_sh64_sizeof_plt (info) - 1; - - /* Get the offset into the .got table of the entry that - corresponds to this function. Each .got entry is 8 bytes. - The first three are reserved. */ - got_offset = (plt_index + 3) * 8; - - if (bfd_link_pic (info)) - got_offset -= GOT_BIAS; - - /* Fill in the entry in the procedure linkage table. */ - if (! bfd_link_pic (info)) - { - if (elf_sh64_plt_entry == NULL) - { - elf_sh64_plt_entry = (bfd_big_endian (output_bfd) ? - elf_sh64_plt_entry_be : elf_sh64_plt_entry_le); - } - memcpy (splt->contents + h->plt.offset, elf_sh64_plt_entry, - elf_sh64_sizeof_plt (info)); - movi_3shori_putval (output_bfd, - (sgot->output_section->vma - + sgot->output_offset - + got_offset), - (splt->contents + h->plt.offset - + elf_sh64_plt_symbol_offset (info))); - - /* Set bottom bit because its for a branch to SHmedia */ - movi_shori_putval (output_bfd, - -(h->plt.offset - + elf_sh64_plt_plt0_offset (info) + 8) - | 1, - (splt->contents + h->plt.offset - + elf_sh64_plt_plt0_offset (info))); - } - else - { - if (elf_sh64_pic_plt_entry == NULL) - { - elf_sh64_pic_plt_entry = (bfd_big_endian (output_bfd) ? - elf_sh64_pic_plt_entry_be : - elf_sh64_pic_plt_entry_le); - } - memcpy (splt->contents + h->plt.offset, elf_sh64_pic_plt_entry, - elf_sh64_sizeof_plt (info)); - movi_shori_putval (output_bfd, got_offset, - (splt->contents + h->plt.offset - + elf_sh64_plt_symbol_offset (info))); - } - - if (bfd_link_pic (info)) - got_offset += GOT_BIAS; - - movi_shori_putval (output_bfd, - plt_index * sizeof (Elf64_External_Rela), - (splt->contents + h->plt.offset - + elf_sh64_plt_reloc_offset (info))); - - /* Fill in the entry in the global offset table. */ - bfd_put_64 (output_bfd, - (splt->output_section->vma - + splt->output_offset - + h->plt.offset - + elf_sh64_plt_temp_offset (info)), - sgot->contents + got_offset); - - /* Fill in the entry in the .rela.plt section. */ - rel.r_offset = (sgot->output_section->vma - + sgot->output_offset - + got_offset); - rel.r_info = ELF64_R_INFO (h->dynindx, R_SH_JMP_SLOT64); - rel.r_addend = 0; - rel.r_addend = GOT_BIAS; - loc = srel->contents + plt_index * sizeof (Elf64_External_Rela); - bfd_elf64_swap_reloca_out (output_bfd, &rel, loc); - - if (!h->def_regular) - { - /* Mark the symbol as undefined, rather than as defined in - the .plt section. Leave the value alone. */ - sym->st_shndx = SHN_UNDEF; - } - } - - if (h->got.offset != (bfd_vma) -1) - { - asection *sgot; - asection *srel; - Elf_Internal_Rela rel; - bfd_byte *loc; - - /* This symbol has an entry in the global offset table. Set it - up. */ - - sgot = elf_hash_table (info)->sgot; - srel = elf_hash_table (info)->srelgot; - BFD_ASSERT (sgot != NULL && srel != NULL); - - rel.r_offset = (sgot->output_section->vma - + sgot->output_offset - + (h->got.offset &~ 1)); - - /* If this is a -Bsymbolic link, and the symbol is defined - locally, we just want to emit a RELATIVE reloc. Likewise if - the symbol was forced to be local because of a version file. - The entry in the global offset table will already have been - initialized in the relocate_section function. */ - if (bfd_link_pic (info) - && (info->symbolic || h->dynindx == -1) - && h->def_regular) - { - rel.r_info = ELF64_R_INFO (0, R_SH_RELATIVE64); - rel.r_addend = (h->root.u.def.value - + h->root.u.def.section->output_section->vma - + h->root.u.def.section->output_offset); - } - else - { - bfd_put_64 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset); - rel.r_info = ELF64_R_INFO (h->dynindx, R_SH_GLOB_DAT64); - rel.r_addend = 0; - } - - loc = srel->contents; - loc += srel->reloc_count++ * sizeof (Elf64_External_Rela); - bfd_elf64_swap_reloca_out (output_bfd, &rel, loc); - } - - if (h->needs_copy) - { - asection *s; - Elf_Internal_Rela rel; - bfd_byte *loc; - - /* This symbol needs a copy reloc. Set it up. */ - - BFD_ASSERT (h->dynindx != -1 - && (h->root.type == bfd_link_hash_defined - || h->root.type == bfd_link_hash_defweak)); - - s = bfd_get_linker_section (dynobj, ".rela.bss"); - BFD_ASSERT (s != NULL); - - rel.r_offset = (h->root.u.def.value - + h->root.u.def.section->output_section->vma - + h->root.u.def.section->output_offset); - rel.r_info = ELF64_R_INFO (h->dynindx, R_SH_COPY64); - rel.r_addend = 0; - loc = s->contents; - loc += s->reloc_count++ * sizeof (Elf64_External_Rela); - bfd_elf64_swap_reloca_out (output_bfd, &rel, loc); - } - - /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */ - if (h == elf_hash_table (info)->hdynamic - || h == elf_hash_table (info)->hgot) - sym->st_shndx = SHN_ABS; - - return TRUE; -} - -/* Finish up the dynamic sections. */ - -static bfd_boolean -sh64_elf64_finish_dynamic_sections (bfd *output_bfd, - struct bfd_link_info *info) -{ - bfd *dynobj; - asection *sgot; - asection *sdyn; - - dynobj = elf_hash_table (info)->dynobj; - - sgot = elf_hash_table (info)->sgotplt; - BFD_ASSERT (sgot != NULL); - sdyn = bfd_get_linker_section (dynobj, ".dynamic"); - - if (elf_hash_table (info)->dynamic_sections_created) - { - asection *splt; - Elf64_External_Dyn *dyncon, *dynconend; - - BFD_ASSERT (sdyn != NULL); - - dyncon = (Elf64_External_Dyn *) sdyn->contents; - dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size); - for (; dyncon < dynconend; dyncon++) - { - Elf_Internal_Dyn dyn; - const char *name; - asection *s; - struct elf_link_hash_entry *h; - - bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn); - - switch (dyn.d_tag) - { - default: - break; - - case DT_INIT: - name = info->init_function; - goto get_sym; - - case DT_FINI: - name = info->fini_function; - get_sym: - if (dyn.d_un.d_val != 0) - { - h = elf_link_hash_lookup (elf_hash_table (info), name, - FALSE, FALSE, TRUE); - if (h != NULL && (h->other & STO_SH5_ISA32)) - { - dyn.d_un.d_val |= 1; - bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon); - } - } - break; - - case DT_PLTGOT: - s = elf_hash_table (info)->sgotplt; - goto get_vma; - - case DT_JMPREL: - s = elf_hash_table (info)->srelplt; - get_vma: - dyn.d_un.d_ptr = s->output_section->vma + s->output_offset; - bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon); - break; - - case DT_PLTRELSZ: - s = elf_hash_table (info)->srelplt; - dyn.d_un.d_val = s->size; - bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon); - break; - } - } - - /* Fill in the first entry in the procedure linkage table. */ - splt = elf_hash_table (info)->splt; - if (splt && splt->size > 0) - { - if (bfd_link_pic (info)) - { - if (elf_sh64_pic_plt_entry == NULL) - { - elf_sh64_pic_plt_entry = (bfd_big_endian (output_bfd) ? - elf_sh64_pic_plt_entry_be : - elf_sh64_pic_plt_entry_le); - } - memcpy (splt->contents, elf_sh64_pic_plt_entry, - elf_sh64_sizeof_plt (info)); - } - else - { - if (elf_sh64_plt0_entry == NULL) - { - elf_sh64_plt0_entry = (bfd_big_endian (output_bfd) ? - elf_sh64_plt0_entry_be : - elf_sh64_plt0_entry_le); - } - memcpy (splt->contents, elf_sh64_plt0_entry, PLT_ENTRY_SIZE); - movi_3shori_putval (output_bfd, - sgot->output_section->vma - + sgot->output_offset, - splt->contents - + elf_sh64_plt0_gotplt_offset (info)); - } - - /* UnixWare sets the entsize of .plt to 8, although that doesn't - really seem like the right value. */ - elf_section_data (splt->output_section)->this_hdr.sh_entsize = 8; - } - } - - /* Fill in the first three entries in the global offset table. */ - if (sgot->size > 0) - { - if (sdyn == NULL) - bfd_put_64 (output_bfd, (bfd_vma) 0, sgot->contents); - else - bfd_put_64 (output_bfd, - sdyn->output_section->vma + sdyn->output_offset, - sgot->contents); - bfd_put_64 (output_bfd, (bfd_vma) 0, sgot->contents + 8); - bfd_put_64 (output_bfd, (bfd_vma) 0, sgot->contents + 16); - } - - elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 8; - - return TRUE; -} - -/* Merge non visibility st_other attribute when the symbol comes from - a dynamic object. */ -static void -sh64_elf64_merge_symbol_attribute (struct elf_link_hash_entry *h, - const Elf_Internal_Sym *isym, - bfd_boolean definition, - bfd_boolean dynamic ATTRIBUTE_UNUSED) -{ - if ((isym->st_other & ~ELF_ST_VISIBILITY (-1)) != 0) - { - unsigned char other; - - /* Take the balance of OTHER from the definition. */ - other = (definition ? isym->st_other : h->other); - other &= ~ ELF_ST_VISIBILITY (-1); - h->other = other | ELF_ST_VISIBILITY (h->other); - } - - return; -} - -static const struct bfd_elf_special_section sh64_elf64_special_sections[]= -{ - { STRING_COMMA_LEN (".cranges"), 0, SHT_PROGBITS, 0 }, - { NULL, 0, 0, 0, 0 } -}; - -#define TARGET_BIG_SYM sh64_elf64_vec -#define TARGET_BIG_NAME "elf64-sh64" -#define TARGET_LITTLE_SYM sh64_elf64_le_vec -#define TARGET_LITTLE_NAME "elf64-sh64l" -#define ELF_ARCH bfd_arch_sh -#define ELF_MACHINE_CODE EM_SH -#define ELF_MAXPAGESIZE 128 - -#define elf_symbol_leading_char '_' - -#define bfd_elf64_bfd_reloc_type_lookup sh_elf64_reloc_type_lookup -#define bfd_elf64_bfd_reloc_name_lookup \ - sh_elf64_reloc_name_lookup -#define elf_info_to_howto sh_elf64_info_to_howto - -/* Note: there's no relaxation at present. */ - -#define elf_backend_relocate_section sh_elf64_relocate_section -#define bfd_elf64_bfd_get_relocated_section_contents \ - sh_elf64_get_relocated_section_contents -#define elf_backend_object_p sh_elf64_set_mach_from_flags -#define bfd_elf64_bfd_set_private_flags \ - sh_elf64_set_private_flags -#define bfd_elf64_bfd_copy_private_bfd_data \ - sh_elf64_copy_private_data -#define bfd_elf64_bfd_merge_private_bfd_data \ - sh_elf64_merge_private_data -#define elf_backend_fake_sections sh64_elf64_fake_sections - -#define elf_backend_gc_mark_hook sh_elf64_gc_mark_hook -#define elf_backend_check_relocs sh_elf64_check_relocs - -#define elf_backend_can_gc_sections 1 - -#define elf_backend_get_symbol_type sh64_elf64_get_symbol_type - -#define elf_backend_add_symbol_hook sh64_elf64_add_symbol_hook - -#define elf_backend_link_output_symbol_hook \ - sh64_elf64_link_output_symbol_hook - -#define elf_backend_merge_symbol_attribute \ - sh64_elf64_merge_symbol_attribute - -#define elf_backend_final_write_processing \ - sh64_elf64_final_write_processing - -#define elf_backend_create_dynamic_sections \ - sh64_elf64_create_dynamic_sections -#define bfd_elf64_bfd_link_hash_table_create \ - sh64_elf64_link_hash_table_create -#define elf_backend_adjust_dynamic_symbol \ - sh64_elf64_adjust_dynamic_symbol -#define elf_backend_size_dynamic_sections \ - sh64_elf64_size_dynamic_sections -#define elf_backend_omit_section_dynsym _bfd_elf_omit_section_dynsym_all -#define elf_backend_finish_dynamic_symbol \ - sh64_elf64_finish_dynamic_symbol -#define elf_backend_finish_dynamic_sections \ - sh64_elf64_finish_dynamic_sections -#define elf_backend_special_sections sh64_elf64_special_sections - -#define elf_backend_want_got_plt 1 -#define elf_backend_plt_readonly 1 -#define elf_backend_want_plt_sym 0 -#define elf_backend_got_header_size 24 -#define elf_backend_dtrel_excludes_plt 1 - -#define elf_backend_linux_prpsinfo64_ugid16 TRUE - -#include "elf64-target.h" - -/* NetBSD support. */ -#undef TARGET_BIG_SYM -#define TARGET_BIG_SYM sh64_elf64_nbsd_vec -#undef TARGET_BIG_NAME -#define TARGET_BIG_NAME "elf64-sh64-nbsd" -#undef TARGET_LITTLE_SYM -#define TARGET_LITTLE_SYM sh64_elf64_nbsd_le_vec -#undef TARGET_LITTLE_NAME -#define TARGET_LITTLE_NAME "elf64-sh64l-nbsd" -#undef ELF_MAXPAGESIZE -#define ELF_MAXPAGESIZE 0x10000 -#undef elf_symbol_leading_char -#define elf_symbol_leading_char 0 - -#define elf64_bed elf64_sh64_nbsd_bed - -#include "elf64-target.h" - -/* Linux support. */ -#undef TARGET_BIG_SYM -#define TARGET_BIG_SYM sh64_elf64_linux_be_vec -#undef TARGET_BIG_NAME -#define TARGET_BIG_NAME "elf64-sh64big-linux" -#undef TARGET_LITTLE_SYM -#define TARGET_LITTLE_SYM sh64_elf64_linux_vec -#undef TARGET_LITTLE_NAME -#define TARGET_LITTLE_NAME "elf64-sh64-linux" -#undef elf64_bed -#define elf64_bed elf64_sh64_linux_bed - -#include "elf64-target.h" diff --git a/bfd/po/SRC-POTFILES.in b/bfd/po/SRC-POTFILES.in index 9738035..bd42206 100644 --- a/bfd/po/SRC-POTFILES.in +++ b/bfd/po/SRC-POTFILES.in @@ -202,8 +202,6 @@ elf32-s390.c elf32-score.c elf32-score7.c elf32-sh.c -elf32-sh64-com.c -elf32-sh64.c elf32-sparc.c elf32-spu.c elf32-tic6x.c @@ -227,7 +225,6 @@ elf64-mips.c elf64-mmix.c elf64-ppc.c elf64-s390.c -elf64-sh64.c elf64-sparc.c elf64-tilegx.c elf64-x86-64.c diff --git a/bfd/targets.c b/bfd/targets.c index 64e3178..6f683f5 100644 --- a/bfd/targets.c +++ b/bfd/targets.c @@ -805,18 +805,6 @@ extern const bfd_target s390_elf32_vec; extern const bfd_target s390_elf64_vec; extern const bfd_target score_elf32_be_vec; extern const bfd_target score_elf32_le_vec; -extern const bfd_target sh64_elf32_vec; -extern const bfd_target sh64_elf32_le_vec; -extern const bfd_target sh64_elf32_linux_vec; -extern const bfd_target sh64_elf32_linux_be_vec; -extern const bfd_target sh64_elf32_nbsd_vec; -extern const bfd_target sh64_elf32_nbsd_le_vec; -extern const bfd_target sh64_elf64_vec; -extern const bfd_target sh64_elf64_le_vec; -extern const bfd_target sh64_elf64_linux_vec; -extern const bfd_target sh64_elf64_linux_be_vec; -extern const bfd_target sh64_elf64_nbsd_vec; -extern const bfd_target sh64_elf64_nbsd_le_vec; extern const bfd_target sh_coff_vec; extern const bfd_target sh_coff_le_vec; extern const bfd_target sh_coff_small_vec; @@ -1295,20 +1283,6 @@ static const bfd_target * const _bfd_target_vector[] = &score_elf32_le_vec, #endif -#ifdef BFD64 - &sh64_elf32_vec, - &sh64_elf32_le_vec, - &sh64_elf32_linux_vec, - &sh64_elf32_linux_be_vec, - &sh64_elf32_nbsd_vec, - &sh64_elf32_nbsd_le_vec, - &sh64_elf64_vec, - &sh64_elf64_le_vec, - &sh64_elf64_linux_vec, - &sh64_elf64_linux_be_vec, - &sh64_elf64_nbsd_vec, - &sh64_elf64_nbsd_le_vec, -#endif &sh_coff_vec, &sh_coff_le_vec, &sh_coff_small_vec, -- cgit v1.1