X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Felf32-tilepro.c;h=b0ed70647938abe6beeedda00adb8fa91fe7cf33;hb=e0e48e8cf9bf04fb4fe3f232af299cdd3416e28a;hp=cbb65c6b1a48405fe14ad2492ec3c5404b666b51;hpb=9637f6ef78ecc63d9fca3ccffe825fb8e908a575;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elf32-tilepro.c b/bfd/elf32-tilepro.c index cbb65c6b1a..b0ed706479 100644 --- a/bfd/elf32-tilepro.c +++ b/bfd/elf32-tilepro.c @@ -1,5 +1,5 @@ /* TILEPro-specific support for 32-bit ELF. - Copyright 2011, 2012 Free Software Foundation, Inc. + Copyright (C) 2011-2021 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -34,137 +34,137 @@ static reloc_howto_type tilepro_elf_howto_table [] = /* This reloc does nothing. */ HOWTO (R_TILEPRO_NONE, /* type */ 0, /* rightshift */ - 2, /* size (0 = byte, 1 = short, 2 = long) */ - 32, /* bitsize */ - FALSE, /* pc_relative */ + 3, /* size (0 = byte, 1 = short, 2 = long) */ + 0, /* bitsize */ + false, /* pc_relative */ 0, /* bitpos */ - complain_overflow_bitfield, /* complain_on_overflow */ + complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_TILEPRO_NONE", /* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0, /* src_mask */ 0, /* dst_mask */ - FALSE), /* pcrel_offset */ + false), /* pcrel_offset */ /* A 32 bit absolute relocation. */ HOWTO (R_TILEPRO_32, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 32, /* bitsize */ - FALSE, /* pc_relative */ + false, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_TILEPRO_32", /* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0, /* src_mask */ 0xffffffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + false), /* pcrel_offset */ /* A 16 bit absolute relocation. */ HOWTO (R_TILEPRO_16, /* type */ 0, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ - FALSE, /* pc_relative */ + false, /* pc_relative */ 0, /* bitpos */ complain_overflow_bitfield, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_TILEPRO_16", /* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0, /* src_mask */ 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + false), /* pcrel_offset */ /* An 8 bit absolute relocation. */ HOWTO (R_TILEPRO_8, /* type */ 0, /* rightshift */ 0, /* size (0 = byte, 1 = short, 2 = long) */ 8, /* bitsize */ - FALSE, /* pc_relative */ + false, /* pc_relative */ 0, /* bitpos */ complain_overflow_unsigned, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_TILEPRO_8", /* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0, /* src_mask */ 0xff, /* dst_mask */ - FALSE), /* pcrel_offset */ + false), /* pcrel_offset */ /* A 32 bit pc-relative relocation. */ HOWTO (R_TILEPRO_32_PCREL,/* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 32, /* bitsize */ - TRUE, /* pc_relative */ + true, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_TILEPRO_32_PCREL", /* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0, /* src_mask */ 0xffffffff, /* dst_mask */ - TRUE), /* pcrel_offset */ + true), /* pcrel_offset */ /* A 16 bit pc-relative relocation. */ HOWTO (R_TILEPRO_16_PCREL,/* type */ 0, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ - TRUE, /* pc_relative */ + true, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_TILEPRO_16_PCREL", /* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0, /* src_mask */ 0xffff, /* dst_mask */ - TRUE), /* pcrel_offset */ + true), /* pcrel_offset */ /* An 8 bit pc-relative relocation. */ HOWTO (R_TILEPRO_8_PCREL, /* type */ 0, /* rightshift */ 0, /* size (0 = byte, 1 = short, 2 = long) */ 8, /* bitsize */ - TRUE, /* pc_relative */ + true, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_TILEPRO_8_PCREL",/* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0, /* src_mask */ 0xff, /* dst_mask */ - TRUE), /* pcrel_offset */ + true), /* pcrel_offset */ /* A 16 bit relocation without overflow. */ HOWTO (R_TILEPRO_LO16, /* type */ 0, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ - FALSE, /* pc_relative */ + false, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont,/* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_TILEPRO_LO16", /* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0, /* src_mask */ 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + false), /* pcrel_offset */ /* The high order 16 bits of an address. */ HOWTO (R_TILEPRO_HI16, /* type */ 16, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ - FALSE, /* pc_relative */ + false, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_TILEPRO_HI16", /* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0, /* src_mask */ 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + false), /* pcrel_offset */ /* The high order 16 bits of an address, plus 1 if the contents of the low 16 bits, treated as a signed number, is negative. */ @@ -172,123 +172,123 @@ static reloc_howto_type tilepro_elf_howto_table [] = 16, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ - FALSE, /* pc_relative */ + false, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_TILEPRO_HA16", /* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0, /* src_mask */ 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + false), /* pcrel_offset */ HOWTO (R_TILEPRO_COPY, /* type */ 0, /* rightshift */ 0, /* size (0 = byte, 1 = short, 2 = long) */ 0, /* bitsize */ - FALSE, /* pc_relative */ + false, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_TILEPRO_COPY", /* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0, /* src_mask */ 0, /* dst_mask */ - TRUE), /* pcrel_offset */ + true), /* pcrel_offset */ HOWTO (R_TILEPRO_GLOB_DAT, /* type */ 0, /* rightshift */ 0, /* size (0 = byte, 1 = short, 2 = long) */ 0, /* bitsize */ - FALSE, /* pc_relative */ + false, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_TILEPRO_GLOB_DAT", /* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0, /* src_mask */ 0, /* dst_mask */ - TRUE), /* pcrel_offset */ + true), /* pcrel_offset */ HOWTO (R_TILEPRO_JMP_SLOT, /* type */ 0, /* rightshift */ 0, /* size (0 = byte, 1 = short, 2 = long) */ 0, /* bitsize */ - FALSE, /* pc_relative */ + false, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_TILEPRO_JMP_SLOT", /* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0, /* src_mask */ 0, /* dst_mask */ - TRUE), /* pcrel_offset */ + true), /* pcrel_offset */ HOWTO (R_TILEPRO_RELATIVE, /* type */ 0, /* rightshift */ 0, /* size (0 = byte, 1 = short, 2 = long) */ 0, /* bitsize */ - FALSE, /* pc_relative */ + false, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_TILEPRO_RELATIVE", /* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0, /* src_mask */ 0, /* dst_mask */ - TRUE), /* pcrel_offset */ + true), /* pcrel_offset */ HOWTO (R_TILEPRO_BROFF_X1, /* type */ TILEPRO_LOG2_BUNDLE_ALIGNMENT_IN_BYTES, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 17, /* bitsize */ - TRUE, /* pc_relative */ + true, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_TILEPRO_BROFF_X1", /* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0, /* src_mask */ -1, /* dst_mask */ - TRUE), /* pcrel_offset */ + true), /* pcrel_offset */ HOWTO (R_TILEPRO_JOFFLONG_X1, /* type */ TILEPRO_LOG2_BUNDLE_ALIGNMENT_IN_BYTES, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 29, /* bitsize */ - TRUE, /* pc_relative */ + true, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed,/* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_TILEPRO_JOFFLONG_X1", /* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0, /* src_mask */ -1, /* dst_mask */ - TRUE), /* pcrel_offset */ + true), /* pcrel_offset */ HOWTO (R_TILEPRO_JOFFLONG_X1_PLT, /* type */ TILEPRO_LOG2_BUNDLE_ALIGNMENT_IN_BYTES, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 29, /* bitsize */ - TRUE, /* pc_relative */ + true, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed,/* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_TILEPRO_JOFFLONG_X1_PLT", /* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0, /* src_mask */ -1, /* dst_mask */ - TRUE), /* pcrel_offset */ + true), /* pcrel_offset */ #define TILEPRO_IMM_HOWTO(name, size, bitsize) \ - HOWTO (name, 0, size, bitsize, FALSE, 0, \ - complain_overflow_signed, bfd_elf_generic_reloc, \ - #name, FALSE, 0, -1, FALSE) + HOWTO (name, 0, size, bitsize, false, 0, \ + complain_overflow_signed, bfd_elf_generic_reloc, \ + #name, false, 0, -1, false) #define TILEPRO_UIMM_HOWTO(name, size, bitsize) \ - HOWTO (name, 0, size, bitsize, FALSE, 0, \ - complain_overflow_unsigned, bfd_elf_generic_reloc, \ - #name, FALSE, 0, -1, FALSE) + HOWTO (name, 0, size, bitsize, false, 0, \ + complain_overflow_unsigned, bfd_elf_generic_reloc, \ + #name, false, 0, -1, false) TILEPRO_IMM_HOWTO(R_TILEPRO_IMM8_X0, 0, 8), TILEPRO_IMM_HOWTO(R_TILEPRO_IMM8_Y0, 0, 8), @@ -300,9 +300,9 @@ static reloc_howto_type tilepro_elf_howto_table [] = TILEPRO_IMM_HOWTO(R_TILEPRO_IMM16_X1, 1, 16), #define TILEPRO_IMM16_HOWTO(name, rshift) \ - HOWTO (name, rshift, 1, 16, FALSE, 0, \ - complain_overflow_dont, bfd_elf_generic_reloc, \ - #name, FALSE, 0, 0xffff, FALSE) + HOWTO (name, rshift, 1, 16, false, 0, \ + complain_overflow_dont, bfd_elf_generic_reloc, \ + #name, false, 0, 0xffff, false) TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X0_LO, 0), TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_LO, 0), @@ -317,34 +317,34 @@ static reloc_howto_type tilepro_elf_howto_table [] = 0, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ - TRUE, /* pc_relative */ + true, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_TILEPRO_IMM16_X0_PCREL",/* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0, /* src_mask */ -1, /* dst_mask */ - TRUE), /* pcrel_offset */ + true), /* pcrel_offset */ HOWTO (R_TILEPRO_IMM16_X1_PCREL, /* type */ 0, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ - TRUE, /* pc_relative */ + true, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_TILEPRO_IMM16_X1_PCREL",/* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0, /* src_mask */ -1, /* dst_mask */ - TRUE), /* pcrel_offset */ + true), /* pcrel_offset */ #define TILEPRO_IMM16_HOWTO_PCREL(name, rshift) \ - HOWTO (name, rshift, 1, 16, TRUE, 0, \ - complain_overflow_dont, bfd_elf_generic_reloc, \ - #name, FALSE, 0, 0xffff, TRUE) + HOWTO (name, rshift, 1, 16, true, 0, \ + complain_overflow_dont, bfd_elf_generic_reloc, \ + #name, false, 0, 0xffff, true) TILEPRO_IMM16_HOWTO_PCREL (R_TILEPRO_IMM16_X0_LO_PCREL, 0), TILEPRO_IMM16_HOWTO_PCREL (R_TILEPRO_IMM16_X1_LO_PCREL, 0), @@ -385,15 +385,15 @@ static reloc_howto_type tilepro_elf_howto_table [] = TILEPRO_LOG2_BUNDLE_ALIGNMENT_IN_BYTES, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 29, /* bitsize */ - TRUE, /* pc_relative */ + true, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed,/* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_TILEPRO_TLS_GD_CALL", /* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0, /* src_mask */ -1, /* dst_mask */ - TRUE), /* pcrel_offset */ + true), /* pcrel_offset */ TILEPRO_IMM_HOWTO(R_TILEPRO_IMM8_X0_TLS_GD_ADD, 0, 8), TILEPRO_IMM_HOWTO(R_TILEPRO_IMM8_X1_TLS_GD_ADD, 0, 8), @@ -407,29 +407,29 @@ static reloc_howto_type tilepro_elf_howto_table [] = 0, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ - FALSE, /* pc_relative */ + false, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_TILEPRO_IMM16_X0_TLS_GD",/* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0, /* src_mask */ 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + false), /* pcrel_offset */ HOWTO (R_TILEPRO_IMM16_X1_TLS_GD,/* type */ 0, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ - FALSE, /* pc_relative */ + false, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_TILEPRO_IMM16_X1_TLS_GD",/* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0, /* src_mask */ 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + false), /* pcrel_offset */ TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X0_TLS_GD_LO, 0), TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_TLS_GD_LO, 0), @@ -444,29 +444,29 @@ static reloc_howto_type tilepro_elf_howto_table [] = 0, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ - FALSE, /* pc_relative */ + false, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_TILEPRO_IMM16_X0_TLS_IE",/* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0, /* src_mask */ -1, /* dst_mask */ - TRUE), /* pcrel_offset */ + true), /* pcrel_offset */ HOWTO (R_TILEPRO_IMM16_X1_TLS_IE,/* type */ 0, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ - FALSE, /* pc_relative */ + false, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_TILEPRO_IMM16_X1_TLS_IE",/* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0, /* src_mask */ -1, /* dst_mask */ - TRUE), /* pcrel_offset */ + true), /* pcrel_offset */ TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X0_TLS_IE_LO, 0), TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_TLS_IE_LO, 0), @@ -476,43 +476,43 @@ static reloc_howto_type tilepro_elf_howto_table [] = TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_TLS_IE_HA, 16), /* These are common with the Solaris TLS implementation. */ - HOWTO(R_TILEPRO_TLS_DTPMOD32, 0, 0, 0, FALSE, 0, complain_overflow_dont, - bfd_elf_generic_reloc, "R_TILEPRO_TLS_DTPMOD32", - FALSE, 0, 0, TRUE), - HOWTO(R_TILEPRO_TLS_DTPOFF32, 0, 2, 32, FALSE, 0, complain_overflow_bitfield, - bfd_elf_generic_reloc, "R_TILEPRO_TLS_DTPOFF32", - FALSE, 0, 0xFFFFFFFF, TRUE), - HOWTO(R_TILEPRO_TLS_TPOFF32, 0, 0, 0, FALSE, 0, complain_overflow_dont, - bfd_elf_generic_reloc, "R_TILEPRO_TLS_TPOFF32", - FALSE, 0, 0, TRUE), + HOWTO(R_TILEPRO_TLS_DTPMOD32, 0, 0, 0, false, 0, complain_overflow_dont, + bfd_elf_generic_reloc, "R_TILEPRO_TLS_DTPMOD32", + false, 0, 0, true), + HOWTO(R_TILEPRO_TLS_DTPOFF32, 0, 2, 32, false, 0, complain_overflow_bitfield, + bfd_elf_generic_reloc, "R_TILEPRO_TLS_DTPOFF32", + false, 0, 0xFFFFFFFF, true), + HOWTO(R_TILEPRO_TLS_TPOFF32, 0, 0, 0, false, 0, complain_overflow_dont, + bfd_elf_generic_reloc, "R_TILEPRO_TLS_TPOFF32", + false, 0, 0, true), HOWTO (R_TILEPRO_IMM16_X0_TLS_LE,/* type */ 0, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ - FALSE, /* pc_relative */ + false, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_TILEPRO_IMM16_X0_TLS_LE",/* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0, /* src_mask */ -1, /* dst_mask */ - TRUE), /* pcrel_offset */ + true), /* pcrel_offset */ HOWTO (R_TILEPRO_IMM16_X1_TLS_LE,/* type */ 0, /* rightshift */ 1, /* size (0 = byte, 1 = short, 2 = long) */ 16, /* bitsize */ - FALSE, /* pc_relative */ + false, /* pc_relative */ 0, /* bitpos */ complain_overflow_signed, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_TILEPRO_IMM16_X1_TLS_LE",/* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0, /* src_mask */ -1, /* dst_mask */ - TRUE), /* pcrel_offset */ + true), /* pcrel_offset */ TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X0_TLS_LE_LO, 0), TILEPRO_IMM16_HOWTO (R_TILEPRO_IMM16_X1_TLS_LE_LO, 0), @@ -526,33 +526,33 @@ static reloc_howto_type tilepro_elf_howto_table2 [] = { /* GNU extension to record C++ vtable hierarchy */ HOWTO (R_TILEPRO_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_TILEPRO_GNU_VTINHERIT", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - FALSE), /* pcrel_offset */ + 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_TILEPRO_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_TILEPRO_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_TILEPRO_GNU_VTENTRY", /* name */ - FALSE, /* partial_inplace */ - 0, /* src_mask */ - 0, /* dst_mask */ - FALSE), /* pcrel_offset */ + HOWTO (R_TILEPRO_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_TILEPRO_GNU_VTENTRY", /* name */ + false, /* partial_inplace */ + 0, /* src_mask */ + 0, /* dst_mask */ + false), /* pcrel_offset */ }; @@ -561,8 +561,8 @@ static reloc_howto_type tilepro_elf_howto_table2 [] = typedef struct tilepro_reloc_map { bfd_reloc_code_real_type bfd_reloc_val; - unsigned int tilepro_reloc_val; - reloc_howto_type * table; + unsigned int tilepro_reloc_val; + reloc_howto_type * table; } reloc_map; static const reloc_map tilepro_reloc_map [] = @@ -571,34 +571,34 @@ static const reloc_map tilepro_reloc_map [] = { bfd, tilepro, tilepro_elf_howto_table }, /* Standard relocations. */ - TH_REMAP (BFD_RELOC_NONE, R_TILEPRO_NONE) - TH_REMAP (BFD_RELOC_32, R_TILEPRO_32) - TH_REMAP (BFD_RELOC_16, R_TILEPRO_16) - TH_REMAP (BFD_RELOC_8, R_TILEPRO_8) - TH_REMAP (BFD_RELOC_32_PCREL, R_TILEPRO_32_PCREL) - TH_REMAP (BFD_RELOC_16_PCREL, R_TILEPRO_16_PCREL) - TH_REMAP (BFD_RELOC_8_PCREL, R_TILEPRO_8_PCREL) - TH_REMAP (BFD_RELOC_LO16, R_TILEPRO_LO16) - TH_REMAP (BFD_RELOC_HI16, R_TILEPRO_HI16) - TH_REMAP (BFD_RELOC_HI16_S, R_TILEPRO_HA16) + TH_REMAP (BFD_RELOC_NONE, R_TILEPRO_NONE) + TH_REMAP (BFD_RELOC_32, R_TILEPRO_32) + TH_REMAP (BFD_RELOC_16, R_TILEPRO_16) + TH_REMAP (BFD_RELOC_8, R_TILEPRO_8) + TH_REMAP (BFD_RELOC_32_PCREL, R_TILEPRO_32_PCREL) + TH_REMAP (BFD_RELOC_16_PCREL, R_TILEPRO_16_PCREL) + TH_REMAP (BFD_RELOC_8_PCREL, R_TILEPRO_8_PCREL) + TH_REMAP (BFD_RELOC_LO16, R_TILEPRO_LO16) + TH_REMAP (BFD_RELOC_HI16, R_TILEPRO_HI16) + TH_REMAP (BFD_RELOC_HI16_S, R_TILEPRO_HA16) /* Custom relocations. */ - TH_REMAP (BFD_RELOC_TILEPRO_COPY, R_TILEPRO_COPY) - TH_REMAP (BFD_RELOC_TILEPRO_GLOB_DAT, R_TILEPRO_GLOB_DAT) - TH_REMAP (BFD_RELOC_TILEPRO_JMP_SLOT, R_TILEPRO_JMP_SLOT) - TH_REMAP (BFD_RELOC_TILEPRO_RELATIVE, R_TILEPRO_RELATIVE) - TH_REMAP (BFD_RELOC_TILEPRO_BROFF_X1, R_TILEPRO_BROFF_X1) + TH_REMAP (BFD_RELOC_TILEPRO_COPY, R_TILEPRO_COPY) + TH_REMAP (BFD_RELOC_TILEPRO_GLOB_DAT, R_TILEPRO_GLOB_DAT) + TH_REMAP (BFD_RELOC_TILEPRO_JMP_SLOT, R_TILEPRO_JMP_SLOT) + TH_REMAP (BFD_RELOC_TILEPRO_RELATIVE, R_TILEPRO_RELATIVE) + TH_REMAP (BFD_RELOC_TILEPRO_BROFF_X1, R_TILEPRO_BROFF_X1) TH_REMAP (BFD_RELOC_TILEPRO_JOFFLONG_X1, R_TILEPRO_JOFFLONG_X1) TH_REMAP (BFD_RELOC_TILEPRO_JOFFLONG_X1_PLT, R_TILEPRO_JOFFLONG_X1_PLT) - TH_REMAP (BFD_RELOC_TILEPRO_IMM8_X0, R_TILEPRO_IMM8_X0) - TH_REMAP (BFD_RELOC_TILEPRO_IMM8_Y0, R_TILEPRO_IMM8_Y0) - TH_REMAP (BFD_RELOC_TILEPRO_IMM8_X1, R_TILEPRO_IMM8_X1) - TH_REMAP (BFD_RELOC_TILEPRO_IMM8_Y1, R_TILEPRO_IMM8_Y1) + TH_REMAP (BFD_RELOC_TILEPRO_IMM8_X0, R_TILEPRO_IMM8_X0) + TH_REMAP (BFD_RELOC_TILEPRO_IMM8_Y0, R_TILEPRO_IMM8_Y0) + TH_REMAP (BFD_RELOC_TILEPRO_IMM8_X1, R_TILEPRO_IMM8_X1) + TH_REMAP (BFD_RELOC_TILEPRO_IMM8_Y1, R_TILEPRO_IMM8_Y1) TH_REMAP (BFD_RELOC_TILEPRO_DEST_IMM8_X1, R_TILEPRO_DEST_IMM8_X1) TH_REMAP (BFD_RELOC_TILEPRO_MT_IMM15_X1, R_TILEPRO_MT_IMM15_X1) TH_REMAP (BFD_RELOC_TILEPRO_MF_IMM15_X1, R_TILEPRO_MF_IMM15_X1) - TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0, R_TILEPRO_IMM16_X0) - TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1, R_TILEPRO_IMM16_X1) + TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0, R_TILEPRO_IMM16_X0) + TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1, R_TILEPRO_IMM16_X1) TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_LO, R_TILEPRO_IMM16_X0_LO) TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_LO, R_TILEPRO_IMM16_X1_LO) TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_HI, R_TILEPRO_IMM16_X0_HI) @@ -606,8 +606,8 @@ static const reloc_map tilepro_reloc_map [] = TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_HA, R_TILEPRO_IMM16_X0_HA) TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_HA, R_TILEPRO_IMM16_X1_HA) - TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_PCREL, R_TILEPRO_IMM16_X0_PCREL) - TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_PCREL, R_TILEPRO_IMM16_X1_PCREL) + TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_PCREL, R_TILEPRO_IMM16_X0_PCREL) + TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_PCREL, R_TILEPRO_IMM16_X1_PCREL) TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_LO_PCREL, R_TILEPRO_IMM16_X0_LO_PCREL) TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_LO_PCREL, R_TILEPRO_IMM16_X1_LO_PCREL) TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_HI_PCREL, R_TILEPRO_IMM16_X0_HI_PCREL) @@ -625,23 +625,23 @@ static const reloc_map tilepro_reloc_map [] = TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_GOT_HA, R_TILEPRO_IMM16_X1_GOT_HA) TH_REMAP (BFD_RELOC_TILEPRO_MMSTART_X0, R_TILEPRO_MMSTART_X0) - TH_REMAP (BFD_RELOC_TILEPRO_MMEND_X0, R_TILEPRO_MMEND_X0) + TH_REMAP (BFD_RELOC_TILEPRO_MMEND_X0, R_TILEPRO_MMEND_X0) TH_REMAP (BFD_RELOC_TILEPRO_MMSTART_X1, R_TILEPRO_MMSTART_X1) - TH_REMAP (BFD_RELOC_TILEPRO_MMEND_X1, R_TILEPRO_MMEND_X1) - TH_REMAP (BFD_RELOC_TILEPRO_SHAMT_X0, R_TILEPRO_SHAMT_X0) - TH_REMAP (BFD_RELOC_TILEPRO_SHAMT_X1, R_TILEPRO_SHAMT_X1) - TH_REMAP (BFD_RELOC_TILEPRO_SHAMT_Y0, R_TILEPRO_SHAMT_Y0) - TH_REMAP (BFD_RELOC_TILEPRO_SHAMT_Y1, R_TILEPRO_SHAMT_Y1) + TH_REMAP (BFD_RELOC_TILEPRO_MMEND_X1, R_TILEPRO_MMEND_X1) + TH_REMAP (BFD_RELOC_TILEPRO_SHAMT_X0, R_TILEPRO_SHAMT_X0) + TH_REMAP (BFD_RELOC_TILEPRO_SHAMT_X1, R_TILEPRO_SHAMT_X1) + TH_REMAP (BFD_RELOC_TILEPRO_SHAMT_Y0, R_TILEPRO_SHAMT_Y0) + TH_REMAP (BFD_RELOC_TILEPRO_SHAMT_Y1, R_TILEPRO_SHAMT_Y1) - TH_REMAP (BFD_RELOC_TILEPRO_TLS_GD_CALL, R_TILEPRO_TLS_GD_CALL) + TH_REMAP (BFD_RELOC_TILEPRO_TLS_GD_CALL, R_TILEPRO_TLS_GD_CALL) TH_REMAP (BFD_RELOC_TILEPRO_IMM8_X0_TLS_GD_ADD, R_TILEPRO_IMM8_X0_TLS_GD_ADD) TH_REMAP (BFD_RELOC_TILEPRO_IMM8_X1_TLS_GD_ADD, R_TILEPRO_IMM8_X1_TLS_GD_ADD) TH_REMAP (BFD_RELOC_TILEPRO_IMM8_Y0_TLS_GD_ADD, R_TILEPRO_IMM8_Y0_TLS_GD_ADD) TH_REMAP (BFD_RELOC_TILEPRO_IMM8_Y1_TLS_GD_ADD, R_TILEPRO_IMM8_Y1_TLS_GD_ADD) - TH_REMAP (BFD_RELOC_TILEPRO_TLS_IE_LOAD, R_TILEPRO_TLS_IE_LOAD) + TH_REMAP (BFD_RELOC_TILEPRO_TLS_IE_LOAD, R_TILEPRO_TLS_IE_LOAD) - TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD, R_TILEPRO_IMM16_X0_TLS_GD) - TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD, R_TILEPRO_IMM16_X1_TLS_GD) + TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD, R_TILEPRO_IMM16_X0_TLS_GD) + TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD, R_TILEPRO_IMM16_X1_TLS_GD) TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_LO, R_TILEPRO_IMM16_X0_TLS_GD_LO) TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_LO, R_TILEPRO_IMM16_X1_TLS_GD_LO) TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_HI, R_TILEPRO_IMM16_X0_TLS_GD_HI) @@ -649,8 +649,8 @@ static const reloc_map tilepro_reloc_map [] = TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_HA, R_TILEPRO_IMM16_X0_TLS_GD_HA) TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_HA, R_TILEPRO_IMM16_X1_TLS_GD_HA) - TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE, R_TILEPRO_IMM16_X0_TLS_IE) - TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE, R_TILEPRO_IMM16_X1_TLS_IE) + TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE, R_TILEPRO_IMM16_X0_TLS_IE) + TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE, R_TILEPRO_IMM16_X1_TLS_IE) TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_LO, R_TILEPRO_IMM16_X0_TLS_IE_LO) TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_LO, R_TILEPRO_IMM16_X1_TLS_IE_LO) TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_HI, R_TILEPRO_IMM16_X0_TLS_IE_HI) @@ -662,8 +662,8 @@ static const reloc_map tilepro_reloc_map [] = TH_REMAP (BFD_RELOC_TILEPRO_TLS_DTPOFF32, R_TILEPRO_TLS_DTPOFF32) TH_REMAP (BFD_RELOC_TILEPRO_TLS_TPOFF32, R_TILEPRO_TLS_TPOFF32) - TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE, R_TILEPRO_IMM16_X0_TLS_LE) - TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE, R_TILEPRO_IMM16_X1_TLS_LE) + TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE, R_TILEPRO_IMM16_X0_TLS_LE) + TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE, R_TILEPRO_IMM16_X1_TLS_LE) TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_LO, R_TILEPRO_IMM16_X0_TLS_LE_LO) TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_LO, R_TILEPRO_IMM16_X1_TLS_LE_LO) TH_REMAP (BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HI, R_TILEPRO_IMM16_X0_TLS_LE_HI) @@ -679,35 +679,12 @@ static const reloc_map tilepro_reloc_map [] = -/* The TILEPro linker needs to keep track of the number of relocs that it - decides to copy as dynamic relocs in check_relocs for each symbol. - This is so that it can later discard them if they are found to be - unnecessary. We store the information in a field extending the - regular ELF linker hash table. */ - -struct tilepro_elf_dyn_relocs -{ - struct tilepro_elf_dyn_relocs *next; - - /* The input section of the reloc. */ - asection *sec; - - /* Total number of relocs copied for the input section. */ - bfd_size_type count; - - /* Number of pc-relative relocs copied for the input section. */ - bfd_size_type pc_count; -}; - /* TILEPRO ELF linker hash entry. */ struct tilepro_elf_link_hash_entry { struct elf_link_hash_entry elf; - /* Track dynamic relocs copied for this symbol. */ - struct tilepro_elf_dyn_relocs *dyn_relocs; - #define GOT_UNKNOWN 0 #define GOT_NORMAL 1 #define GOT_TLS_GD 2 @@ -737,34 +714,32 @@ struct _bfd_tilepro_elf_obj_tdata && elf_tdata (bfd) != NULL \ && elf_object_id (bfd) == TILEPRO_ELF_DATA) -#include "elf/common.h" -#include "elf/internal.h" +/* Allocate TILEPro ELF private object data. */ -struct tilepro_elf_link_hash_table +static bool +tilepro_elf_mkobject (bfd *abfd) { - struct elf_link_hash_table elf; - - /* Short-cuts to get to dynamic linker sections. */ - asection *sdynbss; - asection *srelbss; + return bfd_elf_allocate_object (abfd, + sizeof (struct _bfd_tilepro_elf_obj_tdata), + TILEPRO_ELF_DATA); +} - /* Small local sym to section mapping cache. */ - struct sym_cache sym_cache; -}; +#include "elf/common.h" +#include "elf/internal.h" /* Get the Tilepro ELF linker hash table from a link_info structure. */ #define tilepro_elf_hash_table(p) \ - (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \ - == TILEPRO_ELF_DATA \ - ? ((struct tilepro_elf_link_hash_table *) ((p)->hash)) : NULL) + ((is_elf_hash_table ((p)->hash) \ + && elf_hash_table_id (elf_hash_table (p)) == TILEPRO_ELF_DATA) \ + ? (struct elf_link_hash_table *) (p)->hash : NULL) static reloc_howto_type * tilepro_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED, - bfd_reloc_code_real_type code) + bfd_reloc_code_real_type code) { unsigned int i; - for (i = ARRAY_SIZE (tilepro_reloc_map); --i;) + for (i = ARRAY_SIZE (tilepro_reloc_map); i--;) { const reloc_map * entry; @@ -786,10 +761,10 @@ tilepro_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, for (i = 0; i < (sizeof (tilepro_elf_howto_table) - / sizeof (tilepro_elf_howto_table[0])); + / sizeof (tilepro_elf_howto_table[0])); i++) if (tilepro_elf_howto_table[i].name != NULL - && strcasecmp (tilepro_elf_howto_table[i].name, r_name) == 0) + && strcasecmp (tilepro_elf_howto_table[i].name, r_name) == 0) return &tilepro_elf_howto_table[i]; return NULL; @@ -797,21 +772,29 @@ tilepro_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED, /* Set the howto pointer for an TILEPro ELF reloc. */ -static void +static bool tilepro_info_to_howto_rela (bfd * abfd ATTRIBUTE_UNUSED, - arelent * cache_ptr, - Elf_Internal_Rela * dst) + arelent * cache_ptr, + Elf_Internal_Rela * dst) { unsigned int r_type = ELF32_R_TYPE (dst->r_info); if (r_type <= (unsigned int) R_TILEPRO_IMM16_X1_TLS_LE_HA) cache_ptr->howto = &tilepro_elf_howto_table [r_type]; else if (r_type - R_TILEPRO_GNU_VTINHERIT - <= (unsigned int) R_TILEPRO_GNU_VTENTRY) + <= ((unsigned int) R_TILEPRO_GNU_VTENTRY + - (unsigned int) R_TILEPRO_GNU_VTINHERIT)) cache_ptr->howto = &tilepro_elf_howto_table2 [r_type - R_TILEPRO_GNU_VTINHERIT]; else - abort (); + { + /* xgettext:c-format */ + _bfd_error_handler (_("%pB: unsupported relocation type %#x"), + abfd, r_type); + bfd_set_error (bfd_error_bad_value); + return false; + } + return true; } typedef tilepro_bundle_bits (*tilepro_create_func)(int); @@ -924,21 +907,21 @@ static const tilepro_create_func reloc_to_create_func[] = /* Support for core dump NOTE sections. */ -static bfd_boolean +static bool tilepro_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) { int offset; size_t size; if (note->descsz != TILEPRO_PRSTATUS_SIZEOF) - return FALSE; + return false; /* pr_cursig */ - elf_tdata (abfd)->core_signal = + elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + TILEPRO_PRSTATUS_OFFSET_PR_CURSIG); /* pr_pid */ - elf_tdata (abfd)->core_pid = + elf_tdata (abfd)->core->pid = bfd_get_32 (abfd, note->descdata + TILEPRO_PRSTATUS_OFFSET_PR_PID); /* pr_reg */ @@ -950,17 +933,17 @@ tilepro_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) size, note->descpos + offset); } -static bfd_boolean +static bool tilepro_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) { if (note->descsz != TILEPRO_PRPSINFO_SIZEOF) - return FALSE; + return false; - elf_tdata (abfd)->core_program + elf_tdata (abfd)->core->program = _bfd_elfcore_strndup (abfd, note->descdata + TILEPRO_PRPSINFO_OFFSET_PR_FNAME, 16); - elf_tdata (abfd)->core_command + elf_tdata (abfd)->core->command = _bfd_elfcore_strndup (abfd, note->descdata + TILEPRO_PRPSINFO_OFFSET_PR_PSARGS, ELF_PR_PSARGS_SIZE); @@ -970,14 +953,14 @@ tilepro_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) onto the end of the args in some (at least one anyway) implementations, so strip it off if it exists. */ { - char *command = elf_tdata (abfd)->core_command; + char *command = elf_tdata (abfd)->core->command; int n = strlen (command); if (0 < n && command[n - 1] == ' ') command[n - 1] = '\0'; } - return TRUE; + return true; } @@ -996,18 +979,18 @@ tilepro_elf_append_rela_32 (bfd *abfd, asection *s, Elf_Internal_Rela *rel) /* The procedure linkage table starts with the following header: { - rli r29, r29, 16 + rli r29, r29, 16 lwadd r28, r27, 4 } - lw r27, r27 + lw r27, r27 { - info 10 ## SP not offset, return PC in LR - jr r27 + info 10 ## SP not offset, return PC in LR + jr r27 } Subsequent entries are the following, jumping to the header at the end: - lnk r28 + lnk r28 1: { auli r28, r28, <_GLOBAL_OFFSET_TABLE_ - 1b + MY_GOT_OFFSET> @@ -1019,11 +1002,11 @@ tilepro_elf_append_rela_32 (bfd *abfd, asection *s, Elf_Internal_Rela *rel) } { auli r29, zero, MY_PLT_INDEX - lw r28, r28 + lw r28, r28 } { - info 10 ## SP not offset, return PC in LR - jr r28 + info 10 ## SP not offset, return PC in LR + jr r28 } We initially store MY_PLT_INDEX in the high bits so that we can use the all @@ -1122,7 +1105,7 @@ tilepro_plt_entry_build (asection *splt, asection *sgotplt, bfd_vma offset, bfd_signed_vma dist_got0 = dist_got_entry - got_offset; /* Check whether we can use the short plt entry with 16-bit offset. */ - bfd_boolean short_plt_entry = + bool short_plt_entry = (dist_got_entry <= 0x7fff && dist_got0 >= -0x8000); /* Copy the plt entry template. */ @@ -1169,8 +1152,8 @@ link_hash_newfunc (struct bfd_hash_entry *entry, if (entry == NULL) { entry = - bfd_hash_allocate (table, - sizeof (struct tilepro_elf_link_hash_entry)); + bfd_hash_allocate (table, + sizeof (struct tilepro_elf_link_hash_entry)); if (entry == NULL) return entry; } @@ -1182,7 +1165,6 @@ link_hash_newfunc (struct bfd_hash_entry *entry, struct tilepro_elf_link_hash_entry *eh; eh = (struct tilepro_elf_link_hash_entry *) entry; - eh->dyn_relocs = NULL; eh->tls_type = GOT_UNKNOWN; } @@ -1194,14 +1176,14 @@ link_hash_newfunc (struct bfd_hash_entry *entry, static struct bfd_link_hash_table * tilepro_elf_link_hash_table_create (bfd *abfd) { - struct tilepro_elf_link_hash_table *ret; - bfd_size_type amt = sizeof (struct tilepro_elf_link_hash_table); + struct elf_link_hash_table *ret; + size_t amt = sizeof (struct elf_link_hash_table); - ret = (struct tilepro_elf_link_hash_table *) bfd_zmalloc (amt); + ret = (struct elf_link_hash_table *) bfd_zmalloc (amt); if (ret == NULL) return NULL; - if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd, link_hash_newfunc, + if (!_bfd_elf_link_hash_table_init (ret, abfd, link_hash_newfunc, sizeof (struct tilepro_elf_link_hash_entry), TILEPRO_ELF_DATA)) { @@ -1209,12 +1191,12 @@ tilepro_elf_link_hash_table_create (bfd *abfd) return NULL; } - return &ret->elf.root; + return &ret->root; } /* Create the .got section. */ -static bfd_boolean +static bool tilepro_elf_create_got_section (bfd *abfd, struct bfd_link_info *info) { flagword flags; @@ -1224,9 +1206,8 @@ tilepro_elf_create_got_section (bfd *abfd, struct bfd_link_info *info) struct elf_link_hash_table *htab = elf_hash_table (info); /* This function may be called more than once. */ - s = bfd_get_linker_section (abfd, ".got"); - if (s != NULL) - return TRUE; + if (htab->sgot != NULL) + return true; flags = bed->dynamic_sec_flags; @@ -1236,14 +1217,14 @@ tilepro_elf_create_got_section (bfd *abfd, struct bfd_link_info *info) (bed->dynamic_sec_flags | SEC_READONLY)); if (s == NULL - || ! bfd_set_section_alignment (abfd, s, bed->s->log_file_align)) - return FALSE; + || !bfd_set_section_alignment (s, bed->s->log_file_align)) + return false; htab->srelgot = s; s = s_got = bfd_make_section_with_flags (abfd, ".got", flags); if (s == NULL - || !bfd_set_section_alignment (abfd, s, bed->s->log_file_align)) - return FALSE; + || !bfd_set_section_alignment (s, bed->s->log_file_align)) + return false; htab->sgot = s; /* The first bit of the global offset table is the header. */ @@ -1253,9 +1234,8 @@ tilepro_elf_create_got_section (bfd *abfd, struct bfd_link_info *info) { s = bfd_make_section_with_flags (abfd, ".got.plt", flags); if (s == NULL - || !bfd_set_section_alignment (abfd, s, - bed->s->log_file_align)) - return FALSE; + || !bfd_set_section_alignment (s, bed->s->log_file_align)) + return false; htab->sgotplt = s; /* Reserve room for the header. */ @@ -1272,40 +1252,24 @@ tilepro_elf_create_got_section (bfd *abfd, struct bfd_link_info *info) "_GLOBAL_OFFSET_TABLE_"); elf_hash_table (info)->hgot = h; if (h == NULL) - return FALSE; + return false; } - return TRUE; + return true; } /* Create .plt, .rela.plt, .got, .got.plt, .rela.got, .dynbss, and .rela.bss sections in DYNOBJ, and set up shortcuts to them in our hash table. */ -static bfd_boolean +static bool tilepro_elf_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info) { - struct tilepro_elf_link_hash_table *htab; - - htab = tilepro_elf_hash_table (info); - BFD_ASSERT (htab != NULL); - if (!tilepro_elf_create_got_section (dynobj, info)) - return FALSE; - - if (!_bfd_elf_create_dynamic_sections (dynobj, info)) - return FALSE; + return false; - htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss"); - if (!info->shared) - htab->srelbss = bfd_get_linker_section (dynobj, ".rela.bss"); - - if (!htab->elf.splt || !htab->elf.srelplt || !htab->sdynbss - || (!info->shared && !htab->srelbss)) - abort (); - - return TRUE; + return _bfd_elf_create_dynamic_sections (dynobj, info); } /* Copy the extra info we tack onto an elf_link_hash_entry. */ @@ -1320,37 +1284,6 @@ tilepro_elf_copy_indirect_symbol (struct bfd_link_info *info, edir = (struct tilepro_elf_link_hash_entry *) dir; eind = (struct tilepro_elf_link_hash_entry *) ind; - if (eind->dyn_relocs != NULL) - { - if (edir->dyn_relocs != NULL) - { - struct tilepro_elf_dyn_relocs **pp; - struct tilepro_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 tilepro_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) { @@ -1444,7 +1377,7 @@ static int tilepro_elf_tls_transition (struct bfd_link_info *info, int r_type, int is_local) { - if (info->shared) + if (!bfd_link_executable (info)) return r_type; if (is_local) @@ -1457,11 +1390,11 @@ tilepro_elf_tls_transition (struct bfd_link_info *info, int r_type, allocate space in the global offset table or procedure linkage table. */ -static bfd_boolean +static bool tilepro_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, const Elf_Internal_Rela *relocs) { - struct tilepro_elf_link_hash_table *htab; + struct elf_link_hash_table *htab; Elf_Internal_Shdr *symtab_hdr; struct elf_link_hash_entry **sym_hashes; const Elf_Internal_Rela *rel; @@ -1469,8 +1402,8 @@ tilepro_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sreloc; int num_relocs; - if (info->relocatable) - return TRUE; + if (bfd_link_relocatable (info)) + return true; htab = tilepro_elf_hash_table (info); symtab_hdr = &elf_tdata (abfd)->symtab_hdr; @@ -1482,14 +1415,14 @@ tilepro_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, BFD_ASSERT (is_tilepro_elf (abfd) || num_relocs == 0); - if (htab->elf.dynobj == NULL) - htab->elf.dynobj = abfd; + if (htab->dynobj == NULL) + htab->dynobj = abfd; rel_end = relocs + num_relocs; for (rel = relocs; rel < rel_end; rel++) { unsigned int r_type; - unsigned long r_symndx; + unsigned int r_symndx; struct elf_link_hash_entry *h; int tls_type; @@ -1498,9 +1431,10 @@ tilepro_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, if (r_symndx >= NUM_SHDR_ENTRIES (symtab_hdr)) { - (*_bfd_error_handler) (_("%B: bad symbol index: %d"), - abfd, r_symndx); - return FALSE; + /* xgettext:c-format */ + _bfd_error_handler (_("%pB: bad symbol index: %d"), + abfd, r_symndx); + return false; } if (r_symndx < symtab_hdr->sh_info) @@ -1516,58 +1450,58 @@ tilepro_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, r_type = tilepro_elf_tls_transition (info, r_type, h == NULL); switch (r_type) { - case R_TILEPRO_IMM16_X0_TLS_LE: - case R_TILEPRO_IMM16_X1_TLS_LE: - case R_TILEPRO_IMM16_X0_TLS_LE_LO: - case R_TILEPRO_IMM16_X1_TLS_LE_LO: - case R_TILEPRO_IMM16_X0_TLS_LE_HI: - case R_TILEPRO_IMM16_X1_TLS_LE_HI: - case R_TILEPRO_IMM16_X0_TLS_LE_HA: - case R_TILEPRO_IMM16_X1_TLS_LE_HA: - if (info->shared) + case R_TILEPRO_IMM16_X0_TLS_LE: + case R_TILEPRO_IMM16_X1_TLS_LE: + case R_TILEPRO_IMM16_X0_TLS_LE_LO: + case R_TILEPRO_IMM16_X1_TLS_LE_LO: + case R_TILEPRO_IMM16_X0_TLS_LE_HI: + case R_TILEPRO_IMM16_X1_TLS_LE_HI: + case R_TILEPRO_IMM16_X0_TLS_LE_HA: + case R_TILEPRO_IMM16_X1_TLS_LE_HA: + if (!bfd_link_executable (info)) goto r_tilepro_plt32; break; - case R_TILEPRO_IMM16_X0_TLS_GD: - case R_TILEPRO_IMM16_X1_TLS_GD: - case R_TILEPRO_IMM16_X0_TLS_GD_LO: - case R_TILEPRO_IMM16_X1_TLS_GD_LO: - case R_TILEPRO_IMM16_X0_TLS_GD_HI: - case R_TILEPRO_IMM16_X1_TLS_GD_HI: - case R_TILEPRO_IMM16_X0_TLS_GD_HA: - case R_TILEPRO_IMM16_X1_TLS_GD_HA: - BFD_ASSERT (info->shared); + case R_TILEPRO_IMM16_X0_TLS_GD: + case R_TILEPRO_IMM16_X1_TLS_GD: + case R_TILEPRO_IMM16_X0_TLS_GD_LO: + case R_TILEPRO_IMM16_X1_TLS_GD_LO: + case R_TILEPRO_IMM16_X0_TLS_GD_HI: + case R_TILEPRO_IMM16_X1_TLS_GD_HI: + case R_TILEPRO_IMM16_X0_TLS_GD_HA: + case R_TILEPRO_IMM16_X1_TLS_GD_HA: + BFD_ASSERT (bfd_link_pic (info)); tls_type = GOT_TLS_GD; - goto have_got_reference; - - case R_TILEPRO_IMM16_X0_TLS_IE: - case R_TILEPRO_IMM16_X1_TLS_IE: - case R_TILEPRO_IMM16_X0_TLS_IE_LO: - case R_TILEPRO_IMM16_X1_TLS_IE_LO: - case R_TILEPRO_IMM16_X0_TLS_IE_HI: - case R_TILEPRO_IMM16_X1_TLS_IE_HI: - case R_TILEPRO_IMM16_X0_TLS_IE_HA: - case R_TILEPRO_IMM16_X1_TLS_IE_HA: - tls_type = GOT_TLS_IE; - if (info->shared) - info->flags |= DF_STATIC_TLS; - goto have_got_reference; - - case R_TILEPRO_IMM16_X0_GOT: - case R_TILEPRO_IMM16_X1_GOT: - case R_TILEPRO_IMM16_X0_GOT_LO: - case R_TILEPRO_IMM16_X1_GOT_LO: - case R_TILEPRO_IMM16_X0_GOT_HI: - case R_TILEPRO_IMM16_X1_GOT_HI: - case R_TILEPRO_IMM16_X0_GOT_HA: - case R_TILEPRO_IMM16_X1_GOT_HA: - tls_type = GOT_NORMAL; - /* Fall Through */ - - have_got_reference: + goto have_got_reference; + + case R_TILEPRO_IMM16_X0_TLS_IE: + case R_TILEPRO_IMM16_X1_TLS_IE: + case R_TILEPRO_IMM16_X0_TLS_IE_LO: + case R_TILEPRO_IMM16_X1_TLS_IE_LO: + case R_TILEPRO_IMM16_X0_TLS_IE_HI: + case R_TILEPRO_IMM16_X1_TLS_IE_HI: + case R_TILEPRO_IMM16_X0_TLS_IE_HA: + case R_TILEPRO_IMM16_X1_TLS_IE_HA: + tls_type = GOT_TLS_IE; + if (!bfd_link_executable (info)) + info->flags |= DF_STATIC_TLS; + goto have_got_reference; + + case R_TILEPRO_IMM16_X0_GOT: + case R_TILEPRO_IMM16_X1_GOT: + case R_TILEPRO_IMM16_X0_GOT_LO: + case R_TILEPRO_IMM16_X1_GOT_LO: + case R_TILEPRO_IMM16_X0_GOT_HI: + case R_TILEPRO_IMM16_X1_GOT_HI: + case R_TILEPRO_IMM16_X0_GOT_HA: + case R_TILEPRO_IMM16_X1_GOT_HA: + tls_type = GOT_NORMAL; + /* Fall Through */ + + have_got_reference: /* This symbol requires a global offset table entry. */ { - int old_tls_type; + int old_tls_type; if (h != NULL) { @@ -1589,7 +1523,7 @@ tilepro_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, local_got_refcounts = ((bfd_signed_vma *) bfd_zalloc (abfd, size)); if (local_got_refcounts == NULL) - return FALSE; + return false; elf_local_got_refcounts (abfd) = local_got_refcounts; _bfd_tilepro_elf_local_got_tls_type (abfd) = (char *) (local_got_refcounts + symtab_hdr->sh_info); @@ -1609,10 +1543,11 @@ tilepro_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, tls_type = old_tls_type; else { - (*_bfd_error_handler) - (_("%B: `%s' accessed both as normal and thread local symbol"), + _bfd_error_handler + /* xgettext:c-format */ + (_("%pB: `%s' accessed both as normal and thread local symbol"), abfd, h ? h->root.root.string : ""); - return FALSE; + return false; } } @@ -1626,15 +1561,15 @@ tilepro_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, } } - if (htab->elf.sgot == NULL) + if (htab->sgot == NULL) { - if (!tilepro_elf_create_got_section (htab->elf.dynobj, info)) - return FALSE; + if (!tilepro_elf_create_got_section (htab->dynobj, info)) + return false; } break; case R_TILEPRO_TLS_GD_CALL: - if (info->shared) + if (!bfd_link_executable (info)) { /* These are basically R_TILEPRO_JOFFLONG_X1_PLT relocs against __tls_get_addr. */ @@ -1642,16 +1577,16 @@ tilepro_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, if (! _bfd_generic_link_add_one_symbol (info, abfd, "__tls_get_addr", 0, bfd_und_section_ptr, 0, - NULL, FALSE, FALSE, + NULL, false, false, &bh)) - return FALSE; + return false; h = (struct elf_link_hash_entry *) bh; } else break; /* Fall through */ - case R_TILEPRO_JOFFLONG_X1_PLT: + case R_TILEPRO_JOFFLONG_X1_PLT: /* 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 without @@ -1659,23 +1594,23 @@ tilepro_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, need to generate a procedure linkage table after all. */ if (h != NULL) - { - h->needs_plt = 1; - h->plt.refcount += 1; - } + { + h->needs_plt = 1; + h->plt.refcount += 1; + } break; - case R_TILEPRO_32_PCREL: - case R_TILEPRO_16_PCREL: - case R_TILEPRO_8_PCREL: - case R_TILEPRO_IMM16_X0_PCREL: - case R_TILEPRO_IMM16_X1_PCREL: - case R_TILEPRO_IMM16_X0_LO_PCREL: - case R_TILEPRO_IMM16_X1_LO_PCREL: - case R_TILEPRO_IMM16_X0_HI_PCREL: - case R_TILEPRO_IMM16_X1_HI_PCREL: - case R_TILEPRO_IMM16_X0_HA_PCREL: - case R_TILEPRO_IMM16_X1_HA_PCREL: + case R_TILEPRO_32_PCREL: + case R_TILEPRO_16_PCREL: + case R_TILEPRO_8_PCREL: + case R_TILEPRO_IMM16_X0_PCREL: + case R_TILEPRO_IMM16_X1_PCREL: + case R_TILEPRO_IMM16_X0_LO_PCREL: + case R_TILEPRO_IMM16_X1_LO_PCREL: + case R_TILEPRO_IMM16_X0_HI_PCREL: + case R_TILEPRO_IMM16_X1_HI_PCREL: + case R_TILEPRO_IMM16_X0_HA_PCREL: + case R_TILEPRO_IMM16_X1_HA_PCREL: if (h != NULL) h->non_got_ref = 1; @@ -1684,51 +1619,51 @@ tilepro_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, break; /* Fall through. */ - case R_TILEPRO_32: - case R_TILEPRO_16: - case R_TILEPRO_8: - case R_TILEPRO_LO16: - case R_TILEPRO_HI16: - case R_TILEPRO_HA16: - case R_TILEPRO_COPY: - case R_TILEPRO_GLOB_DAT: - case R_TILEPRO_JMP_SLOT: - case R_TILEPRO_RELATIVE: - case R_TILEPRO_BROFF_X1: - case R_TILEPRO_JOFFLONG_X1: - case R_TILEPRO_IMM8_X0: - case R_TILEPRO_IMM8_Y0: - case R_TILEPRO_IMM8_X1: - case R_TILEPRO_IMM8_Y1: - case R_TILEPRO_DEST_IMM8_X1: - case R_TILEPRO_MT_IMM15_X1: - case R_TILEPRO_MF_IMM15_X1: - case R_TILEPRO_IMM16_X0: - case R_TILEPRO_IMM16_X1: - case R_TILEPRO_IMM16_X0_LO: - case R_TILEPRO_IMM16_X1_LO: - case R_TILEPRO_IMM16_X0_HI: - case R_TILEPRO_IMM16_X1_HI: - case R_TILEPRO_IMM16_X0_HA: - case R_TILEPRO_IMM16_X1_HA: - case R_TILEPRO_MMSTART_X0: - case R_TILEPRO_MMEND_X0: - case R_TILEPRO_MMSTART_X1: - case R_TILEPRO_MMEND_X1: - case R_TILEPRO_SHAMT_X0: - case R_TILEPRO_SHAMT_X1: - case R_TILEPRO_SHAMT_Y0: - case R_TILEPRO_SHAMT_Y1: + case R_TILEPRO_32: + case R_TILEPRO_16: + case R_TILEPRO_8: + case R_TILEPRO_LO16: + case R_TILEPRO_HI16: + case R_TILEPRO_HA16: + case R_TILEPRO_COPY: + case R_TILEPRO_GLOB_DAT: + case R_TILEPRO_JMP_SLOT: + case R_TILEPRO_RELATIVE: + case R_TILEPRO_BROFF_X1: + case R_TILEPRO_JOFFLONG_X1: + case R_TILEPRO_IMM8_X0: + case R_TILEPRO_IMM8_Y0: + case R_TILEPRO_IMM8_X1: + case R_TILEPRO_IMM8_Y1: + case R_TILEPRO_DEST_IMM8_X1: + case R_TILEPRO_MT_IMM15_X1: + case R_TILEPRO_MF_IMM15_X1: + case R_TILEPRO_IMM16_X0: + case R_TILEPRO_IMM16_X1: + case R_TILEPRO_IMM16_X0_LO: + case R_TILEPRO_IMM16_X1_LO: + case R_TILEPRO_IMM16_X0_HI: + case R_TILEPRO_IMM16_X1_HI: + case R_TILEPRO_IMM16_X0_HA: + case R_TILEPRO_IMM16_X1_HA: + case R_TILEPRO_MMSTART_X0: + case R_TILEPRO_MMEND_X0: + case R_TILEPRO_MMSTART_X1: + case R_TILEPRO_MMEND_X1: + case R_TILEPRO_SHAMT_X0: + case R_TILEPRO_SHAMT_X1: + case R_TILEPRO_SHAMT_Y0: + case R_TILEPRO_SHAMT_Y1: if (h != NULL) - h->non_got_ref = 1; + h->non_got_ref = 1; r_tilepro_plt32: - if (h != NULL && !info->shared) + if (h != NULL && !bfd_link_pic (info)) { /* We may need a .plt entry if the function this reloc refers to is in a shared lib. */ h->plt.refcount += 1; - } + } /* If we are creating a shared library, and this is a reloc against a global symbol, or a non PC relative reloc @@ -1751,21 +1686,21 @@ tilepro_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, may need to keep relocations for symbols satisfied by a dynamic library if we manage to avoid copy relocs for the symbol. */ - if ((info->shared + if ((bfd_link_pic (info) && (sec->flags & SEC_ALLOC) != 0 && (! tilepro_elf_howto_table[r_type].pc_relative || (h != NULL && (! info->symbolic || h->root.type == bfd_link_hash_defweak || !h->def_regular)))) - || (!info->shared + || (!bfd_link_pic (info) && (sec->flags & SEC_ALLOC) != 0 && h != NULL && (h->root.type == bfd_link_hash_defweak || !h->def_regular))) { - struct tilepro_elf_dyn_relocs *p; - struct tilepro_elf_dyn_relocs **head; + struct elf_dyn_relocs *p; + struct elf_dyn_relocs **head; /* When creating a shared object, we must copy these relocs into the output file. We create a reloc @@ -1773,17 +1708,16 @@ tilepro_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, if (sreloc == NULL) { sreloc = _bfd_elf_make_dynamic_reloc_section - (sec, htab->elf.dynobj, 2, abfd, /*rela?*/ TRUE); + (sec, htab->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 tilepro_elf_link_hash_entry *) h)->dyn_relocs; + head = &h->dyn_relocs; else { /* Track dynamic relocs needed for local syms too. @@ -1797,24 +1731,24 @@ tilepro_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, isym = bfd_sym_from_r_symndx (&htab->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) s = sec; vpp = &elf_section_data (s)->local_dynrel; - head = (struct tilepro_elf_dyn_relocs **) vpp; + head = (struct elf_dyn_relocs **) vpp; } p = *head; if (p == NULL || p->sec != sec) { - bfd_size_type amt = sizeof *p; - p = ((struct tilepro_elf_dyn_relocs *) - bfd_alloc (htab->elf.dynobj, amt)); + size_t amt = sizeof *p; + p = ((struct elf_dyn_relocs *) + bfd_alloc (htab->dynobj, amt)); if (p == NULL) - return FALSE; + return false; p->next = *head; *head = p; p->sec = sec; @@ -1831,12 +1765,12 @@ tilepro_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, case R_TILEPRO_GNU_VTINHERIT: if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset)) - return FALSE; + return false; break; case R_TILEPRO_GNU_VTENTRY: if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend)) - return FALSE; + return false; break; default: @@ -1844,192 +1778,58 @@ tilepro_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, } } - return TRUE; + return true; } static asection * tilepro_elf_gc_mark_hook (asection *sec, - struct bfd_link_info *info, - Elf_Internal_Rela *rel, - struct elf_link_hash_entry *h, - Elf_Internal_Sym *sym) + struct bfd_link_info *info, + Elf_Internal_Rela *rel, + struct elf_link_hash_entry *h, + Elf_Internal_Sym *sym) { if (h != NULL) { switch (ELF32_R_TYPE (rel->r_info)) - { - case R_TILEPRO_GNU_VTINHERIT: - case R_TILEPRO_GNU_VTENTRY: - break; - } + { + case R_TILEPRO_GNU_VTINHERIT: + case R_TILEPRO_GNU_VTENTRY: + return NULL; + } } - return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym); -} - -/* Update the got entry reference counts for the section being removed. */ -static bfd_boolean -tilepro_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info, - asection *sec, const Elf_Internal_Rela *relocs) -{ - struct tilepro_elf_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 (info->relocatable) - return TRUE; - - BFD_ASSERT (is_tilepro_elf (abfd) || sec->reloc_count == 0); - - elf_section_data (sec)->local_dynrel = NULL; - - htab = tilepro_elf_hash_table (info); - BFD_ASSERT (htab != 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++) + /* FIXME: The test here, in check_relocs and in relocate_section + dealing with TLS optimization, ought to be !bfd_link_executable (info). */ + if (bfd_link_pic (info)) { - 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 tilepro_elf_link_hash_entry *eh; - struct tilepro_elf_dyn_relocs **pp; - struct tilepro_elf_dyn_relocs *p; + struct bfd_link_hash_entry *bh; - 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 tilepro_elf_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; - } - } - - r_type = ELF32_R_TYPE (rel->r_info); - r_type = tilepro_elf_tls_transition (info, r_type, h != NULL); - switch (r_type) + switch (ELF32_R_TYPE (rel->r_info)) { - case R_TILEPRO_IMM16_X0_GOT: - case R_TILEPRO_IMM16_X1_GOT: - case R_TILEPRO_IMM16_X0_GOT_LO: - case R_TILEPRO_IMM16_X1_GOT_LO: - case R_TILEPRO_IMM16_X0_GOT_HI: - case R_TILEPRO_IMM16_X1_GOT_HI: - case R_TILEPRO_IMM16_X0_GOT_HA: - case R_TILEPRO_IMM16_X1_GOT_HA: - case R_TILEPRO_IMM16_X0_TLS_GD: - case R_TILEPRO_IMM16_X1_TLS_GD: - case R_TILEPRO_IMM16_X0_TLS_GD_LO: - case R_TILEPRO_IMM16_X1_TLS_GD_LO: - case R_TILEPRO_IMM16_X0_TLS_GD_HI: - case R_TILEPRO_IMM16_X1_TLS_GD_HI: - case R_TILEPRO_IMM16_X0_TLS_GD_HA: - case R_TILEPRO_IMM16_X1_TLS_GD_HA: - case R_TILEPRO_IMM16_X0_TLS_IE: - case R_TILEPRO_IMM16_X1_TLS_IE: - case R_TILEPRO_IMM16_X0_TLS_IE_LO: - case R_TILEPRO_IMM16_X1_TLS_IE_LO: - case R_TILEPRO_IMM16_X0_TLS_IE_HI: - case R_TILEPRO_IMM16_X1_TLS_IE_HI: - case R_TILEPRO_IMM16_X0_TLS_IE_HA: - case R_TILEPRO_IMM16_X1_TLS_IE_HA: - if (h != NULL) - { - if (h->got.refcount > 0) - h->got.refcount--; - } - else - { - if (local_got_refcounts && - local_got_refcounts[r_symndx] > 0) - local_got_refcounts[r_symndx]--; - } - break; - - case R_TILEPRO_32_PCREL: - case R_TILEPRO_16_PCREL: - case R_TILEPRO_8_PCREL: - case R_TILEPRO_IMM16_X0_PCREL: - case R_TILEPRO_IMM16_X1_PCREL: - case R_TILEPRO_IMM16_X0_LO_PCREL: - case R_TILEPRO_IMM16_X1_LO_PCREL: - case R_TILEPRO_IMM16_X0_HI_PCREL: - case R_TILEPRO_IMM16_X1_HI_PCREL: - case R_TILEPRO_IMM16_X0_HA_PCREL: - case R_TILEPRO_IMM16_X1_HA_PCREL: - if (h != NULL - && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0) - break; - /* Fall through. */ - - case R_TILEPRO_32: - case R_TILEPRO_16: - case R_TILEPRO_8: - case R_TILEPRO_LO16: - case R_TILEPRO_HI16: - case R_TILEPRO_HA16: - case R_TILEPRO_COPY: - case R_TILEPRO_GLOB_DAT: - case R_TILEPRO_JMP_SLOT: - case R_TILEPRO_RELATIVE: - case R_TILEPRO_BROFF_X1: - case R_TILEPRO_JOFFLONG_X1: - case R_TILEPRO_IMM8_X0: - case R_TILEPRO_IMM8_Y0: - case R_TILEPRO_IMM8_X1: - case R_TILEPRO_IMM8_Y1: - case R_TILEPRO_DEST_IMM8_X1: - case R_TILEPRO_MT_IMM15_X1: - case R_TILEPRO_MF_IMM15_X1: - case R_TILEPRO_IMM16_X0: - case R_TILEPRO_IMM16_X1: - case R_TILEPRO_IMM16_X0_LO: - case R_TILEPRO_IMM16_X1_LO: - case R_TILEPRO_IMM16_X0_HI: - case R_TILEPRO_IMM16_X1_HI: - case R_TILEPRO_IMM16_X0_HA: - case R_TILEPRO_IMM16_X1_HA: - case R_TILEPRO_MMSTART_X0: - case R_TILEPRO_MMEND_X0: - case R_TILEPRO_MMSTART_X1: - case R_TILEPRO_MMEND_X1: - case R_TILEPRO_SHAMT_X0: - case R_TILEPRO_SHAMT_X1: - case R_TILEPRO_SHAMT_Y0: - case R_TILEPRO_SHAMT_Y1: - if (info->shared) - break; - /* Fall through. */ - - case R_TILEPRO_JOFFLONG_X1_PLT: - if (h != NULL) - { - if (h->plt.refcount > 0) - h->plt.refcount--; - } - break; - - default: - break; + case R_TILEPRO_TLS_GD_CALL: + /* This reloc implicitly references __tls_get_addr. We know + another reloc will reference the same symbol as the one + on this reloc, so the real symbol and section will be + gc marked when processing the other reloc. That lets + us handle __tls_get_addr here. */ + bh = NULL; + if (! _bfd_generic_link_add_one_symbol (info, sec->owner, + "__tls_get_addr", 0, + bfd_und_section_ptr, + 0, NULL, false, + false, &bh)) + return NULL; + h = (struct elf_link_hash_entry *) bh; + BFD_ASSERT (h != NULL); + h->mark = 1; + if (h->is_weakalias) + weakdef (h)->mark = 1; + sym = NULL; } } - return TRUE; + return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym); } /* Adjust a symbol defined by a dynamic object and referenced by a @@ -2038,22 +1838,20 @@ tilepro_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info, change the definition to something the rest of the link can understand. */ -static bfd_boolean +static bool tilepro_elf_adjust_dynamic_symbol (struct bfd_link_info *info, struct elf_link_hash_entry *h) { - struct tilepro_elf_link_hash_table *htab; - struct tilepro_elf_link_hash_entry * eh; - struct tilepro_elf_dyn_relocs *p; - asection *s; + struct elf_link_hash_table *htab; + asection *s, *srel; htab = tilepro_elf_hash_table (info); BFD_ASSERT (htab != NULL); /* Make sure we know what is going on here. */ - BFD_ASSERT (htab->elf.dynobj != NULL + BFD_ASSERT (htab->dynobj != NULL && (h->needs_plt - || h->u.weakdef != NULL + || h->is_weakalias || (h->def_dynamic && h->ref_regular && !h->def_regular))); @@ -2069,16 +1867,16 @@ tilepro_elf_adjust_dynamic_symbol (struct bfd_link_info *info, && h->root.type == bfd_link_hash_undefweak)) { /* This case can occur if we saw a R_TILEPRO_JOFFLONG_X1_PLT - reloc in an input file, but the symbol was never referred - to by a dynamic object, or if all references were garbage - collected. In such a case, we don't actually need to build - a procedure linkage table, and we can just do a - R_TILEPRO_JOFFLONG_X1 relocation instead. */ + reloc in an input file, but the symbol was never referred + to by a dynamic object, or if all references were garbage + collected. In such a case, we don't actually need to build + a procedure linkage table, and we can just do a + R_TILEPRO_JOFFLONG_X1 relocation instead. */ h->plt.offset = (bfd_vma) -1; h->needs_plt = 0; } - return TRUE; + return true; } else h->plt.offset = (bfd_vma) -1; @@ -2086,13 +1884,13 @@ tilepro_elf_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; - return TRUE; + 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 @@ -2102,35 +1900,27 @@ tilepro_elf_adjust_dynamic_symbol (struct bfd_link_info *info, 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 (info->shared) - return TRUE; + 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; + 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; } - eh = (struct tilepro_elf_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 + /* 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 (p == NULL) + if (!_bfd_elf_readonly_dynrelocs (h)) { h->non_got_ref = 0; - return TRUE; + return true; } /* We must allocate the symbol in our .dynbss section, which will @@ -2147,34 +1937,43 @@ tilepro_elf_adjust_dynamic_symbol (struct bfd_link_info *info, to copy the initial value out of the dynamic object and into the runtime process image. We need to remember the offset into the .rel.bss section we are going to use. */ + if ((h->root.u.def.section->flags & SEC_READONLY) != 0) + { + s = htab->sdynrelro; + srel = htab->sreldynrelro; + } + else + { + s = htab->sdynbss; + srel = htab->srelbss; + } if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0) { - htab->srelbss->size += TILEPRO_ELF_RELA_BYTES; + srel->size += TILEPRO_ELF_RELA_BYTES; h->needs_copy = 1; } - return _bfd_elf_adjust_dynamic_copy (h, htab->sdynbss); + return _bfd_elf_adjust_dynamic_copy (info, h, s); } /* 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 tilepro_elf_link_hash_table *htab; - struct tilepro_elf_link_hash_entry *eh; - struct tilepro_elf_dyn_relocs *p; + struct elf_link_hash_table *htab; + struct elf_dyn_relocs *p; if (h->root.type == bfd_link_hash_indirect) - return TRUE; + return true; info = (struct bfd_link_info *) inf; htab = tilepro_elf_hash_table (info); BFD_ASSERT (htab != NULL); - if (htab->elf.dynamic_sections_created + if (htab->dynamic_sections_created && h->plt.refcount > 0) { /* Make sure this symbol is output as a dynamic symbol. @@ -2183,12 +1982,12 @@ 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 (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h)) + if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h)) { - asection *s = htab->elf.splt; + asection *s = htab->splt; /* Allocate room for the header. */ if (s->size == 0) @@ -2196,14 +1995,14 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) s->size = PLT_ENTRY_SIZE; } - h->plt.offset = s->size; + h->plt.offset = s->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 (! info->shared + if (! bfd_link_pic (info) && !h->def_regular) { h->root.u.def.section = s; @@ -2214,10 +2013,10 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) s->size += PLT_ENTRY_SIZE; /* We also need to make an entry in the .got.plt section. */ - htab->elf.sgotplt->size += GOT_ENTRY_SIZE; + htab->sgotplt->size += GOT_ENTRY_SIZE; /* We also need to make an entry in the .rela.plt section. */ - htab->elf.srelplt->size += TILEPRO_ELF_RELA_BYTES; + htab->srelplt->size += TILEPRO_ELF_RELA_BYTES; } else { @@ -2234,14 +2033,14 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) /* If a TLS_IE symbol is now local to the binary, make it a TLS_LE requiring no TLS entry. */ if (h->got.refcount > 0 - && !info->shared + && bfd_link_executable (info) && h->dynindx == -1 && tilepro_elf_hash_entry(h)->tls_type == GOT_TLS_IE) h->got.offset = (bfd_vma) -1; else if (h->got.refcount > 0) { asection *s; - bfd_boolean dyn; + bool dyn; int tls_type = tilepro_elf_hash_entry(h)->tls_type; /* Make sure this symbol is output as a dynamic symbol. @@ -2250,30 +2049,31 @@ 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; + s = htab->sgot; h->got.offset = s->size; s->size += TILEPRO_BYTES_PER_WORD; /* R_TILEPRO_IMM16_Xn_TLS_GD entries need 2 consecutive GOT slots. */ if (tls_type == GOT_TLS_GD) s->size += TILEPRO_BYTES_PER_WORD; - dyn = htab->elf.dynamic_sections_created; + dyn = htab->dynamic_sections_created; /* R_TILEPRO_IMM16_Xn_TLS_IE_xxx needs one dynamic relocation, R_TILEPRO_IMM16_Xn_TLS_GD_xxx needs two if local symbol and two if global. */ if (tls_type == GOT_TLS_GD || tls_type == GOT_TLS_IE) - htab->elf.srelgot->size += 2 * TILEPRO_ELF_RELA_BYTES; - else if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)) - htab->elf.srelgot->size += TILEPRO_ELF_RELA_BYTES; + htab->srelgot->size += 2 * TILEPRO_ELF_RELA_BYTES; + else if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, + bfd_link_pic (info), + h)) + htab->srelgot->size += TILEPRO_ELF_RELA_BYTES; } else h->got.offset = (bfd_vma) -1; - eh = (struct tilepro_elf_link_hash_entry *) h; - 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 @@ -2281,13 +2081,13 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) space for pc-relative relocs that have become local due to symbol visibility changes. */ - if (info->shared) + if (bfd_link_pic (info)) { if (SYMBOL_CALLS_LOCAL (info, h)) { - struct tilepro_elf_dyn_relocs **pp; + 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; @@ -2300,11 +2100,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) - eh->dyn_relocs = NULL; + if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT + || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)) + h->dyn_relocs = NULL; /* Make sure undefined weak symbols are output as a dynamic symbol in PIEs. */ @@ -2312,7 +2113,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; } } } @@ -2325,7 +2126,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf) if (!h->non_got_ref && ((h->def_dynamic && !h->def_regular) - || (htab->elf.dynamic_sections_created + || (htab->dynamic_sections_created && (h->root.type == bfd_link_hash_undefweak || h->root.type == bfd_link_hash_undefined)))) { @@ -2335,7 +2136,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 @@ -2344,51 +2145,25 @@ 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 * TILEPRO_ELF_RELA_BYTES; } - 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 tilepro_elf_link_hash_entry *eh; - struct tilepro_elf_dyn_relocs *p; - - eh = (struct tilepro_elf_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; } /* Return true if the dynamic symbol for a given section should be omitted when creating a shared library. */ -static bfd_boolean +static bool tilepro_elf_omit_section_dynsym (bfd *output_bfd, struct bfd_link_info *info, asection *p) @@ -2397,35 +2172,35 @@ tilepro_elf_omit_section_dynsym (bfd *output_bfd, against the _GLOBAL_OFFSET_TABLE_ symbol emitted in PIC mode can be turned into relocations against the .got symbol. */ if (strcmp (p->name, ".got") == 0) - return FALSE; + return false; - return _bfd_elf_link_omit_section_dynsym (output_bfd, info, p); + return _bfd_elf_omit_section_dynsym_default (output_bfd, info, p); } /* Set the sizes of the dynamic sections. */ #define ELF32_DYNAMIC_INTERPRETER "/lib/ld.so.1" -static bfd_boolean +static bool tilepro_elf_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info) { (void)output_bfd; - struct tilepro_elf_link_hash_table *htab; + struct elf_link_hash_table *htab; bfd *dynobj; asection *s; bfd *ibfd; htab = tilepro_elf_hash_table (info); BFD_ASSERT (htab != NULL); - dynobj = htab->elf.dynobj; + dynobj = htab->dynobj; BFD_ASSERT (dynobj != NULL); if (elf_hash_table (info)->dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (info->executable) + if (bfd_link_executable (info) && !info->nointerp) { s = bfd_get_linker_section (dynobj, ".interp"); BFD_ASSERT (s != NULL); @@ -2436,7 +2211,7 @@ tilepro_elf_size_dynamic_sections (bfd *output_bfd, /* Set up .got offsets for local syms, and space for local dynamic relocs. */ - for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next) + for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next) { bfd_signed_vma *local_got; bfd_signed_vma *end_local_got; @@ -2450,7 +2225,7 @@ tilepro_elf_size_dynamic_sections (bfd *output_bfd, for (s = ibfd->sections; s != NULL; s = s->next) { - struct tilepro_elf_dyn_relocs *p; + struct elf_dyn_relocs *p; for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next) { @@ -2467,7 +2242,12 @@ tilepro_elf_size_dynamic_sections (bfd *output_bfd, srel = elf_section_data (p->sec)->sreloc; srel->size += p->count * TILEPRO_ELF_RELA_BYTES; if ((p->sec->output_section->flags & SEC_READONLY) != 0) - info->flags |= DF_TEXTREL; + { + info->flags |= DF_TEXTREL; + + info->callbacks->minfo (_("%pB: dynamic relocation in read-only section `%pA'\n"), + p->sec->owner, p->sec); + } } } } @@ -2480,8 +2260,8 @@ tilepro_elf_size_dynamic_sections (bfd *output_bfd, locsymcount = symtab_hdr->sh_info; end_local_got = local_got + locsymcount; local_tls_type = _bfd_tilepro_elf_local_got_tls_type (ibfd); - s = htab->elf.sgot; - srel = htab->elf.srelgot; + s = htab->sgot; + srel = htab->srelgot; for (; local_got < end_local_got; ++local_got, ++local_tls_type) { if (*local_got > 0) @@ -2490,7 +2270,7 @@ tilepro_elf_size_dynamic_sections (bfd *output_bfd, s->size += TILEPRO_BYTES_PER_WORD; if (*local_tls_type == GOT_TLS_GD) s->size += TILEPRO_BYTES_PER_WORD; - if (info->shared + if (bfd_link_pic (info) || *local_tls_type == GOT_TLS_GD || *local_tls_type == GOT_TLS_IE) srel->size += TILEPRO_ELF_RELA_BYTES; @@ -2502,37 +2282,37 @@ tilepro_elf_size_dynamic_sections (bfd *output_bfd, /* Allocate global sym .plt and .got entries, and space for global sym dynamic relocs. */ - elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info); + elf_link_hash_traverse (htab, allocate_dynrelocs, info); if (elf_hash_table (info)->dynamic_sections_created) { /* If the .got section is more than 0x8000 bytes, we add 0x8000 to the value of _GLOBAL_OFFSET_TABLE_, so that 16 bit relocations have a greater chance of working. */ - if (htab->elf.sgot->size >= 0x8000 + if (htab->sgot->size >= 0x8000 && elf_hash_table (info)->hgot->root.u.def.value == 0) elf_hash_table (info)->hgot->root.u.def.value = 0x8000; } - if (htab->elf.sgotplt) + if (htab->sgotplt) { struct elf_link_hash_entry *got; got = elf_link_hash_lookup (elf_hash_table (info), "_GLOBAL_OFFSET_TABLE_", - FALSE, FALSE, FALSE); + false, false, false); /* Don't allocate .got.plt section if there are no GOT nor PLT - entries and there is no refeence to _GLOBAL_OFFSET_TABLE_. */ + entries and there is no refeence to _GLOBAL_OFFSET_TABLE_. */ if ((got == NULL || !got->ref_regular_nonweak) - && (htab->elf.sgotplt->size + && (htab->sgotplt->size == GOTPLT_HEADER_SIZE) - && (htab->elf.splt == NULL - || htab->elf.splt->size == 0) - && (htab->elf.sgot == NULL - || (htab->elf.sgot->size + && (htab->splt == NULL + || htab->splt->size == 0) + && (htab->sgot == NULL + || (htab->sgot->size == get_elf_backend_data (output_bfd)->got_header_size))) - htab->elf.sgotplt->size = 0; + htab->sgotplt->size = 0; } /* The check_relocs and adjust_dynamic_symbol entry points have @@ -2543,15 +2323,16 @@ tilepro_elf_size_dynamic_sections (bfd *output_bfd, if ((s->flags & SEC_LINKER_CREATED) == 0) continue; - if (s == htab->elf.splt - || s == htab->elf.sgot - || s == htab->elf.sgotplt - || s == htab->sdynbss) + if (s == htab->splt + || s == htab->sgot + || s == htab->sgotplt + || s == htab->sdynbss + || s == htab->sdynrelro) { /* Strip this section if we don't need it; see the comment below. */ } - else if (strncmp (s->name, ".rela", 5) == 0) + else if (startswith (s->name, ".rela")) { if (s->size != 0) { @@ -2589,53 +2370,10 @@ tilepro_elf_size_dynamic_sections (bfd *output_bfd, at the beginning, and we don't want garbage. */ s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size); if (s->contents == NULL) - return FALSE; + return false; } - if (elf_hash_table (info)->dynamic_sections_created) - { - /* Add some entries to the .dynamic section. We fill in the - values later, in tilepro_elf_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 (info->executable) - { - if (!add_dynamic_entry (DT_DEBUG, 0)) - return FALSE; - } - - if (htab->elf.srelplt->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 (!add_dynamic_entry (DT_RELA, 0) - || !add_dynamic_entry (DT_RELASZ, 0) - || !add_dynamic_entry (DT_RELAENT, TILEPRO_ELF_RELA_BYTES)) - 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) - { - if (!add_dynamic_entry (DT_TEXTREL, 0)) - return FALSE; - } - } -#undef add_dynamic_entry - - return TRUE; + return _bfd_elf_add_dynamic_tags (output_bfd, info, true); } /* Return the base VMA address which should be subtracted from real addresses @@ -2774,14 +2512,14 @@ static const bfd_byte insn_tls_gd_add_Y0Y1[] = { section, which means that the addend must be adjusted accordingly. */ -static bfd_boolean +static int tilepro_elf_relocate_section (bfd *output_bfd, 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) + bfd *input_bfd, asection *input_section, + bfd_byte *contents, Elf_Internal_Rela *relocs, + Elf_Internal_Sym *local_syms, + asection **local_sections) { - struct tilepro_elf_link_hash_table *htab; + struct elf_link_hash_table *htab; Elf_Internal_Shdr *symtab_hdr; struct elf_link_hash_entry **sym_hashes; bfd_vma *local_got_offsets; @@ -2810,7 +2548,7 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, for (; rel < relend; rel++) { int r_type, tls_type; - bfd_boolean is_tls_iele, is_tls_le; + bool is_tls_iele, is_tls_le; reloc_howto_type *howto; unsigned long r_symndx; struct elf_link_hash_entry *h; @@ -2821,9 +2559,9 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, bfd_reloc_status_type r; const char *name; bfd_vma off; - bfd_boolean is_plt = FALSE; - - bfd_boolean unresolved_reloc; + bool is_plt = false; + bool resolved_to_zero; + bool unresolved_reloc; r_type = ELF32_R_TYPE (rel->r_info); if (r_type == R_TILEPRO_GNU_VTINHERIT @@ -2831,14 +2569,7 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, continue; if ((unsigned int)r_type >= NELEMS(tilepro_elf_howto_table)) - { - /* Not clear if we need to check here, but just be paranoid. */ - (*_bfd_error_handler) - (_("%B: unrecognized relocation (0x%x) in section `%A'"), - input_bfd, r_type, input_section); - bfd_set_error (bfd_error_bad_value); - return FALSE; - } + return _bfd_unrecognized_reloc (input_bfd, input_section, r_type); howto = tilepro_elf_howto_table + r_type; @@ -2847,7 +2578,7 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, h = NULL; sym = NULL; sec = NULL; - unresolved_reloc = FALSE; + unresolved_reloc = false; if (r_symndx < symtab_hdr->sh_info) { sym = local_syms + r_symndx; @@ -2856,12 +2587,13 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, } else { - bfd_boolean warned; + bool warned ATTRIBUTE_UNUSED; + bool ignored ATTRIBUTE_UNUSED; RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, r_symndx, symtab_hdr, sym_hashes, h, sec, relocation, - unresolved_reloc, warned); + unresolved_reloc, warned, ignored); if (warned) { /* To avoid generating warning messages about truncated @@ -2878,7 +2610,7 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section, rel, 1, relend, howto, 0, contents); - if (info->relocatable) + if (bfd_link_relocatable (info)) continue; if (h != NULL) @@ -2888,7 +2620,7 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, name = (bfd_elf_string_from_elf_section (input_bfd, symtab_hdr->sh_link, sym->st_name)); if (name == NULL || *name == '\0') - name = bfd_section_name (input_bfd, sec); + name = bfd_section_name (sec); } switch (r_type) @@ -2909,8 +2641,8 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, else if (h != NULL) tls_type = tilepro_elf_hash_entry(h)->tls_type; - is_tls_iele = (! info->shared || tls_type == GOT_TLS_IE); - is_tls_le = is_tls_iele && (!info->shared + is_tls_iele = (bfd_link_executable (info) || tls_type == GOT_TLS_IE); + is_tls_le = is_tls_iele && (bfd_link_executable (info) && (h == NULL || h->dynindx == -1)); if (r_type == R_TILEPRO_TLS_GD_CALL) @@ -2932,8 +2664,8 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, /* GD -> GD */ h = (struct elf_link_hash_entry *) - bfd_link_hash_lookup (info->hash, "__tls_get_addr", FALSE, - FALSE, TRUE); + bfd_link_hash_lookup (info->hash, "__tls_get_addr", false, + false, true); BFD_ASSERT (h != NULL); r_type = R_TILEPRO_JOFFLONG_X1_PLT; howto = tilepro_elf_howto_table + r_type; @@ -2987,7 +2719,7 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, } break; case R_TILEPRO_TLS_IE_LOAD: - if (!info->shared && (h == NULL || h->dynindx == -1)) + if (bfd_link_executable (info) && (h == NULL || h->dynindx == -1)) /* IE -> LE */ tilepro_replace_insn (contents + rel->r_offset, insn_mask_X1_no_dest_no_srca, @@ -3003,31 +2735,36 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, break; } + resolved_to_zero = (h != NULL + && UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)); + switch (r_type) { - case R_TILEPRO_IMM16_X0_GOT: - case R_TILEPRO_IMM16_X1_GOT: - case R_TILEPRO_IMM16_X0_GOT_LO: - case R_TILEPRO_IMM16_X1_GOT_LO: - case R_TILEPRO_IMM16_X0_GOT_HI: - case R_TILEPRO_IMM16_X1_GOT_HI: - case R_TILEPRO_IMM16_X0_GOT_HA: - case R_TILEPRO_IMM16_X1_GOT_HA: + case R_TILEPRO_IMM16_X0_GOT: + case R_TILEPRO_IMM16_X1_GOT: + case R_TILEPRO_IMM16_X0_GOT_LO: + case R_TILEPRO_IMM16_X1_GOT_LO: + case R_TILEPRO_IMM16_X0_GOT_HI: + case R_TILEPRO_IMM16_X1_GOT_HI: + case R_TILEPRO_IMM16_X0_GOT_HA: + case R_TILEPRO_IMM16_X1_GOT_HA: /* Relocation is to the entry for this symbol in the global offset table. */ - if (htab->elf.sgot == NULL) + if (htab->sgot == NULL) abort (); if (h != NULL) { - bfd_boolean dyn; + bool dyn; off = h->got.offset; BFD_ASSERT (off != (bfd_vma) -1); dyn = elf_hash_table (info)->dynamic_sections_created; - if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h) - || (info->shared + if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, + bfd_link_pic (info), + h) + || (bfd_link_pic (info) && SYMBOL_REFERENCES_LOCAL (info, h))) { /* This is actually a static link, or it is a @@ -3047,12 +2784,12 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, else { bfd_put_32 (output_bfd, relocation, - htab->elf.sgot->contents + off); + htab->sgot->contents + off); h->got.offset |= 1; } } else - unresolved_reloc = FALSE; + unresolved_reloc = false; } else { @@ -3062,24 +2799,24 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, off = local_got_offsets[r_symndx]; /* The offset must always be a multiple of 4 on 32-bit. - We use the least significant bit to record + We use the least significant bit to record whether we have already processed this entry. */ if ((off & 1) != 0) off &= ~1; else { - if (info->shared) + if (bfd_link_pic (info)) { asection *s; Elf_Internal_Rela outrel; /* We need to generate a R_TILEPRO_RELATIVE reloc for the dynamic linker. */ - s = htab->elf.srelgot; + s = htab->srelgot; BFD_ASSERT (s != NULL); - outrel.r_offset = (htab->elf.sgot->output_section->vma - + htab->elf.sgot->output_offset + outrel.r_offset = (htab->sgot->output_section->vma + + htab->sgot->output_offset + off); outrel.r_info = ELF32_R_INFO (0, R_TILEPRO_RELATIVE); outrel.r_addend = relocation; @@ -3088,19 +2825,19 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, } bfd_put_32 (output_bfd, relocation, - htab->elf.sgot->contents + off); + htab->sgot->contents + off); local_got_offsets[r_symndx] |= 1; } } - relocation = htab->elf.sgot->output_offset + off - got_base; + relocation = off - got_base; break; - case R_TILEPRO_JOFFLONG_X1_PLT: + case R_TILEPRO_JOFFLONG_X1_PLT: /* Relocation is to the entry for this symbol in the procedure linkage table. */ - BFD_ASSERT (h != NULL); + BFD_ASSERT (h != NULL); - if (h->plt.offset == (bfd_vma) -1 || htab->elf.splt == NULL) + if (h->plt.offset == (bfd_vma) -1 || htab->splt == NULL) { /* We didn't make a PLT entry for this symbol. This happens when statically linking PIC code, or when @@ -3108,72 +2845,73 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, break; } - relocation = (htab->elf.splt->output_section->vma - + htab->elf.splt->output_offset + relocation = (htab->splt->output_section->vma + + htab->splt->output_offset + h->plt.offset); - unresolved_reloc = FALSE; + unresolved_reloc = false; break; - case R_TILEPRO_32_PCREL: - case R_TILEPRO_16_PCREL: - case R_TILEPRO_8_PCREL: - case R_TILEPRO_IMM16_X0_PCREL: - case R_TILEPRO_IMM16_X1_PCREL: - case R_TILEPRO_IMM16_X0_LO_PCREL: - case R_TILEPRO_IMM16_X1_LO_PCREL: - case R_TILEPRO_IMM16_X0_HI_PCREL: - case R_TILEPRO_IMM16_X1_HI_PCREL: - case R_TILEPRO_IMM16_X0_HA_PCREL: - case R_TILEPRO_IMM16_X1_HA_PCREL: + case R_TILEPRO_32_PCREL: + case R_TILEPRO_16_PCREL: + case R_TILEPRO_8_PCREL: + case R_TILEPRO_IMM16_X0_PCREL: + case R_TILEPRO_IMM16_X1_PCREL: + case R_TILEPRO_IMM16_X0_LO_PCREL: + case R_TILEPRO_IMM16_X1_LO_PCREL: + case R_TILEPRO_IMM16_X0_HI_PCREL: + case R_TILEPRO_IMM16_X1_HI_PCREL: + case R_TILEPRO_IMM16_X0_HA_PCREL: + case R_TILEPRO_IMM16_X1_HA_PCREL: if (h != NULL && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0) break; /* Fall through. */ - case R_TILEPRO_32: - case R_TILEPRO_16: - case R_TILEPRO_8: - case R_TILEPRO_LO16: - case R_TILEPRO_HI16: - case R_TILEPRO_HA16: - case R_TILEPRO_COPY: - case R_TILEPRO_GLOB_DAT: - case R_TILEPRO_JMP_SLOT: - case R_TILEPRO_RELATIVE: - case R_TILEPRO_BROFF_X1: - case R_TILEPRO_JOFFLONG_X1: - case R_TILEPRO_IMM8_X0: - case R_TILEPRO_IMM8_Y0: - case R_TILEPRO_IMM8_X1: - case R_TILEPRO_IMM8_Y1: - case R_TILEPRO_DEST_IMM8_X1: - case R_TILEPRO_MT_IMM15_X1: - case R_TILEPRO_MF_IMM15_X1: - case R_TILEPRO_IMM16_X0: - case R_TILEPRO_IMM16_X1: - case R_TILEPRO_IMM16_X0_LO: - case R_TILEPRO_IMM16_X1_LO: - case R_TILEPRO_IMM16_X0_HI: - case R_TILEPRO_IMM16_X1_HI: - case R_TILEPRO_IMM16_X0_HA: - case R_TILEPRO_IMM16_X1_HA: - case R_TILEPRO_MMSTART_X0: - case R_TILEPRO_MMEND_X0: - case R_TILEPRO_MMSTART_X1: - case R_TILEPRO_MMEND_X1: - case R_TILEPRO_SHAMT_X0: - case R_TILEPRO_SHAMT_X1: - case R_TILEPRO_SHAMT_Y0: - case R_TILEPRO_SHAMT_Y1: + case R_TILEPRO_32: + case R_TILEPRO_16: + case R_TILEPRO_8: + case R_TILEPRO_LO16: + case R_TILEPRO_HI16: + case R_TILEPRO_HA16: + case R_TILEPRO_COPY: + case R_TILEPRO_GLOB_DAT: + case R_TILEPRO_JMP_SLOT: + case R_TILEPRO_RELATIVE: + case R_TILEPRO_BROFF_X1: + case R_TILEPRO_JOFFLONG_X1: + case R_TILEPRO_IMM8_X0: + case R_TILEPRO_IMM8_Y0: + case R_TILEPRO_IMM8_X1: + case R_TILEPRO_IMM8_Y1: + case R_TILEPRO_DEST_IMM8_X1: + case R_TILEPRO_MT_IMM15_X1: + case R_TILEPRO_MF_IMM15_X1: + case R_TILEPRO_IMM16_X0: + case R_TILEPRO_IMM16_X1: + case R_TILEPRO_IMM16_X0_LO: + case R_TILEPRO_IMM16_X1_LO: + case R_TILEPRO_IMM16_X0_HI: + case R_TILEPRO_IMM16_X1_HI: + case R_TILEPRO_IMM16_X0_HA: + case R_TILEPRO_IMM16_X1_HA: + case R_TILEPRO_MMSTART_X0: + case R_TILEPRO_MMEND_X0: + case R_TILEPRO_MMSTART_X1: + case R_TILEPRO_MMEND_X1: + case R_TILEPRO_SHAMT_X0: + case R_TILEPRO_SHAMT_X1: + case R_TILEPRO_SHAMT_Y0: + case R_TILEPRO_SHAMT_Y1: if ((input_section->flags & SEC_ALLOC) == 0) break; - if ((info->shared + if ((bfd_link_pic (info) && (h == NULL - || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT + || (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT + && !resolved_to_zero) || h->root.type != bfd_link_hash_undefweak) && (! howto->pc_relative || !SYMBOL_CALLS_LOCAL (info, h))) - || (!info->shared + || (!bfd_link_pic (info) && h != NULL && h->dynindx != -1 && !h->non_got_ref @@ -3183,7 +2921,7 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, || h->root.type == bfd_link_hash_undefined))) { Elf_Internal_Rela outrel; - bfd_boolean skip, relocate = FALSE; + bool skip, relocate = false; /* When generating a shared object, these relocations are copied into the output file to be resolved at run @@ -3191,30 +2929,30 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, BFD_ASSERT (sreloc != NULL); - skip = FALSE; + skip = 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); switch (r_type) { - case R_TILEPRO_32_PCREL: - case R_TILEPRO_16_PCREL: - case R_TILEPRO_8_PCREL: + case R_TILEPRO_32_PCREL: + case R_TILEPRO_16_PCREL: + case R_TILEPRO_8_PCREL: /* If the symbol is not dynamic, we should not keep a dynamic relocation. But an .rela.* slot has been allocated for it, output R_TILEPRO_NONE. FIXME: Add code tracking needed dynamic relocs as e.g. i386 has. */ if (h->dynindx == -1) - skip = TRUE, relocate = TRUE; + skip = true, relocate = true; break; } @@ -3225,7 +2963,7 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, else if (h != NULL && h->dynindx != -1 && (! is_plt - || !info->shared + || !bfd_link_pic (info) || !SYMBOLIC_BIND (info, h) || !h->def_regular)) { @@ -3247,14 +2985,14 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, outrel.r_addend = relocation + rel->r_addend; if (is_plt) - sec = htab->elf.splt; + sec = htab->splt; if (bfd_is_abs_section (sec)) indx = 0; else if (sec == NULL || sec->owner == NULL) { bfd_set_error (bfd_error_bad_value); - return FALSE; + return false; } else { @@ -3270,7 +3008,7 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, if (indx == 0) { - osec = htab->elf.text_index_section; + osec = htab->text_index_section; indx = elf_section_data (osec)->dynindx; } @@ -3279,11 +3017,11 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, if (indx == 0) { BFD_FAIL (); - (*_bfd_error_handler) - (_("%B: probably compiled without -fPIC?"), + _bfd_error_handler + (_("%pB: probably compiled without -fPIC?"), input_bfd); bfd_set_error (bfd_error_bad_value); - return FALSE; + return false; } } @@ -3300,28 +3038,28 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, } break; - case R_TILEPRO_IMM16_X0_TLS_LE: - case R_TILEPRO_IMM16_X1_TLS_LE: - case R_TILEPRO_IMM16_X0_TLS_LE_LO: - case R_TILEPRO_IMM16_X1_TLS_LE_LO: - case R_TILEPRO_IMM16_X0_TLS_LE_HI: - case R_TILEPRO_IMM16_X1_TLS_LE_HI: - case R_TILEPRO_IMM16_X0_TLS_LE_HA: - case R_TILEPRO_IMM16_X1_TLS_LE_HA: - if (info->shared) + case R_TILEPRO_IMM16_X0_TLS_LE: + case R_TILEPRO_IMM16_X1_TLS_LE: + case R_TILEPRO_IMM16_X0_TLS_LE_LO: + case R_TILEPRO_IMM16_X1_TLS_LE_LO: + case R_TILEPRO_IMM16_X0_TLS_LE_HI: + case R_TILEPRO_IMM16_X1_TLS_LE_HI: + case R_TILEPRO_IMM16_X0_TLS_LE_HA: + case R_TILEPRO_IMM16_X1_TLS_LE_HA: + if (!bfd_link_executable (info)) { Elf_Internal_Rela outrel; - bfd_boolean skip; + bool skip; BFD_ASSERT (sreloc != NULL); - skip = FALSE; + skip = 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; + skip = true; outrel.r_offset += (input_section->output_section->vma + input_section->output_offset); if (skip) @@ -3339,31 +3077,33 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, relocation = tpoff (info, relocation); break; - case R_TILEPRO_IMM16_X0_TLS_GD: - case R_TILEPRO_IMM16_X1_TLS_GD: - case R_TILEPRO_IMM16_X0_TLS_GD_LO: - case R_TILEPRO_IMM16_X1_TLS_GD_LO: - case R_TILEPRO_IMM16_X0_TLS_GD_HI: - case R_TILEPRO_IMM16_X1_TLS_GD_HI: - case R_TILEPRO_IMM16_X0_TLS_GD_HA: - case R_TILEPRO_IMM16_X1_TLS_GD_HA: - case R_TILEPRO_IMM16_X0_TLS_IE: - case R_TILEPRO_IMM16_X1_TLS_IE: - case R_TILEPRO_IMM16_X0_TLS_IE_LO: - case R_TILEPRO_IMM16_X1_TLS_IE_LO: - case R_TILEPRO_IMM16_X0_TLS_IE_HI: - case R_TILEPRO_IMM16_X1_TLS_IE_HI: - case R_TILEPRO_IMM16_X0_TLS_IE_HA: - case R_TILEPRO_IMM16_X1_TLS_IE_HA: + case R_TILEPRO_IMM16_X0_TLS_GD: + case R_TILEPRO_IMM16_X1_TLS_GD: + case R_TILEPRO_IMM16_X0_TLS_GD_LO: + case R_TILEPRO_IMM16_X1_TLS_GD_LO: + case R_TILEPRO_IMM16_X0_TLS_GD_HI: + case R_TILEPRO_IMM16_X1_TLS_GD_HI: + case R_TILEPRO_IMM16_X0_TLS_GD_HA: + case R_TILEPRO_IMM16_X1_TLS_GD_HA: + case R_TILEPRO_IMM16_X0_TLS_IE: + case R_TILEPRO_IMM16_X1_TLS_IE: + case R_TILEPRO_IMM16_X0_TLS_IE_LO: + case R_TILEPRO_IMM16_X1_TLS_IE_LO: + case R_TILEPRO_IMM16_X0_TLS_IE_HI: + case R_TILEPRO_IMM16_X1_TLS_IE_HI: + case R_TILEPRO_IMM16_X0_TLS_IE_HA: + case R_TILEPRO_IMM16_X1_TLS_IE_HA: r_type = tilepro_elf_tls_transition (info, r_type, h == NULL); - tls_type = GOT_UNKNOWN; + tls_type = GOT_UNKNOWN; if (h == NULL && local_got_offsets) tls_type = _bfd_tilepro_elf_local_got_tls_type (input_bfd) [r_symndx]; else if (h != NULL) { tls_type = tilepro_elf_hash_entry(h)->tls_type; - if (!info->shared && h->dynindx == -1 && tls_type == GOT_TLS_IE) + if (bfd_link_executable (info) + && h->dynindx == -1 + && tls_type == GOT_TLS_IE) r_type = tilepro_tls_translate_to_le (r_type); } if (tls_type == GOT_TLS_IE) @@ -3394,7 +3134,7 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, local_got_offsets[r_symndx] |= 1; } - if (htab->elf.sgot == NULL) + if (htab->sgot == NULL) abort (); if ((off & 1) != 0) @@ -3403,18 +3143,20 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, { Elf_Internal_Rela outrel; int indx = 0; - bfd_boolean need_relocs = FALSE; + bool need_relocs = false; - if (htab->elf.srelgot == NULL) + if (htab->srelgot == NULL) abort (); if (h != NULL) { - bfd_boolean dyn; - dyn = htab->elf.dynamic_sections_created; + bool dyn; + dyn = htab->dynamic_sections_created; - if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h) - && (!info->shared + if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, + bfd_link_pic (info), + h) + && (!bfd_link_pic (info) || !SYMBOL_REFERENCES_LOCAL (info, h))) { indx = h->dynindx; @@ -3422,38 +3164,38 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, } /* The GOT entries have not been initialized yet. Do it - now, and emit any relocations. */ - if ((info->shared || indx != 0) + now, and emit any relocations. */ + if ((bfd_link_pic (info) || indx != 0) && (h == NULL || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT || h->root.type != bfd_link_hash_undefweak)) - need_relocs = TRUE; - - switch (r_type) - { - case R_TILEPRO_IMM16_X0_TLS_IE: - case R_TILEPRO_IMM16_X1_TLS_IE: - case R_TILEPRO_IMM16_X0_TLS_IE_LO: - case R_TILEPRO_IMM16_X1_TLS_IE_LO: - case R_TILEPRO_IMM16_X0_TLS_IE_HI: - case R_TILEPRO_IMM16_X1_TLS_IE_HI: - case R_TILEPRO_IMM16_X0_TLS_IE_HA: - case R_TILEPRO_IMM16_X1_TLS_IE_HA: + need_relocs = true; + + switch (r_type) + { + case R_TILEPRO_IMM16_X0_TLS_IE: + case R_TILEPRO_IMM16_X1_TLS_IE: + case R_TILEPRO_IMM16_X0_TLS_IE_LO: + case R_TILEPRO_IMM16_X1_TLS_IE_LO: + case R_TILEPRO_IMM16_X0_TLS_IE_HI: + case R_TILEPRO_IMM16_X1_TLS_IE_HI: + case R_TILEPRO_IMM16_X0_TLS_IE_HA: + case R_TILEPRO_IMM16_X1_TLS_IE_HA: if (need_relocs) { - bfd_put_32 (output_bfd, 0, htab->elf.sgot->contents + off); - outrel.r_offset = (htab->elf.sgot->output_section->vma - + htab->elf.sgot->output_offset + off); - outrel.r_addend = 0; + bfd_put_32 (output_bfd, 0, htab->sgot->contents + off); + outrel.r_offset = (htab->sgot->output_section->vma + + htab->sgot->output_offset + off); + outrel.r_addend = 0; if (indx == 0) - outrel.r_addend = relocation - dtpoff_base (info); + outrel.r_addend = relocation - dtpoff_base (info); outrel.r_info = ELF32_R_INFO (indx, R_TILEPRO_TLS_TPOFF32); - tilepro_elf_append_rela_32 (output_bfd, htab->elf.srelgot, + tilepro_elf_append_rela_32 (output_bfd, htab->srelgot, &outrel); - } else { + } else { bfd_put_32 (output_bfd, tpoff (info, relocation), - htab->elf.sgot->contents + off); - } - break; + htab->sgot->contents + off); + } + break; case R_TILEPRO_IMM16_X0_TLS_GD: case R_TILEPRO_IMM16_X1_TLS_GD: @@ -3464,55 +3206,55 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, case R_TILEPRO_IMM16_X0_TLS_GD_HA: case R_TILEPRO_IMM16_X1_TLS_GD_HA: if (need_relocs) { - outrel.r_offset = (htab->elf.sgot->output_section->vma - + htab->elf.sgot->output_offset + off); - outrel.r_addend = 0; - outrel.r_info = ELF32_R_INFO (indx, R_TILEPRO_TLS_DTPMOD32); - bfd_put_32 (output_bfd, 0, htab->elf.sgot->contents + off); - tilepro_elf_append_rela_32 (output_bfd, htab->elf.srelgot, + outrel.r_offset = (htab->sgot->output_section->vma + + htab->sgot->output_offset + off); + outrel.r_addend = 0; + outrel.r_info = ELF32_R_INFO (indx, R_TILEPRO_TLS_DTPMOD32); + bfd_put_32 (output_bfd, 0, htab->sgot->contents + off); + tilepro_elf_append_rela_32 (output_bfd, htab->srelgot, &outrel); if (indx == 0) - { - BFD_ASSERT (! unresolved_reloc); - bfd_put_32 (output_bfd, + { + BFD_ASSERT (! unresolved_reloc); + bfd_put_32 (output_bfd, relocation - dtpoff_base (info), - (htab->elf.sgot->contents + off + + (htab->sgot->contents + off + TILEPRO_BYTES_PER_WORD)); - } + } else - { - bfd_put_32 (output_bfd, 0, - (htab->elf.sgot->contents + off + + { + bfd_put_32 (output_bfd, 0, + (htab->sgot->contents + off + TILEPRO_BYTES_PER_WORD)); - outrel.r_info = ELF32_R_INFO (indx, + outrel.r_info = ELF32_R_INFO (indx, R_TILEPRO_TLS_DTPOFF32); outrel.r_offset += TILEPRO_BYTES_PER_WORD; - tilepro_elf_append_rela_32 (output_bfd, - htab->elf.srelgot, &outrel); - } - } + tilepro_elf_append_rela_32 (output_bfd, + htab->srelgot, &outrel); + } + } else { /* If we are not emitting relocations for a - general dynamic reference, then we must be in a - static link or an executable link with the - symbol binding locally. Mark it as belonging - to module 1, the executable. */ + general dynamic reference, then we must be in a + static link or an executable link with the + symbol binding locally. Mark it as belonging + to module 1, the executable. */ bfd_put_32 (output_bfd, 1, - htab->elf.sgot->contents + off ); + htab->sgot->contents + off ); bfd_put_32 (output_bfd, relocation - dtpoff_base (info), - htab->elf.sgot->contents + off + + htab->sgot->contents + off + TILEPRO_BYTES_PER_WORD); } - break; - } + break; + } } if (off >= (bfd_vma) -2) abort (); - relocation = htab->elf.sgot->output_offset + off - got_base; - unresolved_reloc = FALSE; + relocation = off - got_base; + unresolved_reloc = false; howto = tilepro_elf_howto_table + r_type; break; @@ -3528,11 +3270,13 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, && h->def_dynamic) && _bfd_elf_section_offset (output_bfd, info, input_section, rel->r_offset) != (bfd_vma) -1) - (*_bfd_error_handler) - (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"), + _bfd_error_handler + /* xgettext:c-format */ + (_("%pB(%pA+%#" PRIx64 "): " + "unresolvable %s relocation against symbol `%s'"), input_bfd, input_section, - (long) rel->r_offset, + (uint64_t) rel->r_offset, howto->name, h->root.root.string); @@ -3554,57 +3298,57 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, case R_TILEPRO_IMM16_X1_TLS_GD_HA: case R_TILEPRO_IMM16_X0_TLS_IE_HA: case R_TILEPRO_IMM16_X1_TLS_IE_HA: - relocation += 0x8000; - break; + relocation += 0x8000; + break; } /* Get the operand creation function, if any. */ create_func = reloc_to_create_func[r_type]; if (create_func == NULL) { - r = _bfd_final_link_relocate (howto, input_bfd, input_section, - contents, rel->r_offset, - relocation, rel->r_addend); + r = _bfd_final_link_relocate (howto, input_bfd, input_section, + contents, rel->r_offset, + relocation, rel->r_addend); } else { - if (howto->pc_relative) - { - relocation -= - input_section->output_section->vma + input_section->output_offset; - if (howto->pcrel_offset) - relocation -= rel->r_offset; - } - - bfd_byte *data; - - /* Add the relocation addend if any to the final target value */ - relocation += rel->r_addend; - - /* Do basic range checking */ - r = bfd_check_overflow (howto->complain_on_overflow, - howto->bitsize, - howto->rightshift, - 32, - relocation); - - /* - * Write the relocated value out into the raw section data. - * Don't put a relocation out in the .rela section. - */ - tilepro_bundle_bits mask = create_func(-1); - tilepro_bundle_bits value = create_func(relocation >> howto->rightshift); - - /* Only touch bytes while the mask is not 0, so we - don't write to out of bounds memory if this is actually - a 16-bit switch instruction. */ - for (data = contents + rel->r_offset; mask != 0; data++) - { - bfd_byte byte_mask = (bfd_byte)mask; - *data = (*data & ~byte_mask) | ((bfd_byte)value & byte_mask); - mask >>= 8; - value >>= 8; - } + if (howto->pc_relative) + { + relocation -= + input_section->output_section->vma + input_section->output_offset; + if (howto->pcrel_offset) + relocation -= rel->r_offset; + } + + bfd_byte *data; + + /* Add the relocation addend if any to the final target value */ + relocation += rel->r_addend; + + /* Do basic range checking */ + r = bfd_check_overflow (howto->complain_on_overflow, + howto->bitsize, + howto->rightshift, + 32, + relocation); + + /* + * Write the relocated value out into the raw section data. + * Don't put a relocation out in the .rela section. + */ + tilepro_bundle_bits mask = create_func(-1); + tilepro_bundle_bits value = create_func(relocation >> howto->rightshift); + + /* Only touch bytes while the mask is not 0, so we + don't write to out of bounds memory if this is actually + a 16-bit switch instruction. */ + for (data = contents + rel->r_offset; mask != 0; data++) + { + bfd_byte byte_mask = (bfd_byte)mask; + *data = (*data & ~byte_mask) | ((bfd_byte)value & byte_mask); + mask >>= 8; + value >>= 8; + } } if (r != bfd_reloc_ok) @@ -3614,15 +3358,14 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, switch (r) { case bfd_reloc_overflow: - r = info->callbacks->reloc_overflow + (*info->callbacks->reloc_overflow) (info, (h ? &h->root : NULL), name, howto->name, (bfd_vma) 0, input_bfd, input_section, rel->r_offset); break; case bfd_reloc_undefined: - r = info->callbacks->undefined_symbol - (info, name, input_bfd, input_section, rel->r_offset, - TRUE); + (*info->callbacks->undefined_symbol) + (info, name, input_bfd, input_section, rel->r_offset, true); break; case bfd_reloc_outofrange: @@ -3643,27 +3386,24 @@ tilepro_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info, } if (msg) - r = info->callbacks->warning - (info, msg, name, input_bfd, input_section, rel->r_offset); - - if (! r) - return FALSE; + (*info->callbacks->warning) (info, msg, name, input_bfd, + input_section, rel->r_offset); } } - return TRUE; + return true; } /* Finish up dynamic symbol handling. We set the contents of various dynamic sections here. */ -static bfd_boolean +static bool tilepro_elf_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info, struct elf_link_hash_entry *h, Elf_Internal_Sym *sym) { - struct tilepro_elf_link_hash_table *htab; + struct elf_link_hash_table *htab; htab = tilepro_elf_hash_table (info); BFD_ASSERT (htab != NULL); @@ -3683,9 +3423,9 @@ tilepro_elf_finish_dynamic_symbol (bfd *output_bfd, BFD_ASSERT (h->dynindx != -1); - splt = htab->elf.splt; - srela = htab->elf.srelplt; - sgotplt = htab->elf.sgotplt; + splt = htab->splt; + srela = htab->srelplt; + sgotplt = htab->sgotplt; if (splt == NULL || srela == NULL) abort (); @@ -3733,8 +3473,8 @@ tilepro_elf_finish_dynamic_symbol (bfd *output_bfd, /* This symbol has an entry in the GOT. Set it up. */ - sgot = htab->elf.sgot; - srela = htab->elf.srelgot; + sgot = htab->sgot; + srela = htab->srelgot; BFD_ASSERT (sgot != NULL && srela != NULL); rela.r_offset = (sgot->output_section->vma @@ -3746,7 +3486,7 @@ tilepro_elf_finish_dynamic_symbol (bfd *output_bfd, 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 (info->shared + if (bfd_link_pic (info) && (info->symbolic || h->dynindx == -1) && h->def_regular) { @@ -3775,34 +3515,35 @@ tilepro_elf_finish_dynamic_symbol (bfd *output_bfd, /* This symbols needs a copy reloc. Set it up. */ BFD_ASSERT (h->dynindx != -1); - s = htab->srelbss; - BFD_ASSERT (s != NULL); - rela.r_offset = (h->root.u.def.value + h->root.u.def.section->output_section->vma + h->root.u.def.section->output_offset); rela.r_info = ELF32_R_INFO (h->dynindx, R_TILEPRO_COPY); rela.r_addend = 0; + if (h->root.u.def.section == htab->sdynrelro) + s = htab->sreldynrelro; + else + s = htab->srelbss; tilepro_elf_append_rela_32 (output_bfd, s, &rela); } /* Mark some specially defined symbols as absolute. */ - if (h == htab->elf.hdynamic - || (h == htab->elf.hgot || h == htab->elf.hplt)) + if (h == htab->hdynamic + || (h == htab->hgot || h == htab->hplt)) sym->st_shndx = SHN_ABS; - return TRUE; + return true; } /* Finish up the dynamic sections. */ -static bfd_boolean +static bool tilepro_finish_dyn (bfd *output_bfd, struct bfd_link_info *info, bfd *dynobj, asection *sdyn, asection *splt ATTRIBUTE_UNUSED) { Elf32_External_Dyn *dyncon, *dynconend; - struct tilepro_elf_link_hash_table *htab; + struct elf_link_hash_table *htab; htab = tilepro_elf_hash_table (info); BFD_ASSERT (htab != NULL); @@ -3818,15 +3559,15 @@ tilepro_finish_dyn (bfd *output_bfd, struct bfd_link_info *info, switch (dyn.d_tag) { case DT_PLTGOT: - s = htab->elf.sgotplt; + s = htab->sgotplt; dyn.d_un.d_ptr = s->output_section->vma + s->output_offset; break; case DT_JMPREL: - s = htab->elf.srelplt; + s = htab->srelplt; dyn.d_un.d_ptr = s->output_section->vma + s->output_offset; break; case DT_PLTRELSZ: - s = htab->elf.srelplt; + s = htab->srelplt; dyn.d_un.d_val = s->size; break; default: @@ -3835,34 +3576,34 @@ tilepro_finish_dyn (bfd *output_bfd, struct bfd_link_info *info, bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); } - return TRUE; + return true; } -static bfd_boolean +static bool tilepro_elf_finish_dynamic_sections (bfd *output_bfd, - struct bfd_link_info *info) + struct bfd_link_info *info) { bfd *dynobj; asection *sdyn; - struct tilepro_elf_link_hash_table *htab; + struct elf_link_hash_table *htab; htab = tilepro_elf_hash_table (info); BFD_ASSERT (htab != NULL); - dynobj = htab->elf.dynobj; + dynobj = htab->dynobj; sdyn = bfd_get_linker_section (dynobj, ".dynamic"); if (elf_hash_table (info)->dynamic_sections_created) { asection *splt; - bfd_boolean ret; + bool ret; - splt = htab->elf.splt; + splt = htab->splt; BFD_ASSERT (splt != NULL && sdyn != NULL); ret = tilepro_finish_dyn (output_bfd, info, dynobj, sdyn, splt); - if (ret != TRUE) + if (!ret) return ret; /* Fill in the first entry in the procedure linkage table. */ @@ -3873,50 +3614,51 @@ tilepro_elf_finish_dynamic_sections (bfd *output_bfd, PLT_ENTRY_SIZE - PLT_HEADER_SIZE); } - elf_section_data (splt->output_section)->this_hdr.sh_entsize - = PLT_ENTRY_SIZE; + if (elf_section_data (splt->output_section) != NULL) + elf_section_data (splt->output_section)->this_hdr.sh_entsize + = PLT_ENTRY_SIZE; } - if (htab->elf.sgotplt) + if (htab->sgotplt) { - if (bfd_is_abs_section (htab->elf.sgotplt->output_section)) + if (bfd_is_abs_section (htab->sgotplt->output_section)) { - (*_bfd_error_handler) - (_("discarded output section: `%A'"), htab->elf.sgotplt); - return FALSE; + _bfd_error_handler + (_("discarded output section: `%pA'"), htab->sgotplt); + return false; } - if (htab->elf.sgotplt->size > 0) + if (htab->sgotplt->size > 0) { /* Write the first two entries in .got.plt, needed for the dynamic linker. */ bfd_put_32 (output_bfd, (bfd_vma) -1, - htab->elf.sgotplt->contents); + htab->sgotplt->contents); bfd_put_32 (output_bfd, (bfd_vma) 0, - htab->elf.sgotplt->contents + GOT_ENTRY_SIZE); + htab->sgotplt->contents + GOT_ENTRY_SIZE); } - elf_section_data (htab->elf.sgotplt->output_section)->this_hdr.sh_entsize + elf_section_data (htab->sgotplt->output_section)->this_hdr.sh_entsize = GOT_ENTRY_SIZE; } - if (htab->elf.sgot) + if (htab->sgot) { - if (htab->elf.sgot->size > 0) + if (htab->sgot->size > 0) { /* Set the first entry in the global offset table to the address of the dynamic section. */ bfd_vma val = (sdyn ? sdyn->output_section->vma + sdyn->output_offset : 0); - bfd_put_32 (output_bfd, val, htab->elf.sgot->contents); + bfd_put_32 (output_bfd, val, htab->sgot->contents); } - elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize + elf_section_data (htab->sgot->output_section)->this_hdr.sh_entsize = GOT_ENTRY_SIZE; } - return TRUE; + return true; } @@ -3926,13 +3668,15 @@ tilepro_elf_finish_dynamic_sections (bfd *output_bfd, static bfd_vma tilepro_elf_plt_sym_val (bfd_vma i, const asection *plt, - const arelent *rel ATTRIBUTE_UNUSED) + const arelent *rel ATTRIBUTE_UNUSED) { return plt->vma + (i + 1) * PLT_ENTRY_SIZE; } static enum elf_reloc_type_class -tilepro_reloc_type_class (const Elf_Internal_Rela *rela) +tilepro_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED, + const asection *rel_sec ATTRIBUTE_UNUSED, + const Elf_Internal_Rela *rela) { switch ((int) ELF32_R_TYPE (rela->r_info)) { @@ -3949,7 +3693,7 @@ tilepro_reloc_type_class (const Elf_Internal_Rela *rela) static int tilepro_additional_program_headers (bfd *abfd, - struct bfd_link_info *info ATTRIBUTE_UNUSED) + struct bfd_link_info *info ATTRIBUTE_UNUSED) { /* Each .intrpt section specified by the user adds another PT_LOAD header since the sections are discontiguous. */ @@ -3981,12 +3725,12 @@ tilepro_additional_program_headers (bfd *abfd, #define ELF_MAXPAGESIZE 0x10000 #define ELF_COMMONPAGESIZE 0x10000 -#define TARGET_LITTLE_SYM bfd_elf32_tilepro_vec +#define TARGET_LITTLE_SYM tilepro_elf32_vec #define TARGET_LITTLE_NAME "elf32-tilepro" #define elf_backend_reloc_type_class tilepro_reloc_type_class -#define bfd_elf32_bfd_reloc_name_lookup tilepro_reloc_name_lookup +#define bfd_elf32_bfd_reloc_name_lookup tilepro_reloc_name_lookup #define bfd_elf32_bfd_link_hash_table_create tilepro_elf_link_hash_table_create #define bfd_elf32_bfd_reloc_type_lookup tilepro_reloc_type_lookup @@ -4000,14 +3744,15 @@ tilepro_additional_program_headers (bfd *abfd, #define elf_backend_finish_dynamic_symbol tilepro_elf_finish_dynamic_symbol #define elf_backend_finish_dynamic_sections tilepro_elf_finish_dynamic_sections #define elf_backend_gc_mark_hook tilepro_elf_gc_mark_hook -#define elf_backend_gc_sweep_hook tilepro_elf_gc_sweep_hook #define elf_backend_plt_sym_val tilepro_elf_plt_sym_val -#define elf_info_to_howto_rel NULL -#define elf_info_to_howto tilepro_info_to_howto_rela -#define elf_backend_grok_prstatus tilepro_elf_grok_prstatus -#define elf_backend_grok_psinfo tilepro_elf_grok_psinfo +#define elf_info_to_howto_rel NULL +#define elf_info_to_howto tilepro_info_to_howto_rela +#define elf_backend_grok_prstatus tilepro_elf_grok_prstatus +#define elf_backend_grok_psinfo tilepro_elf_grok_psinfo #define elf_backend_additional_program_headers tilepro_additional_program_headers +#define bfd_elf32_mkobject tilepro_elf_mkobject + #define elf_backend_init_index_section _bfd_elf_init_1_index_section #define elf_backend_can_gc_sections 1 @@ -4018,6 +3763,7 @@ tilepro_additional_program_headers (bfd *abfd, #define elf_backend_plt_alignment 6 #define elf_backend_want_plt_sym 1 #define elf_backend_got_header_size GOT_ENTRY_SIZE +#define elf_backend_want_dynrelro 1 #define elf_backend_rela_normal 1 #define elf_backend_default_execstack 0