X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=bfd%2Felf32-s390.c;h=2934f18c8b8ca2a320418f5b10338ca440f67a51;hb=924cf858c94ebc3f54e1e2e0710099fb94e2c901;hp=eaf2bf14c01408913d909308838caa266e780f54;hpb=b27bb18f45a99330600ab57892c3620343425910;p=binutils-gdb.git diff --git a/bfd/elf32-s390.c b/bfd/elf32-s390.c index eaf2bf14c01..2934f18c8b8 100644 --- a/bfd/elf32-s390.c +++ b/bfd/elf32-s390.c @@ -1,5 +1,5 @@ /* IBM S/390-specific support for 32-bit ELF - Copyright (C) 2000-2017 Free Software Foundation, Inc. + Copyright (C) 2000-2022 Free Software Foundation, Inc. Contributed by Carl B. Pedersen and Martin Schwidefsky. This file is part of BFD, the Binary File Descriptor library. @@ -42,140 +42,140 @@ static reloc_howto_type elf_howto_table[] = 0, /* rightshift */ 3, /* size (0 = byte, 1 = 2 byte, 2 = 4 byte) */ 0, /* bitsize */ - FALSE, /* pc_relative */ + false, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_390_NONE", /* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0, /* src_mask */ 0, /* dst_mask */ - FALSE), /* pcrel_offset */ - - HOWTO(R_390_8, 0, 0, 8, FALSE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_8", FALSE, 0,0x000000ff, FALSE), - HOWTO(R_390_12, 0, 1, 12, FALSE, 0, complain_overflow_dont, - bfd_elf_generic_reloc, "R_390_12", FALSE, 0,0x00000fff, FALSE), - HOWTO(R_390_16, 0, 1, 16, FALSE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_16", FALSE, 0,0x0000ffff, FALSE), - HOWTO(R_390_32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_32", FALSE, 0,0xffffffff, FALSE), - HOWTO(R_390_PC32, 0, 2, 32, TRUE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_PC32", FALSE, 0,0xffffffff, TRUE), - HOWTO(R_390_GOT12, 0, 1, 12, FALSE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_GOT12", FALSE, 0,0x00000fff, FALSE), - HOWTO(R_390_GOT32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_GOT32", FALSE, 0,0xffffffff, FALSE), - HOWTO(R_390_PLT32, 0, 2, 32, TRUE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_PLT32", FALSE, 0,0xffffffff, TRUE), - HOWTO(R_390_COPY, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_COPY", FALSE, 0,0xffffffff, FALSE), - HOWTO(R_390_GLOB_DAT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_GLOB_DAT", FALSE, 0,0xffffffff, FALSE), - HOWTO(R_390_JMP_SLOT, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_JMP_SLOT", FALSE, 0,0xffffffff, FALSE), - HOWTO(R_390_RELATIVE, 0, 2, 32, TRUE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_RELATIVE", FALSE, 0,0xffffffff, FALSE), - HOWTO(R_390_GOTOFF32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_GOTOFF32", FALSE, 0,0xffffffff, FALSE), - HOWTO(R_390_GOTPC, 0, 2, 32, TRUE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_GOTPC", FALSE, 0,0xffffffff, TRUE), - HOWTO(R_390_GOT16, 0, 1, 16, FALSE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_GOT16", FALSE, 0,0x0000ffff, FALSE), - HOWTO(R_390_PC16, 0, 1, 16, TRUE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_PC16", FALSE, 0,0x0000ffff, TRUE), - HOWTO(R_390_PC16DBL, 1, 1, 16, TRUE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_PC16DBL", FALSE, 0,0x0000ffff, TRUE), - HOWTO(R_390_PLT16DBL, 1, 1, 16, TRUE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_PLT16DBL", FALSE, 0,0x0000ffff, TRUE), - HOWTO(R_390_PC32DBL, 1, 2, 32, TRUE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_PC32DBL", FALSE, 0,0xffffffff, TRUE), - HOWTO(R_390_PLT32DBL, 1, 2, 32, TRUE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_PLT32DBL", FALSE, 0,0xffffffff, TRUE), - HOWTO(R_390_GOTPCDBL, 1, 2, 32, TRUE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_GOTPCDBL", FALSE, 0,0xffffffff, TRUE), + false), /* pcrel_offset */ + + HOWTO(R_390_8, 0, 0, 8, false, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_8", false, 0,0x000000ff, false), + HOWTO(R_390_12, 0, 1, 12, false, 0, complain_overflow_dont, + bfd_elf_generic_reloc, "R_390_12", false, 0,0x00000fff, false), + HOWTO(R_390_16, 0, 1, 16, false, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_16", false, 0,0x0000ffff, false), + HOWTO(R_390_32, 0, 2, 32, false, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_32", false, 0,0xffffffff, false), + HOWTO(R_390_PC32, 0, 2, 32, true, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_PC32", false, 0,0xffffffff, true), + HOWTO(R_390_GOT12, 0, 1, 12, false, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_GOT12", false, 0,0x00000fff, false), + HOWTO(R_390_GOT32, 0, 2, 32, false, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_GOT32", false, 0,0xffffffff, false), + HOWTO(R_390_PLT32, 0, 2, 32, true, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_PLT32", false, 0,0xffffffff, true), + HOWTO(R_390_COPY, 0, 2, 32, false, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_COPY", false, 0,0xffffffff, false), + HOWTO(R_390_GLOB_DAT, 0, 2, 32, false, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_GLOB_DAT", false, 0,0xffffffff, false), + HOWTO(R_390_JMP_SLOT, 0, 2, 32, false, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_JMP_SLOT", false, 0,0xffffffff, false), + HOWTO(R_390_RELATIVE, 0, 2, 32, true, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_RELATIVE", false, 0,0xffffffff, false), + HOWTO(R_390_GOTOFF32, 0, 2, 32, false, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_GOTOFF32", false, 0,0xffffffff, false), + HOWTO(R_390_GOTPC, 0, 2, 32, true, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_GOTPC", false, 0,0xffffffff, true), + HOWTO(R_390_GOT16, 0, 1, 16, false, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_GOT16", false, 0,0x0000ffff, false), + HOWTO(R_390_PC16, 0, 1, 16, true, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_PC16", false, 0,0x0000ffff, true), + HOWTO(R_390_PC16DBL, 1, 1, 16, true, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_PC16DBL", false, 0,0x0000ffff, true), + HOWTO(R_390_PLT16DBL, 1, 1, 16, true, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_PLT16DBL", false, 0,0x0000ffff, true), + HOWTO(R_390_PC32DBL, 1, 2, 32, true, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_PC32DBL", false, 0,0xffffffff, true), + HOWTO(R_390_PLT32DBL, 1, 2, 32, true, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_PLT32DBL", false, 0,0xffffffff, true), + HOWTO(R_390_GOTPCDBL, 1, 2, 32, true, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_GOTPCDBL", false, 0,0xffffffff, true), EMPTY_HOWTO (R_390_64), /* Empty entry for R_390_64. */ EMPTY_HOWTO (R_390_PC64), /* Empty entry for R_390_PC64. */ EMPTY_HOWTO (R_390_GOT64), /* Empty entry for R_390_GOT64. */ EMPTY_HOWTO (R_390_PLT64), /* Empty entry for R_390_PLT64. */ - HOWTO(R_390_GOTENT, 1, 2, 32, TRUE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_GOTENT", FALSE, 0,0xffffffff, TRUE), - HOWTO(R_390_GOTOFF16, 0, 1, 16, FALSE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_GOTOFF16", FALSE, 0,0x0000ffff, FALSE), + HOWTO(R_390_GOTENT, 1, 2, 32, true, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_GOTENT", false, 0,0xffffffff, true), + HOWTO(R_390_GOTOFF16, 0, 1, 16, false, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_GOTOFF16", false, 0,0x0000ffff, false), EMPTY_HOWTO (R_390_GOTOFF64), /* Empty entry for R_390_GOTOFF64. */ - HOWTO(R_390_GOTPLT12, 0, 1, 12, FALSE, 0, complain_overflow_dont, - bfd_elf_generic_reloc, "R_390_GOTPLT12", FALSE, 0,0x00000fff, FALSE), - HOWTO(R_390_GOTPLT16, 0, 1, 16, FALSE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_GOTPLT16", FALSE, 0,0x0000ffff, FALSE), - HOWTO(R_390_GOTPLT32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_GOTPLT32", FALSE, 0,0xffffffff, FALSE), + HOWTO(R_390_GOTPLT12, 0, 1, 12, false, 0, complain_overflow_dont, + bfd_elf_generic_reloc, "R_390_GOTPLT12", false, 0,0x00000fff, false), + HOWTO(R_390_GOTPLT16, 0, 1, 16, false, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_GOTPLT16", false, 0,0x0000ffff, false), + HOWTO(R_390_GOTPLT32, 0, 2, 32, false, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_GOTPLT32", false, 0,0xffffffff, false), EMPTY_HOWTO (R_390_GOTPLT64), /* Empty entry for R_390_GOTPLT64. */ - HOWTO(R_390_GOTPLTENT, 1, 2, 32, TRUE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_GOTPLTENT",FALSE, 0,0xffffffff, TRUE), - HOWTO(R_390_PLTOFF16, 0, 1, 16, FALSE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_PLTOFF16", FALSE, 0,0x0000ffff, FALSE), - HOWTO(R_390_PLTOFF32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_PLTOFF32", FALSE, 0,0xffffffff, FALSE), + HOWTO(R_390_GOTPLTENT, 1, 2, 32, true, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_GOTPLTENT",false, 0,0xffffffff, true), + HOWTO(R_390_PLTOFF16, 0, 1, 16, false, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_PLTOFF16", false, 0,0x0000ffff, false), + HOWTO(R_390_PLTOFF32, 0, 2, 32, false, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_PLTOFF32", false, 0,0xffffffff, false), EMPTY_HOWTO (R_390_PLTOFF64), /* Empty entry for R_390_PLTOFF64. */ - HOWTO(R_390_TLS_LOAD, 0, 0, 0, FALSE, 0, complain_overflow_dont, - s390_tls_reloc, "R_390_TLS_LOAD", FALSE, 0, 0, FALSE), - HOWTO(R_390_TLS_GDCALL, 0, 0, 0, FALSE, 0, complain_overflow_dont, - s390_tls_reloc, "R_390_TLS_GDCALL", FALSE, 0, 0, FALSE), - HOWTO(R_390_TLS_LDCALL, 0, 0, 0, FALSE, 0, complain_overflow_dont, - s390_tls_reloc, "R_390_TLS_LDCALL", FALSE, 0, 0, FALSE), - HOWTO(R_390_TLS_GD32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_TLS_GD32", FALSE, 0, 0xffffffff, FALSE), + HOWTO(R_390_TLS_LOAD, 0, 0, 0, false, 0, complain_overflow_dont, + s390_tls_reloc, "R_390_TLS_LOAD", false, 0, 0, false), + HOWTO(R_390_TLS_GDCALL, 0, 0, 0, false, 0, complain_overflow_dont, + s390_tls_reloc, "R_390_TLS_GDCALL", false, 0, 0, false), + HOWTO(R_390_TLS_LDCALL, 0, 0, 0, false, 0, complain_overflow_dont, + s390_tls_reloc, "R_390_TLS_LDCALL", false, 0, 0, false), + HOWTO(R_390_TLS_GD32, 0, 2, 32, false, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_TLS_GD32", false, 0, 0xffffffff, false), EMPTY_HOWTO (R_390_TLS_GD64), /* Empty entry for R_390_TLS_GD64. */ - HOWTO(R_390_TLS_GOTIE12, 0, 1, 12, FALSE, 0, complain_overflow_dont, - bfd_elf_generic_reloc, "R_390_TLS_GOTIE12", FALSE, 0, 0x00000fff, FALSE), - HOWTO(R_390_TLS_GOTIE32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_TLS_GOTIE32", FALSE, 0, 0xffffffff, FALSE), + HOWTO(R_390_TLS_GOTIE12, 0, 1, 12, false, 0, complain_overflow_dont, + bfd_elf_generic_reloc, "R_390_TLS_GOTIE12", false, 0, 0x00000fff, false), + HOWTO(R_390_TLS_GOTIE32, 0, 2, 32, false, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_TLS_GOTIE32", false, 0, 0xffffffff, false), EMPTY_HOWTO (R_390_TLS_GOTIE64), /* Empty entry for R_390_TLS_GOTIE64. */ - HOWTO(R_390_TLS_LDM32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_TLS_LDM32", FALSE, 0, 0xffffffff, FALSE), + HOWTO(R_390_TLS_LDM32, 0, 2, 32, false, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_TLS_LDM32", false, 0, 0xffffffff, false), EMPTY_HOWTO (R_390_TLS_LDM64), /* Empty entry for R_390_TLS_LDM64. */ - HOWTO(R_390_TLS_IE32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_TLS_IE32", FALSE, 0, 0xffffffff, FALSE), + HOWTO(R_390_TLS_IE32, 0, 2, 32, false, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_TLS_IE32", false, 0, 0xffffffff, false), EMPTY_HOWTO (R_390_TLS_IE64), /* Empty entry for R_390_TLS_IE64. */ - HOWTO(R_390_TLS_IEENT, 1, 2, 32, TRUE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_TLS_IEENT", FALSE, 0, 0xffffffff, TRUE), - HOWTO(R_390_TLS_LE32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_TLS_LE32", FALSE, 0, 0xffffffff, FALSE), + HOWTO(R_390_TLS_IEENT, 1, 2, 32, true, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_TLS_IEENT", false, 0, 0xffffffff, true), + HOWTO(R_390_TLS_LE32, 0, 2, 32, false, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_TLS_LE32", false, 0, 0xffffffff, false), EMPTY_HOWTO (R_390_TLS_LE64), /* Empty entry for R_390_TLS_LE64. */ - HOWTO(R_390_TLS_LDO32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_TLS_LDO32", FALSE, 0, 0xffffffff, FALSE), + HOWTO(R_390_TLS_LDO32, 0, 2, 32, false, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_TLS_LDO32", false, 0, 0xffffffff, false), EMPTY_HOWTO (R_390_TLS_LDO64), /* Empty entry for R_390_TLS_LDO64. */ - HOWTO(R_390_TLS_DTPMOD, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_TLS_DTPMOD", FALSE, 0, 0xffffffff, FALSE), - HOWTO(R_390_TLS_DTPOFF, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_TLS_DTPOFF", FALSE, 0, 0xffffffff, FALSE), - HOWTO(R_390_TLS_TPOFF, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_TLS_TPOFF", FALSE, 0, 0xffffffff, FALSE), - HOWTO(R_390_20, 0, 2, 20, FALSE, 8, complain_overflow_dont, - s390_elf_ldisp_reloc, "R_390_20", FALSE, 0,0x0fffff00, FALSE), - HOWTO(R_390_GOT20, 0, 2, 20, FALSE, 8, complain_overflow_dont, - s390_elf_ldisp_reloc, "R_390_GOT20", FALSE, 0,0x0fffff00, FALSE), - HOWTO(R_390_GOTPLT20, 0, 2, 20, FALSE, 8, complain_overflow_dont, - s390_elf_ldisp_reloc, "R_390_GOTPLT20", FALSE, 0,0x0fffff00, FALSE), - HOWTO(R_390_TLS_GOTIE20, 0, 2, 20, FALSE, 8, complain_overflow_dont, - s390_elf_ldisp_reloc, "R_390_TLS_GOTIE20", FALSE, 0,0x0fffff00, FALSE), - HOWTO(R_390_IRELATIVE, 0, 2, 32, TRUE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_IRELATIVE", FALSE, 0, 0xffffffff, FALSE), - HOWTO(R_390_PC12DBL, 1, 1, 12, TRUE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_PC12DBL", FALSE, 0,0x00000fff, TRUE), - HOWTO(R_390_PLT12DBL, 1, 1, 12, TRUE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_PLT12DBL", FALSE, 0,0x00000fff, TRUE), - HOWTO(R_390_PC24DBL, 1, 2, 24, TRUE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_PC24DBL", FALSE, 0,0x00ffffff, TRUE), - HOWTO(R_390_PLT24DBL, 1, 2, 24, TRUE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_390_PLT24DBL", FALSE, 0,0x00ffffff, TRUE), + HOWTO(R_390_TLS_DTPMOD, 0, 2, 32, false, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_TLS_DTPMOD", false, 0, 0xffffffff, false), + HOWTO(R_390_TLS_DTPOFF, 0, 2, 32, false, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_TLS_DTPOFF", false, 0, 0xffffffff, false), + HOWTO(R_390_TLS_TPOFF, 0, 2, 32, false, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_TLS_TPOFF", false, 0, 0xffffffff, false), + HOWTO(R_390_20, 0, 2, 20, false, 8, complain_overflow_dont, + s390_elf_ldisp_reloc, "R_390_20", false, 0,0x0fffff00, false), + HOWTO(R_390_GOT20, 0, 2, 20, false, 8, complain_overflow_dont, + s390_elf_ldisp_reloc, "R_390_GOT20", false, 0,0x0fffff00, false), + HOWTO(R_390_GOTPLT20, 0, 2, 20, false, 8, complain_overflow_dont, + s390_elf_ldisp_reloc, "R_390_GOTPLT20", false, 0,0x0fffff00, false), + HOWTO(R_390_TLS_GOTIE20, 0, 2, 20, false, 8, complain_overflow_dont, + s390_elf_ldisp_reloc, "R_390_TLS_GOTIE20", false, 0,0x0fffff00, false), + HOWTO(R_390_IRELATIVE, 0, 2, 32, true, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_IRELATIVE", false, 0, 0xffffffff, false), + HOWTO(R_390_PC12DBL, 1, 1, 12, true, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_PC12DBL", false, 0,0x00000fff, true), + HOWTO(R_390_PLT12DBL, 1, 1, 12, true, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_PLT12DBL", false, 0,0x00000fff, true), + HOWTO(R_390_PC24DBL, 1, 2, 24, true, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_PC24DBL", false, 0,0x00ffffff, true), + HOWTO(R_390_PLT24DBL, 1, 2, 24, true, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_390_PLT24DBL", false, 0,0x00ffffff, true), }; /* GNU extension to record C++ vtable hierarchy. */ static reloc_howto_type elf32_s390_vtinherit_howto = - HOWTO (R_390_GNU_VTINHERIT, 0,2,0,FALSE,0,complain_overflow_dont, NULL, "R_390_GNU_VTINHERIT", FALSE,0, 0, FALSE); + HOWTO (R_390_GNU_VTINHERIT, 0,2,0,false,0,complain_overflow_dont, NULL, "R_390_GNU_VTINHERIT", false,0, 0, false); static reloc_howto_type elf32_s390_vtentry_howto = - HOWTO (R_390_GNU_VTENTRY, 0,2,0,FALSE,0,complain_overflow_dont, _bfd_elf_rel_vtable_reloc_fn,"R_390_GNU_VTENTRY", FALSE,0,0, FALSE); + HOWTO (R_390_GNU_VTENTRY, 0,2,0,false,0,complain_overflow_dont, _bfd_elf_rel_vtable_reloc_fn,"R_390_GNU_VTENTRY", false,0,0, false); static reloc_howto_type * elf_s390_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, @@ -323,12 +323,13 @@ elf_s390_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, /* We need to use ELF32_R_TYPE so we have our own copy of this function, and elf32-s390.c has its own copy. */ -static void -elf_s390_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, +static bool +elf_s390_info_to_howto (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst) { unsigned int r_type = ELF32_R_TYPE(dst->r_info); + switch (r_type) { case R_390_GNU_VTINHERIT: @@ -343,12 +344,15 @@ elf_s390_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, if (r_type >= sizeof (elf_howto_table) / sizeof (elf_howto_table[0])) { /* xgettext:c-format */ - _bfd_error_handler (_("%B: invalid relocation type %d"), - abfd, (int) r_type); - r_type = R_390_NONE; + _bfd_error_handler (_("%pB: unsupported relocation type %#x"), + abfd, r_type); + bfd_set_error (bfd_error_bad_value); + return false; } cache_ptr->howto = &elf_howto_table[r_type]; } + + return true; } /* A relocation function which doesn't do anything. */ @@ -417,11 +421,11 @@ s390_elf_ldisp_reloc (bfd *abfd ATTRIBUTE_UNUSED, return bfd_reloc_ok; } -static bfd_boolean +static bool elf_s390_is_local_label_name (bfd *abfd, const char *name) { if (name[0] == '.' && (name[1] == 'X' || name[1] == 'L')) - return TRUE; + return true; return _bfd_elf_is_local_label_name (abfd, name); } @@ -478,100 +482,100 @@ elf_s390_is_local_label_name (bfd *abfd, const char *name) and insert the address in the GOT. Note: 390 can only address +- 64 K relative. - We check if offset > 65536, then make a relative branch -64xxx - back to a previous defined branch - -PLT1: BASR 1,0 # 2 bytes - L 1,22(1) # 4 bytes Load offset in GOT in r 1 - L 1,(1,12) # 4 bytes Load address from GOT in r1 - BCR 15,1 # 2 bytes Jump to address -RET1: BASR 1,0 # 2 bytes Return from GOT 1st time - L 1,14(1) # 4 bytes Load offset in symol table in r1 + We check if offset > 65536, then make a relative branch -64xxx + back to a previous defined branch + +PLT1: BASR 1,0 # 2 bytes + L 1,22(1) # 4 bytes Load offset in GOT in r 1 + L 1,(1,12) # 4 bytes Load address from GOT in r1 + BCR 15,1 # 2 bytes Jump to address +RET1: BASR 1,0 # 2 bytes Return from GOT 1st time + L 1,14(1) # 4 bytes Load offset in symol table in r1 BRC 15,-x # 4 bytes Jump to start of PLT - .word 0 # 2 bytes filler - .long ? # 4 bytes offset in GOT - .long ? # 4 bytes offset into rela.plt + .word 0 # 2 bytes filler + .long ? # 4 bytes offset in GOT + .long ? # 4 bytes offset into rela.plt This was the general case. There are two additional, optimizes PLT definitions. One for GOT offsets < 4096 and one for GOT offsets < 32768. First the one for GOT offsets < 4096: -PLT1: L 1,(12) # 4 bytes Load address from GOT in R1 - BCR 15,1 # 2 bytes Jump to address - .word 0,0,0 # 6 bytes filler -RET1: BASR 1,0 # 2 bytes Return from GOT 1st time - L 1,14(1) # 4 bytes Load offset in rela.plt in r1 - BRC 15,-x # 4 bytes Jump to start of PLT - .word 0,0,0 # 6 bytes filler - .long ? # 4 bytes offset into rela.plt +PLT1: L 1,(12) # 4 bytes Load address from GOT in R1 + BCR 15,1 # 2 bytes Jump to address + .word 0,0,0 # 6 bytes filler +RET1: BASR 1,0 # 2 bytes Return from GOT 1st time + L 1,14(1) # 4 bytes Load offset in rela.plt in r1 + BRC 15,-x # 4 bytes Jump to start of PLT + .word 0,0,0 # 6 bytes filler + .long ? # 4 bytes offset into rela.plt Second the one for GOT offsets < 32768: -PLT1: LHI 1, # 4 bytes Load offset in GOT to r1 - L 1,(1,12) # 4 bytes Load address from GOT to r1 - BCR 15,1 # 2 bytes Jump to address - .word 0 # 2 bytes filler -RET1: BASR 1,0 # 2 bytes Return from GOT 1st time - L 1,14(1) # 4 bytes Load offset in rela.plt in r1 - BRC 15,-x # 4 bytes Jump to start of PLT - .word 0,0,0 # 6 bytes filler - .long ? # 4 bytes offset into rela.plt +PLT1: LHI 1, # 4 bytes Load offset in GOT to r1 + L 1,(1,12) # 4 bytes Load address from GOT to r1 + BCR 15,1 # 2 bytes Jump to address + .word 0 # 2 bytes filler +RET1: BASR 1,0 # 2 bytes Return from GOT 1st time + L 1,14(1) # 4 bytes Load offset in rela.plt in r1 + BRC 15,-x # 4 bytes Jump to start of PLT + .word 0,0,0 # 6 bytes filler + .long ? # 4 bytes offset into rela.plt Total = 32 bytes per PLT entry The code for static build PLT entries looks like this: -PLT1: BASR 1,0 # 2 bytes - L 1,22(1) # 4 bytes Load address of GOT entry - L 1,0(0,1) # 4 bytes Load address from GOT in r1 - BCR 15,1 # 2 bytes Jump to address -RET1: BASR 1,0 # 2 bytes Return from GOT 1st time - L 1,14(1) # 4 bytes Load offset in symbol table in r1 +PLT1: BASR 1,0 # 2 bytes + L 1,22(1) # 4 bytes Load address of GOT entry + L 1,0(0,1) # 4 bytes Load address from GOT in r1 + BCR 15,1 # 2 bytes Jump to address +RET1: BASR 1,0 # 2 bytes Return from GOT 1st time + L 1,14(1) # 4 bytes Load offset in symbol table in r1 BRC 15,-x # 4 bytes Jump to start of PLT - .word 0 # 2 bytes filler - .long ? # 4 bytes address of GOT entry - .long ? # 4 bytes offset into rela.plt */ + .word 0 # 2 bytes filler + .long ? # 4 bytes address of GOT entry + .long ? # 4 bytes offset into rela.plt */ static const bfd_byte elf_s390_plt_entry[PLT_ENTRY_SIZE] = { - 0x0d, 0x10, /* basr %r1,%r0 */ - 0x58, 0x10, 0x10, 0x16, /* l %r1,22(%r1) */ - 0x58, 0x10, 0x10, 0x00, /* l %r1,0(%r1) */ - 0x07, 0xf1, /* br %r1 */ - 0x0d, 0x10, /* basr %r1,%r0 */ - 0x58, 0x10, 0x10, 0x0e, /* l %r1,14(%r1) */ - 0xa7, 0xf4, 0x00, 0x00, /* j first plt */ - 0x00, 0x00, /* padding */ - 0x00, 0x00, 0x00, 0x00, /* GOT offset */ - 0x00, 0x00, 0x00, 0x00 /* rela.plt offset */ + 0x0d, 0x10, /* basr %r1,%r0 */ + 0x58, 0x10, 0x10, 0x16, /* l %r1,22(%r1) */ + 0x58, 0x10, 0x10, 0x00, /* l %r1,0(%r1) */ + 0x07, 0xf1, /* br %r1 */ + 0x0d, 0x10, /* basr %r1,%r0 */ + 0x58, 0x10, 0x10, 0x0e, /* l %r1,14(%r1) */ + 0xa7, 0xf4, 0x00, 0x00, /* j first plt */ + 0x00, 0x00, /* padding */ + 0x00, 0x00, 0x00, 0x00, /* GOT offset */ + 0x00, 0x00, 0x00, 0x00 /* rela.plt offset */ }; /* Generic PLT pic entry. */ static const bfd_byte elf_s390_plt_pic_entry[PLT_ENTRY_SIZE] = { - 0x0d, 0x10, /* basr %r1,%r0 */ - 0x58, 0x10, 0x10, 0x16, /* l %r1,22(%r1) */ - 0x58, 0x11, 0xc0, 0x00, /* l %r1,0(%r1,%r12) */ - 0x07, 0xf1, /* br %r1 */ - 0x0d, 0x10, /* basr %r1,%r0 */ - 0x58, 0x10, 0x10, 0x0e, /* l %r1,14(%r1) */ - 0xa7, 0xf4, 0x00, 0x00, /* j first plt */ - 0x00, 0x00, /* padding */ - 0x00, 0x00, 0x00, 0x00, /* GOT offset */ - 0x00, 0x00, 0x00, 0x00 /* rela.plt offset */ + 0x0d, 0x10, /* basr %r1,%r0 */ + 0x58, 0x10, 0x10, 0x16, /* l %r1,22(%r1) */ + 0x58, 0x11, 0xc0, 0x00, /* l %r1,0(%r1,%r12) */ + 0x07, 0xf1, /* br %r1 */ + 0x0d, 0x10, /* basr %r1,%r0 */ + 0x58, 0x10, 0x10, 0x0e, /* l %r1,14(%r1) */ + 0xa7, 0xf4, 0x00, 0x00, /* j first plt */ + 0x00, 0x00, /* padding */ + 0x00, 0x00, 0x00, 0x00, /* GOT offset */ + 0x00, 0x00, 0x00, 0x00 /* rela.plt offset */ }; /* Optimized PLT pic entry for GOT offset < 4k. xx will be replaced when generating the PLT slot with the GOT offset. */ static const bfd_byte elf_s390_plt_pic12_entry[PLT_ENTRY_SIZE] = { - 0x58, 0x10, 0xc0, 0x00, /* l %r1,xx(%r12) */ - 0x07, 0xf1, /* br %r1 */ - 0x00, 0x00, 0x00, 0x00, /* padding */ + 0x58, 0x10, 0xc0, 0x00, /* l %r1,xx(%r12) */ + 0x07, 0xf1, /* br %r1 */ + 0x00, 0x00, 0x00, 0x00, /* padding */ 0x00, 0x00, - 0x0d, 0x10, /* basr %r1,%r0 */ - 0x58, 0x10, 0x10, 0x0e, /* l %r1,14(%r1) */ - 0xa7, 0xf4, 0x00, 0x00, /* j first plt */ + 0x0d, 0x10, /* basr %r1,%r0 */ + 0x58, 0x10, 0x10, 0x0e, /* l %r1,14(%r1) */ + 0xa7, 0xf4, 0x00, 0x00, /* j first plt */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; @@ -580,13 +584,13 @@ static const bfd_byte elf_s390_plt_pic12_entry[PLT_ENTRY_SIZE] = when generating the PLT slot with the GOT offset. */ static const bfd_byte elf_s390_plt_pic16_entry[PLT_ENTRY_SIZE] = { - 0xa7, 0x18, 0x00, 0x00, /* lhi %r1,xx */ - 0x58, 0x11, 0xc0, 0x00, /* l %r1,0(%r1,%r12) */ - 0x07, 0xf1, /* br %r1 */ + 0xa7, 0x18, 0x00, 0x00, /* lhi %r1,xx */ + 0x58, 0x11, 0xc0, 0x00, /* l %r1,0(%r1,%r12) */ + 0x07, 0xf1, /* br %r1 */ 0x00, 0x00, - 0x0d, 0x10, /* basr %r1,%r0 */ - 0x58, 0x10, 0x10, 0x0e, /* l %r1,14(%r1) */ - 0xa7, 0xf4, 0x00, 0x00, /* j first plt */ + 0x0d, 0x10, /* basr %r1,%r0 */ + 0x58, 0x10, 0x10, 0x0e, /* l %r1,14(%r1) */ + 0xa7, 0xf4, 0x00, 0x00, /* j first plt */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 @@ -599,32 +603,32 @@ static const bfd_byte elf_s390_plt_pic16_entry[PLT_ENTRY_SIZE] = /* The first entry in the PLT for PIC code: PLT0: - ST 1,28(15) # R1 has offset into rela.plt - L 1,4(12) # Get loader ino(object struct address) - ST 1,24(15) # Store address - L 1,8(12) # Entry address of loader in R1 - BR 1 # Jump to loader + ST 1,28(15) # R1 has offset into rela.plt + L 1,4(12) # Get loader ino(object struct address) + ST 1,24(15) # Store address + L 1,8(12) # Entry address of loader in R1 + BR 1 # Jump to loader The first entry in the PLT for static code: PLT0: - ST 1,28(15) # R1 has offset into rela.plt + ST 1,28(15) # R1 has offset into rela.plt BASR 1,0 - L 1,18(0,1) # Get address of GOT - MVC 24(4,15),4(1) # Move loader ino to stack - L 1,8(1) # Get address of loader - BR 1 # Jump to loader - .word 0 # filler - .long got # address of GOT */ + L 1,18(0,1) # Get address of GOT + MVC 24(4,15),4(1) # Move loader ino to stack + L 1,8(1) # Get address of loader + BR 1 # Jump to loader + .word 0 # filler + .long got # address of GOT */ static const bfd_byte elf_s390_plt_first_entry[PLT_FIRST_ENTRY_SIZE] = { - 0x50, 0x10, 0xf0, 0x1c, /* st %r1,28(%r15) */ - 0x0d, 0x10, /* basr %r1,%r0 */ - 0x58, 0x10, 0x10, 0x12, /* l %r1,18(%r1) */ - 0xd2, 0x03, 0xf0, 0x18, 0x10, 0x04, /* mvc 24(4,%r15),4(%r1) */ - 0x58, 0x10, 0x10, 0x08, /* l %r1,8(%r1) */ - 0x07, 0xf1, /* br %r1 */ + 0x50, 0x10, 0xf0, 0x1c, /* st %r1,28(%r15) */ + 0x0d, 0x10, /* basr %r1,%r0 */ + 0x58, 0x10, 0x10, 0x12, /* l %r1,18(%r1) */ + 0xd2, 0x03, 0xf0, 0x18, 0x10, 0x04, /* mvc 24(4,%r15),4(%r1) */ + 0x58, 0x10, 0x10, 0x08, /* l %r1,8(%r1) */ + 0x07, 0xf1, /* br %r1 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 @@ -632,11 +636,11 @@ static const bfd_byte elf_s390_plt_first_entry[PLT_FIRST_ENTRY_SIZE] = static const bfd_byte elf_s390_plt_pic_first_entry[PLT_FIRST_ENTRY_SIZE] = { - 0x50, 0x10, 0xf0, 0x1c, /* st %r1,28(%r15) */ - 0x58, 0x10, 0xc0, 0x04, /* l %r1,4(%r12) */ - 0x50, 0x10, 0xf0, 0x18, /* st %r1,24(%r15) */ - 0x58, 0x10, 0xc0, 0x08, /* l %r1,8(%r12) */ - 0x07, 0xf1, /* br %r1 */ + 0x50, 0x10, 0xf0, 0x1c, /* st %r1,28(%r15) */ + 0x58, 0x10, 0xc0, 0x04, /* l %r1,4(%r12) */ + 0x50, 0x10, 0xf0, 0x18, /* st %r1,24(%r15) */ + 0x58, 0x10, 0xc0, 0x08, /* l %r1,8(%r12) */ + 0x07, 0xf1, /* br %r1 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -650,9 +654,6 @@ struct elf_s390_link_hash_entry { struct elf_link_hash_entry elf; - /* Track dynamic relocs copied for this symbol. */ - struct elf_dyn_relocs *dyn_relocs; - /* Number of GOTPLT references for a function. */ bfd_signed_vma gotplt_refcount; @@ -717,14 +718,14 @@ struct elf_s390_obj_tdata && elf_tdata (bfd) != NULL \ && elf_object_id (bfd) == S390_ELF_DATA) -static bfd_boolean +static bool elf_s390_mkobject (bfd *abfd) { return bfd_elf_allocate_object (abfd, sizeof (struct elf_s390_obj_tdata), S390_ELF_DATA); } -static bfd_boolean +static bool elf_s390_object_p (bfd *abfd) { /* Set the right machine number for an s390 elf32 file. */ @@ -745,16 +746,14 @@ struct elf_s390_link_hash_table bfd_signed_vma refcount; bfd_vma offset; } tls_ldm_got; - - /* Small local sym cache. */ - struct sym_cache sym_cache; }; /* Get the s390 ELF linker hash table from a link_info structure. */ #define elf_s390_hash_table(p) \ - (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \ - == S390_ELF_DATA ? ((struct elf_s390_link_hash_table *) ((p)->hash)) : NULL) + ((is_elf_hash_table ((p)->hash) \ + && elf_hash_table_id (elf_hash_table (p)) == S390_ELF_DATA) \ + ? (struct elf_s390_link_hash_table *) (p)->hash : NULL) #undef ELF64 #include "elf-s390-common.c" @@ -783,7 +782,6 @@ link_hash_newfunc (struct bfd_hash_entry *entry, struct elf_s390_link_hash_entry *eh; eh = (struct elf_s390_link_hash_entry *) entry; - eh->dyn_relocs = NULL; eh->gotplt_refcount = 0; eh->tls_type = GOT_UNKNOWN; eh->ifunc_resolver_address = 0; @@ -799,7 +797,7 @@ static struct bfd_link_hash_table * elf_s390_link_hash_table_create (bfd *abfd) { struct elf_s390_link_hash_table *ret; - bfd_size_type amt = sizeof (struct elf_s390_link_hash_table); + size_t amt = sizeof (struct elf_s390_link_hash_table); ret = (struct elf_s390_link_hash_table *) bfd_zmalloc (amt); if (ret == NULL) @@ -828,37 +826,6 @@ elf_s390_copy_indirect_symbol (struct bfd_link_info *info, edir = (struct elf_s390_link_hash_entry *) dir; eind = (struct elf_s390_link_hash_entry *) ind; - if (eind->dyn_relocs != NULL) - { - if (edir->dyn_relocs != NULL) - { - struct elf_dyn_relocs **pp; - struct elf_dyn_relocs *p; - - /* Add reloc counts against the indirect sym to the direct sym - list. Merge any entries against the same section. */ - for (pp = &eind->dyn_relocs; (p = *pp) != NULL; ) - { - struct elf_dyn_relocs *q; - - for (q = edir->dyn_relocs; q != NULL; q = q->next) - if (q->sec == p->sec) - { - q->pc_count += p->pc_count; - q->count += p->count; - *pp = p->next; - break; - } - if (q == NULL) - pp = &p->next; - } - *pp = edir->dyn_relocs; - } - - edir->dyn_relocs = eind->dyn_relocs; - eind->dyn_relocs = NULL; - } - if (ind->root.type == bfd_link_hash_indirect && dir->got.refcount <= 0) { @@ -913,7 +880,7 @@ elf_s390_tls_transition (struct bfd_link_info *info, allocate space in the global offset table or procedure linkage table. */ -static bfd_boolean +static bool elf_s390_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, @@ -930,7 +897,7 @@ elf_s390_check_relocs (bfd *abfd, Elf_Internal_Sym *isym; if (bfd_link_relocatable (info)) - return TRUE; + return true; BFD_ASSERT (is_s390_elf (abfd)); @@ -953,18 +920,18 @@ elf_s390_check_relocs (bfd *abfd, if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr)) { /* xgettext:c-format */ - _bfd_error_handler (_("%B: bad symbol index: %d"), + _bfd_error_handler (_("%pB: bad symbol index: %d"), abfd, r_symndx); - return FALSE; + return false; } if (r_symndx < symtab_hdr->sh_info) { /* A local symbol. */ - isym = bfd_sym_from_r_symndx (&htab->sym_cache, + isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache, abfd, r_symndx); if (isym == NULL) - return FALSE; + return false; if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC) { @@ -974,12 +941,12 @@ elf_s390_check_relocs (bfd *abfd, htab->elf.dynobj = abfd; if (!s390_elf_create_ifunc_sections (htab->elf.dynobj, info)) - return FALSE; + return false; if (local_got_refcounts == NULL) { if (!elf_s390_allocate_local_syminfo (abfd, symtab_hdr)) - return FALSE; + return false; local_got_refcounts = elf_local_got_refcounts (abfd); } plt = elf_s390_local_plt (abfd); @@ -993,10 +960,6 @@ elf_s390_check_relocs (bfd *abfd, 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; - - /* PR15323, ref flags aren't set for references in the same - object. */ - h->root.non_ir_ref_regular = 1; } /* Create got section and local_got_refcounts array if they @@ -1027,7 +990,7 @@ elf_s390_check_relocs (bfd *abfd, && local_got_refcounts == NULL) { if (!elf_s390_allocate_local_syminfo (abfd, symtab_hdr)) - return FALSE; + return false; local_got_refcounts = elf_local_got_refcounts (abfd); } /* Fall through. */ @@ -1040,7 +1003,7 @@ elf_s390_check_relocs (bfd *abfd, if (htab->elf.dynobj == NULL) htab->elf.dynobj = abfd; if (!_bfd_elf_create_got_section (htab->elf.dynobj, info)) - return FALSE; + return false; } } @@ -1049,7 +1012,7 @@ elf_s390_check_relocs (bfd *abfd, if (htab->elf.dynobj == NULL) htab->elf.dynobj = abfd; if (!s390_elf_create_ifunc_sections (htab->elf.dynobj, info)) - return FALSE; + return false; /* Make sure an IFUNC symbol defined in a non-shared object always gets a PLT slot. */ @@ -1185,9 +1148,9 @@ elf_s390_check_relocs (bfd *abfd, { _bfd_error_handler /* xgettext:c-format */ - (_("%B: `%s' accessed both as normal and thread local symbol"), + (_("%pB: `%s' accessed both as normal and thread local symbol"), abfd, h->root.root.string); - return FALSE; + return false; } if (old_tls_type > tls_type) tls_type = old_tls_type; @@ -1296,17 +1259,17 @@ elf_s390_check_relocs (bfd *abfd, htab->elf.dynobj = abfd; sreloc = _bfd_elf_make_dynamic_reloc_section - (sec, htab->elf.dynobj, 2, abfd, /*rela?*/ TRUE); + (sec, htab->elf.dynobj, 2, abfd, /*rela?*/ true); if (sreloc == NULL) - return FALSE; + return false; } /* If this is a global symbol, we count the number of relocations we need for this symbol. */ if (h != NULL) { - head = &((struct elf_s390_link_hash_entry *) h)->dyn_relocs; + head = &h->dyn_relocs; } else { @@ -1316,10 +1279,10 @@ elf_s390_check_relocs (bfd *abfd, asection *s; void *vpp; - isym = bfd_sym_from_r_symndx (&htab->sym_cache, + isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache, abfd, r_symndx); if (isym == NULL) - return FALSE; + return false; s = bfd_section_from_elf_index (abfd, isym->st_shndx); if (s == NULL) @@ -1332,12 +1295,12 @@ elf_s390_check_relocs (bfd *abfd, p = *head; if (p == NULL || p->sec != sec) { - bfd_size_type amt = sizeof *p; + size_t amt = sizeof *p; p = ((struct elf_dyn_relocs *) bfd_alloc (htab->elf.dynobj, amt)); if (p == NULL) - return FALSE; + return false; p->next = *head; *head = p; p->sec = sec; @@ -1360,16 +1323,14 @@ elf_s390_check_relocs (bfd *abfd, Reconstruct it for later use during GC. */ case R_390_GNU_VTINHERIT: if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset)) - return FALSE; + return false; break; /* This relocation describes which C++ vtable entries are actually used. Record for later use during GC. */ case R_390_GNU_VTENTRY: - BFD_ASSERT (h != NULL); - if (h != NULL - && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend)) - return FALSE; + if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend)) + return false; break; default: @@ -1377,7 +1338,7 @@ elf_s390_check_relocs (bfd *abfd, } } - return TRUE; + return true; } /* Return the section that should be marked against GC for a given @@ -1401,180 +1362,6 @@ elf_s390_gc_mark_hook (asection *sec, } -/* Update the got entry reference counts for the section being removed. */ - -static bfd_boolean -elf_s390_gc_sweep_hook (bfd *abfd, - struct bfd_link_info *info, - asection *sec, - const Elf_Internal_Rela *relocs) -{ - struct elf_s390_link_hash_table *htab; - Elf_Internal_Shdr *symtab_hdr; - struct elf_link_hash_entry **sym_hashes; - bfd_signed_vma *local_got_refcounts; - const Elf_Internal_Rela *rel, *relend; - - if (bfd_link_relocatable (info)) - return TRUE; - - htab = elf_s390_hash_table (info); - if (htab == NULL) - return FALSE; - - elf_section_data (sec)->local_dynrel = NULL; - - symtab_hdr = &elf_symtab_hdr (abfd); - sym_hashes = elf_sym_hashes (abfd); - local_got_refcounts = elf_local_got_refcounts (abfd); - - relend = relocs + sec->reloc_count; - for (rel = relocs; rel < relend; rel++) - { - unsigned long r_symndx; - unsigned int r_type; - struct elf_link_hash_entry *h = NULL; - - r_symndx = ELF32_R_SYM (rel->r_info); - if (r_symndx >= symtab_hdr->sh_info) - { - struct elf_s390_link_hash_entry *eh; - struct elf_dyn_relocs **pp; - struct elf_dyn_relocs *p; - - 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; - eh = (struct elf_s390_link_hash_entry *) h; - - for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next) - if (p->sec == sec) - { - /* Everything must go for SEC. */ - *pp = p->next; - break; - } - } - else - { - Elf_Internal_Sym *isym; - - /* A local symbol. */ - isym = bfd_sym_from_r_symndx (&htab->sym_cache, - abfd, r_symndx); - if (isym == NULL) - return FALSE; - - if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC) - { - struct plt_entry *plt = elf_s390_local_plt (abfd); - if (plt[r_symndx].plt.refcount > 0) - plt[r_symndx].plt.refcount--; - } - } - - r_type = ELF32_R_TYPE (rel->r_info); - r_type = elf_s390_tls_transition (info, r_type, h != NULL); - switch (r_type) - { - case R_390_TLS_LDM32: - if (elf_s390_hash_table (info)->tls_ldm_got.refcount > 0) - elf_s390_hash_table (info)->tls_ldm_got.refcount -= 1; - break; - - case R_390_GOTOFF16: - case R_390_GOTOFF32: - if (h != NULL && s390_is_ifunc_symbol_p (h) && h->def_regular) - { - h->plt.refcount--; - break; - } - - case R_390_GOTPC: - case R_390_GOTPCDBL: - break; - - case R_390_TLS_GD32: - case R_390_TLS_IE32: - case R_390_TLS_GOTIE12: - case R_390_TLS_GOTIE20: - case R_390_TLS_GOTIE32: - case R_390_TLS_IEENT: - case R_390_GOT12: - case R_390_GOT16: - case R_390_GOT20: - case R_390_GOT32: - case R_390_GOTENT: - if (h != NULL) - { - if (h->got.refcount > 0) - h->got.refcount -= 1; - } - else if (local_got_refcounts != NULL) - { - if (local_got_refcounts[r_symndx] > 0) - local_got_refcounts[r_symndx] -= 1; - } - break; - - case R_390_8: - case R_390_12: - case R_390_16: - case R_390_20: - case R_390_32: - case R_390_PC16: - case R_390_PC12DBL: - case R_390_PC16DBL: - case R_390_PC24DBL: - case R_390_PC32DBL: - case R_390_PC32: - if (bfd_link_pic (info)) - break; - /* Fall through. */ - - case R_390_PLT12DBL: - case R_390_PLT16DBL: - case R_390_PLT24DBL: - case R_390_PLT32DBL: - case R_390_PLT32: - case R_390_PLTOFF16: - case R_390_PLTOFF32: - if (h != NULL) - { - if (h->plt.refcount > 0) - h->plt.refcount -= 1; - } - break; - - case R_390_GOTPLT12: - case R_390_GOTPLT16: - case R_390_GOTPLT20: - case R_390_GOTPLT32: - case R_390_GOTPLTENT: - if (h != NULL) - { - if (h->plt.refcount > 0) - { - ((struct elf_s390_link_hash_entry *) h)->gotplt_refcount--; - h->plt.refcount -= 1; - } - } - else if (local_got_refcounts != NULL) - { - if (local_got_refcounts[r_symndx] > 0) - local_got_refcounts[r_symndx] -= 1; - } - break; - - default: - break; - } - } - - return TRUE; -} - /* Make sure we emit a GOT entry if the symbol was supposed to have a PLT entry but we found we will not create any. Called when we find we will not have any PLT for this symbol, by for example @@ -1603,7 +1390,7 @@ elf_s390_adjust_gotplt (struct elf_s390_link_hash_entry *h) change the definition to something the rest of the link can understand. */ -static bfd_boolean +static bool elf_s390_adjust_dynamic_symbol (struct bfd_link_info *info, struct elf_link_hash_entry *h) { @@ -1619,11 +1406,9 @@ elf_s390_adjust_dynamic_symbol (struct bfd_link_info *info, { bfd_size_type pc_count = 0, count = 0; struct elf_dyn_relocs **pp; - struct elf_s390_link_hash_entry *eh; struct elf_dyn_relocs *p; - eh = (struct elf_s390_link_hash_entry *) h; - for (pp = &eh->dyn_relocs; (p = *pp) != NULL; ) + for (pp = &h->dyn_relocs; (p = *pp) != NULL; ) { pc_count += p->pc_count; p->count -= p->pc_count; @@ -1651,7 +1436,7 @@ elf_s390_adjust_dynamic_symbol (struct bfd_link_info *info, h->plt.offset = (bfd_vma) -1; h->needs_plt = 0; } - return TRUE; + return true; } /* If this is a function, put it in the procedure linkage table. We @@ -1675,7 +1460,7 @@ elf_s390_adjust_dynamic_symbol (struct bfd_link_info *info, elf_s390_adjust_gotplt((struct elf_s390_link_hash_entry *) h); } - return TRUE; + return true; } else /* It's possible that we incorrectly decided a .plt reloc was @@ -1688,15 +1473,15 @@ elf_s390_adjust_dynamic_symbol (struct bfd_link_info *info, /* 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->u.weakdef != NULL) + if (h->is_weakalias) { - BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined - || h->u.weakdef->root.type == bfd_link_hash_defweak); - h->root.u.def.section = h->u.weakdef->root.u.def.section; - h->root.u.def.value = h->u.weakdef->root.u.def.value; + 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; if (ELIMINATE_COPY_RELOCS || info->nocopyreloc) - h->non_got_ref = h->u.weakdef->non_got_ref; - return TRUE; + h->non_got_ref = def->non_got_ref; + return true; } /* This is a reference to a symbol defined by a dynamic object which @@ -1707,40 +1492,26 @@ elf_s390_adjust_dynamic_symbol (struct bfd_link_info *info, 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; + 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; + return true; /* If -z nocopyreloc was given, we won't generate them either. */ if (info->nocopyreloc) { h->non_got_ref = 0; - return TRUE; + return true; } - if (ELIMINATE_COPY_RELOCS) + /* If we don't find any dynamic relocs in read-only sections, then + we'll be keeping the dynamic relocs and avoiding the copy reloc. */ + if (ELIMINATE_COPY_RELOCS && !_bfd_elf_readonly_dynrelocs (h)) { - struct elf_s390_link_hash_entry * eh; - struct elf_dyn_relocs *p; - - eh = (struct elf_s390_link_hash_entry *) h; - for (p = eh->dyn_relocs; p != NULL; p = p->next) - { - s = p->sec->output_section; - if (s != NULL && (s->flags & SEC_READONLY) != 0) - break; - } - - /* If we didn't find any dynamic relocs in read-only sections, then - we'll be keeping the dynamic relocs and avoiding the copy reloc. */ - if (p == NULL) - { - h->non_got_ref = 0; - return TRUE; - } + h->non_got_ref = 0; + return true; } /* We must allocate the symbol in our .dynbss section, which will @@ -1780,16 +1551,15 @@ elf_s390_adjust_dynamic_symbol (struct bfd_link_info *info, /* Allocate space in .plt, .got and associated reloc sections for dynamic relocs. */ -static bfd_boolean +static bool allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf) { struct bfd_link_info *info; struct elf_s390_link_hash_table *htab; - struct elf_s390_link_hash_entry *eh = (struct elf_s390_link_hash_entry *)h; struct elf_dyn_relocs *p; if (h->root.type == bfd_link_hash_indirect) - return TRUE; + return true; info = (struct bfd_link_info *) inf; htab = elf_s390_hash_table (info); @@ -1807,7 +1577,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf) && !h->forced_local) { if (! bfd_elf_link_record_dynamic_symbol (info, h)) - return FALSE; + return false; } if (bfd_link_pic (info) @@ -1846,7 +1616,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf) } else { - h->plt.offset = (bfd_vma) -1; + h->plt.offset = (bfd_vma) -1; h->needs_plt = 0; elf_s390_adjust_gotplt((struct elf_s390_link_hash_entry *) h); } @@ -1881,7 +1651,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf) else if (h->got.refcount > 0) { asection *s; - bfd_boolean dyn; + bool dyn; int tls_type = elf_s390_hash_entry(h)->tls_type; /* Make sure this symbol is output as a dynamic symbol. @@ -1890,7 +1660,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf) && !h->forced_local) { if (! bfd_elf_link_record_dynamic_symbol (info, h)) - return FALSE; + return false; } s = htab->elf.sgot; @@ -1916,8 +1686,8 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf) else h->got.offset = (bfd_vma) -1; - if (eh->dyn_relocs == NULL) - return TRUE; + if (h->dyn_relocs == NULL) + return true; /* In the shared -Bsymbolic case, discard space allocated for dynamic pc-relative relocs against symbols which turn out to be @@ -1931,7 +1701,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf) { struct elf_dyn_relocs **pp; - for (pp = &eh->dyn_relocs; (p = *pp) != NULL; ) + for (pp = &h->dyn_relocs; (p = *pp) != NULL; ) { p->count -= p->pc_count; p->pc_count = 0; @@ -1944,12 +1714,12 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf) /* Also discard relocs on undefined weak syms with non-default visibility. */ - if (eh->dyn_relocs != NULL + if (h->dyn_relocs != NULL && h->root.type == bfd_link_hash_undefweak) { if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)) - eh->dyn_relocs = NULL; + h->dyn_relocs = NULL; /* Make sure undefined weak symbols are output as a dynamic symbol in PIEs. */ @@ -1957,7 +1727,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf) && !h->forced_local) { if (! bfd_elf_link_record_dynamic_symbol (info, h)) - return FALSE; + return false; } } } @@ -1980,7 +1750,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf) && !h->forced_local) { if (! bfd_elf_link_record_dynamic_symbol (info, h)) - return FALSE; + return false; } /* If that succeeded, we know we'll be keeping all the @@ -1989,58 +1759,32 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf) goto keep; } - eh->dyn_relocs = NULL; + h->dyn_relocs = NULL; keep: ; } /* Finally, allocate space. */ - for (p = eh->dyn_relocs; p != NULL; p = p->next) + for (p = h->dyn_relocs; p != NULL; p = p->next) { asection *sreloc = elf_section_data (p->sec)->sreloc; sreloc->size += p->count * sizeof (Elf32_External_Rela); } - return TRUE; -} - -/* Find any dynamic relocs that apply to read-only sections. */ - -static bfd_boolean -readonly_dynrelocs (struct elf_link_hash_entry *h, void * inf) -{ - struct elf_s390_link_hash_entry *eh; - struct elf_dyn_relocs *p; - - eh = (struct elf_s390_link_hash_entry *) h; - for (p = eh->dyn_relocs; p != NULL; p = p->next) - { - asection *s = p->sec->output_section; - - if (s != NULL && (s->flags & SEC_READONLY) != 0) - { - struct bfd_link_info *info = (struct bfd_link_info *) inf; - - info->flags |= DF_TEXTREL; - - /* Not an error, just cut short the traversal. */ - return FALSE; - } - } - return TRUE; + return true; } /* Set the sizes of the dynamic sections. */ -static bfd_boolean +static bool elf_s390_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, struct bfd_link_info *info) { struct elf_s390_link_hash_table *htab; bfd *dynobj; asection *s; - bfd_boolean relocs; + bool relocs; bfd *ibfd; htab = elf_s390_hash_table (info); @@ -2136,7 +1880,7 @@ elf_s390_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, htab->elf.irelplt->size += RELA_ENTRY_SIZE; } else - local_plt[i].plt.offset = (bfd_vma) -1; + local_plt[i].plt.offset = (bfd_vma) -1; } } @@ -2157,7 +1901,7 @@ elf_s390_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, /* We now have determined the sizes of the various dynamic sections. Allocate memory for them. */ - relocs = FALSE; + relocs = false; for (s = dynobj->sections; s != NULL; s = s->next) { if ((s->flags & SEC_LINKER_CREATED) == 0) @@ -2175,10 +1919,10 @@ elf_s390_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, /* Strip this section if we don't need it; see the comment below. */ } - else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela")) + else if (startswith (bfd_section_name (s), ".rela")) { if (s->size != 0) - relocs = TRUE; + relocs = true; /* We use the reloc_count field as a counter if we need to copy relocs into the output file. */ @@ -2216,56 +1960,10 @@ elf_s390_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, of garbage. */ s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size); if (s->contents == NULL) - return FALSE; + return false; } - if (htab->elf.dynamic_sections_created) - { - /* Add some entries to the .dynamic section. We fill in the - values later, in elf_s390_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. */ -#define add_dynamic_entry(TAG, VAL) \ - _bfd_elf_add_dynamic_entry (info, TAG, VAL) - - if (bfd_link_executable (info)) - { - if (!add_dynamic_entry (DT_DEBUG, 0)) - return FALSE; - } - - if (htab->elf.splt->size != 0) - { - if (!add_dynamic_entry (DT_PLTGOT, 0) - || !add_dynamic_entry (DT_PLTRELSZ, 0) - || !add_dynamic_entry (DT_PLTREL, DT_RELA) - || !add_dynamic_entry (DT_JMPREL, 0)) - return FALSE; - } - - if (relocs) - { - if (!add_dynamic_entry (DT_RELA, 0) - || !add_dynamic_entry (DT_RELASZ, 0) - || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela))) - return FALSE; - - /* If any dynamic relocs apply to a read-only section, - then we need a DT_TEXTREL entry. */ - if ((info->flags & DF_TEXTREL) == 0) - elf_link_hash_traverse (&htab->elf, readonly_dynrelocs, info); - - if ((info->flags & DF_TEXTREL) != 0) - { - if (!add_dynamic_entry (DT_TEXTREL, 0)) - return FALSE; - } - } - } -#undef add_dynamic_entry - - return TRUE; + return _bfd_elf_add_dynamic_tags (output_bfd, info, relocs); } /* Return the base VMA address which should be subtracted from real addresses @@ -2308,17 +2006,17 @@ invalid_tls_insn (bfd *input_bfd, howto = elf_howto_table + ELF32_R_TYPE (rel->r_info); _bfd_error_handler /* xgettext:c-format */ - (_("%B(%A+%#Lx): invalid instruction for TLS relocation %s"), + (_("%pB(%pA+%#" PRIx64 "): invalid instruction for TLS relocation %s"), input_bfd, input_section, - rel->r_offset, + (uint64_t) rel->r_offset, howto->name); bfd_set_error (bfd_error_bad_value); } /* Relocate a 390 ELF section. */ -static bfd_boolean +static int elf_s390_relocate_section (bfd *output_bfd, struct bfd_link_info *info, bfd *input_bfd, @@ -2335,7 +2033,11 @@ elf_s390_relocate_section (bfd *output_bfd, Elf_Internal_Rela *rel; Elf_Internal_Rela *relend; - BFD_ASSERT (is_s390_elf (input_bfd)); + if (!is_s390_elf (input_bfd)) + { + bfd_set_error (bfd_error_wrong_format); + return false; + } htab = elf_s390_hash_table (info); symtab_hdr = &elf_symtab_hdr (input_bfd); @@ -2354,11 +2056,11 @@ elf_s390_relocate_section (bfd *output_bfd, asection *sec; bfd_vma off; bfd_vma relocation; - bfd_boolean unresolved_reloc; + bool unresolved_reloc; bfd_reloc_status_type r; int tls_type; asection *base_got = htab->elf.sgot; - bfd_boolean resolved_to_zero; + bool resolved_to_zero; r_type = ELF32_R_TYPE (rel->r_info); if (r_type == (int) R_390_GNU_VTINHERIT @@ -2367,7 +2069,7 @@ elf_s390_relocate_section (bfd *output_bfd, if (r_type >= (int) R_390_max) { bfd_set_error (bfd_error_bad_value); - return FALSE; + return false; } howto = elf_howto_table + r_type; @@ -2376,7 +2078,7 @@ elf_s390_relocate_section (bfd *output_bfd, h = NULL; sym = NULL; sec = NULL; - unresolved_reloc = FALSE; + unresolved_reloc = false; if (r_symndx < symtab_hdr->sh_info) { sym = local_syms + r_symndx; @@ -2385,7 +2087,7 @@ elf_s390_relocate_section (bfd *output_bfd, { struct plt_entry *local_plt = elf_s390_local_plt (input_bfd); if (local_plt == NULL) - return FALSE; + return false; /* Address of the PLT slot. */ relocation = (htab->elf.iplt->output_section->vma @@ -2434,8 +2136,8 @@ elf_s390_relocate_section (bfd *output_bfd, } else { - bfd_boolean warned ATTRIBUTE_UNUSED; - bfd_boolean ignored ATTRIBUTE_UNUSED; + bool warned ATTRIBUTE_UNUSED; + bool ignored ATTRIBUTE_UNUSED; RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, r_symndx, symtab_hdr, sym_hashes, @@ -2494,7 +2196,7 @@ elf_s390_relocate_section (bfd *output_bfd, if (r_type == R_390_GOTPLTENT) relocation += htab->elf.sgot->output_section->vma; } - unresolved_reloc = FALSE; + unresolved_reloc = false; } /* Fall through. */ @@ -2511,7 +2213,7 @@ elf_s390_relocate_section (bfd *output_bfd, if (h != NULL) { - bfd_boolean dyn; + bool dyn; off = h->got.offset; dyn = htab->elf.dynamic_sections_created; @@ -2594,7 +2296,7 @@ elf_s390_relocate_section (bfd *output_bfd, } } else - unresolved_reloc = FALSE; + unresolved_reloc = false; } else { @@ -2681,7 +2383,7 @@ elf_s390_relocate_section (bfd *output_bfd, case R_390_GOTPCDBL: /* Use global offset table as symbol value. */ relocation = htab->elf.sgot->output_section->vma; - unresolved_reloc = FALSE; + unresolved_reloc = false; break; case R_390_PLT12DBL: @@ -2708,13 +2410,13 @@ elf_s390_relocate_section (bfd *output_bfd, if (s390_is_ifunc_symbol_p (h)) relocation = (htab->elf.iplt->output_section->vma - + htab->elf.iplt->output_offset + + htab->elf.iplt->output_offset + h->plt.offset); else relocation = (htab->elf.splt->output_section->vma + htab->elf.splt->output_offset + h->plt.offset); - unresolved_reloc = FALSE; + unresolved_reloc = false; break; case R_390_PLTOFF16: @@ -2742,7 +2444,7 @@ elf_s390_relocate_section (bfd *output_bfd, + htab->elf.splt->output_offset + h->plt.offset - htab->elf.sgot->output_section->vma); - unresolved_reloc = FALSE; + unresolved_reloc = false; break; case R_390_PC16: @@ -2775,6 +2477,9 @@ elf_s390_relocate_section (bfd *output_bfd, case R_390_8: case R_390_16: case R_390_32: + if ((input_section->flags & SEC_ALLOC) == 0) + break; + if (h != NULL && s390_is_ifunc_symbol_p (h) && h->def_regular) @@ -2836,9 +2541,6 @@ elf_s390_relocate_section (bfd *output_bfd, } } - if ((input_section->flags & SEC_ALLOC) == 0) - break; - if ((bfd_link_pic (info) && (h == NULL || (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT @@ -2862,7 +2564,7 @@ elf_s390_relocate_section (bfd *output_bfd, || h->root.type == bfd_link_hash_undefined))) { Elf_Internal_Rela outrel; - bfd_boolean skip, relocate; + bool skip, relocate; asection *sreloc; bfd_byte *loc; @@ -2870,16 +2572,16 @@ elf_s390_relocate_section (bfd *output_bfd, are copied into the output file to be resolved at run time. */ - skip = FALSE; - relocate = 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; + skip = true; else if (outrel.r_offset == (bfd_vma) -2) - skip = TRUE, relocate = TRUE; + skip = true, relocate = true; outrel.r_offset += (input_section->output_section->vma + input_section->output_offset); @@ -2906,7 +2608,7 @@ elf_s390_relocate_section (bfd *output_bfd, outrel.r_addend = relocation + rel->r_addend; if (r_type == R_390_32) { - relocate = TRUE; + relocate = true; outrel.r_info = ELF32_R_INFO (0, R_390_RELATIVE); } else @@ -2918,7 +2620,7 @@ elf_s390_relocate_section (bfd *output_bfd, else if (sec == NULL || sec->owner == NULL) { bfd_set_error(bfd_error_bad_value); - return FALSE; + return false; } else { @@ -3086,7 +2788,7 @@ elf_s390_relocate_section (bfd *output_bfd, relocation = htab->elf.sgot->output_offset + off; if (r_type == R_390_TLS_IE32 || r_type == R_390_TLS_IEENT) relocation += htab->elf.sgot->output_section->vma; - unresolved_reloc = FALSE; + unresolved_reloc = false; } else { @@ -3126,7 +2828,7 @@ elf_s390_relocate_section (bfd *output_bfd, relocation = htab->elf.sgot->output_offset + off; if (r_type == R_390_TLS_IEENT) relocation += htab->elf.sgot->output_section->vma; - unresolved_reloc = FALSE; + unresolved_reloc = false; break; case R_390_TLS_LDM32: @@ -3164,7 +2866,7 @@ elf_s390_relocate_section (bfd *output_bfd, htab->tls_ldm_got.offset |= 1; } relocation = htab->elf.sgot->output_offset + off; - unresolved_reloc = FALSE; + unresolved_reloc = false; break; case R_390_TLS_LE32: @@ -3252,7 +2954,7 @@ elf_s390_relocate_section (bfd *output_bfd, else { invalid_tls_insn (input_bfd, input_section, rel); - return FALSE; + return false; } insn = 0x18000700 | (insn & 0x00f00000) | ry; bfd_put_32 (output_bfd, insn, contents + rel->r_offset); @@ -3268,7 +2970,7 @@ elf_s390_relocate_section (bfd *output_bfd, (insn & 0xff000000) != 0x0d000000) { invalid_tls_insn (input_bfd, input_section, rel); - return FALSE; + return false; } if (!bfd_link_pic (info) && (h == NULL || h->dynindx == -1)) { @@ -3300,7 +3002,7 @@ elf_s390_relocate_section (bfd *output_bfd, if ((insn & 0xff000000) == 0x0d000000) { invalid_tls_insn (input_bfd, input_section, rel); - return FALSE; + return false; } if ((insn & 0xff000000) == 0x4d000000) @@ -3313,7 +3015,7 @@ elf_s390_relocate_section (bfd *output_bfd, { /* GD->IE transition. brasl %r14,__tls_get_addr@plt -> - l %r2,0(%r2,%r12) ; bcr 0,0 */ + l %r2,0(%r2,%r12) ; bcr 0,0 */ insn = 0x5822c000; bfd_put_16 (output_bfd, 0x0700, contents + rel->r_offset + 4); @@ -3333,7 +3035,7 @@ elf_s390_relocate_section (bfd *output_bfd, (insn & 0xff000000) != 0x0d000000) { invalid_tls_insn (input_bfd, input_section, rel); - return FALSE; + return false; } if ((insn & 0xff000000) == 0x0d000000) @@ -3375,10 +3077,11 @@ elf_s390_relocate_section (bfd *output_bfd, rel->r_offset) != (bfd_vma) -1) _bfd_error_handler /* xgettext:c-format */ - (_("%B(%A+%#Lx): unresolvable %s relocation against symbol `%s'"), + (_("%pB(%pA+%#" PRIx64 "): " + "unresolvable %s relocation against symbol `%s'"), input_bfd, input_section, - rel->r_offset, + (uint64_t) rel->r_offset, howto->name, h->root.root.string); @@ -3419,9 +3122,9 @@ elf_s390_relocate_section (bfd *output_bfd, symtab_hdr->sh_link, sym->st_name); if (name == NULL) - return FALSE; + return false; if (*name == '\0') - name = bfd_section_name (input_bfd, sec); + name = bfd_section_name (sec); } if (r == bfd_reloc_overflow) @@ -3432,15 +3135,15 @@ elf_s390_relocate_section (bfd *output_bfd, { _bfd_error_handler /* xgettext:c-format */ - (_("%B(%A+%#Lx): reloc against `%s': error %d"), + (_("%pB(%pA+%#" PRIx64 "): reloc against `%s': error %d"), input_bfd, input_section, - rel->r_offset, name, (int) r); - return FALSE; + (uint64_t) rel->r_offset, name, (int) r); + return false; } } } - return TRUE; + return true; } /* Generate the PLT slots together with the dynamic relocations needed @@ -3592,7 +3295,7 @@ elf_s390_finish_ifunc_symbol (bfd *output_bfd, /* Finish up dynamic symbol handling. We set the contents of various dynamic sections here. */ -static bfd_boolean +static bool elf_s390_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info, struct elf_link_hash_entry *h, @@ -3790,7 +3493,7 @@ elf_s390_finish_dynamic_symbol (bfd *output_bfd, + htab->elf.iplt->output_offset + h->plt.offset), htab->elf.sgot->contents + h->got.offset); - return TRUE; + return true; } } else if (bfd_link_pic (info) @@ -3803,7 +3506,7 @@ elf_s390_finish_dynamic_symbol (bfd *output_bfd, will already have been initialized in the relocate_section function. */ if (!(h->def_regular || ELF_COMMON_DEF_P (h))) - return FALSE; + return false; BFD_ASSERT((h->got.offset & 1) != 0); rela.r_info = ELF32_R_INFO (0, R_390_RELATIVE); rela.r_addend = (h->root.u.def.value @@ -3858,7 +3561,7 @@ elf_s390_finish_dynamic_symbol (bfd *output_bfd, || h == htab->elf.hplt) sym->st_shndx = SHN_ABS; - return TRUE; + return true; } /* Used to decide how to sort relocs in an optimal manner for the @@ -3901,7 +3604,7 @@ elf_s390_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED, /* Finish up the dynamic sections. */ -static bfd_boolean +static bool elf_s390_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info) { @@ -4017,9 +3720,9 @@ elf_s390_finish_dynamic_sections (bfd *output_bfd, if (local_plt[i].plt.offset != (bfd_vma) -1) { asection *sec = local_plt[i].sec; - isym = bfd_sym_from_r_symndx (&htab->sym_cache, ibfd, i); + isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache, ibfd, i); if (isym == NULL) - return FALSE; + return false; if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC) elf_s390_finish_ifunc_symbol (output_bfd, info, NULL, htab, @@ -4031,12 +3734,12 @@ elf_s390_finish_dynamic_sections (bfd *output_bfd, } } } - return TRUE; + return true; } /* Support for core dump NOTE sections. */ -static bfd_boolean +static bool elf_s390_grok_prstatus (bfd * abfd, Elf_Internal_Note * note) { int offset; @@ -4045,7 +3748,7 @@ elf_s390_grok_prstatus (bfd * abfd, Elf_Internal_Note * note) switch (note->descsz) { default: - return FALSE; + return false; case 224: /* S/390 Linux. */ /* pr_cursig */ @@ -4065,13 +3768,13 @@ elf_s390_grok_prstatus (bfd * abfd, Elf_Internal_Note * note) size, note->descpos + offset); } -static bfd_boolean +static bool elf_s390_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) { switch (note->descsz) { default: - return FALSE; + return false; case 124: /* sizeof(struct elf_prpsinfo) on s390 */ elf_tdata (abfd)->core->pid @@ -4095,7 +3798,7 @@ elf_s390_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) command[n - 1] = '\0'; } - return TRUE; + return true; } static char * @@ -4111,7 +3814,7 @@ elf_s390_write_core_note (bfd *abfd, char *buf, int *bufsiz, case NT_PRPSINFO: { - char data[124] = { 0 }; + char data[124] ATTRIBUTE_NONSTRING = { 0 }; const char *fname, *psargs; va_start (ap, note_type); @@ -4120,7 +3823,18 @@ elf_s390_write_core_note (bfd *abfd, char *buf, int *bufsiz, va_end (ap); strncpy (data + 28, fname, 16); +#if GCC_VERSION == 8000 || GCC_VERSION == 8001 + DIAGNOSTIC_PUSH; + /* GCC 8.0 and 8.1 warn about 80 equals destination size with + -Wstringop-truncation: + https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85643 + */ + DIAGNOSTIC_IGNORE_STRINGOP_TRUNCATION; +#endif strncpy (data + 44, psargs, 80); +#if GCC_VERSION == 8000 || GCC_VERSION == 8001 + DIAGNOSTIC_POP; +#endif return elfcore_write_note (abfd, buf, bufsiz, "CORE", note_type, &data, sizeof (data)); } @@ -4161,19 +3875,19 @@ elf_s390_plt_sym_val (bfd_vma i, const asection *plt, /* Merge backend specific data from an object file to the output object file when linking. */ -static bfd_boolean +static bool elf32_s390_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info) { bfd *obfd = info->output_bfd; if (!is_s390_elf (ibfd) || !is_s390_elf (obfd)) - return TRUE; + return true; if (!elf_s390_merge_obj_attributes (ibfd, info)) - return FALSE; + return false; elf_elfheader (obfd)->e_flags |= elf_elfheader (ibfd)->e_flags; - return TRUE; + return true; } @@ -4210,7 +3924,6 @@ elf32_s390_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info) #define elf_backend_finish_dynamic_sections elf_s390_finish_dynamic_sections #define elf_backend_finish_dynamic_symbol elf_s390_finish_dynamic_symbol #define elf_backend_gc_mark_hook elf_s390_gc_mark_hook -#define elf_backend_gc_sweep_hook elf_s390_gc_sweep_hook #define elf_backend_reloc_type_class elf_s390_reloc_type_class #define elf_backend_relocate_section elf_s390_relocate_section #define elf_backend_size_dynamic_sections elf_s390_size_dynamic_sections @@ -4219,12 +3932,11 @@ elf32_s390_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info) #define elf_backend_grok_psinfo elf_s390_grok_psinfo #define elf_backend_write_core_note elf_s390_write_core_note #define elf_backend_plt_sym_val elf_s390_plt_sym_val -#define elf_backend_add_symbol_hook elf_s390_add_symbol_hook -#define elf_backend_sort_relocs_p elf_s390_elf_sort_relocs_p +#define elf_backend_sort_relocs_p elf_s390_elf_sort_relocs_p #define bfd_elf32_mkobject elf_s390_mkobject #define elf_backend_object_p elf_s390_object_p -#define elf_backend_linux_prpsinfo32_ugid16 TRUE +#define elf_backend_linux_prpsinfo32_ugid16 true #include "elf32-target.h"