X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Felf32-bfin.c;h=931041227837312e17abd4f30727d170d1fbc137;hb=7350820d0ddb74f131ffb66b71fb218987f94fa8;hp=2a5390385cce8e51a5b3117c18ab60c0b0ec0373;hpb=2571583aed598dd3f9651b53434e5f177a0e3cf7;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elf32-bfin.c b/bfd/elf32-bfin.c index 2a5390385c..9310412278 100644 --- a/bfd/elf32-bfin.c +++ b/bfd/elf32-bfin.c @@ -1,5 +1,5 @@ /* ADI Blackfin BFD support for 32-bit ELF. - Copyright (C) 2005-2017 Free Software Foundation, Inc. + Copyright (C) 2005-2021 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -25,6 +25,7 @@ #include "elf/bfin.h" #include "dwarf2.h" #include "hashtab.h" +#include "elf32-bfin.h" /* FUNCTION : bfin_pltpc_reloc ABSTRACT : TODO : figure out how to handle pltpc relocs. */ @@ -45,19 +46,19 @@ bfin_pltpc_reloc ( static bfd_reloc_status_type bfin_pcrel24_reloc (bfd *abfd, - arelent *reloc_entry, - asymbol *symbol, - void * data, - asection *input_section, - bfd *output_bfd, - char **error_message ATTRIBUTE_UNUSED) + arelent *reloc_entry, + asymbol *symbol, + void * data, + asection *input_section, + bfd *output_bfd, + char **error_message ATTRIBUTE_UNUSED) { bfd_vma relocation; bfd_size_type addr = reloc_entry->address; bfd_vma output_base = 0; reloc_howto_type *howto = reloc_entry->howto; asection *output_section; - bfd_boolean relocatable = (output_bfd != NULL); + bool relocatable = (output_bfd != NULL); if (reloc_entry->address > bfd_get_section_limit (abfd, input_section)) return bfd_reloc_outofrange; @@ -142,19 +143,19 @@ bfin_pcrel24_reloc (bfd *abfd, static bfd_reloc_status_type bfin_imm16_reloc (bfd *abfd, - arelent *reloc_entry, - asymbol *symbol, - void * data, - asection *input_section, - bfd *output_bfd, - char **error_message ATTRIBUTE_UNUSED) + arelent *reloc_entry, + asymbol *symbol, + void * data, + asection *input_section, + bfd *output_bfd, + char **error_message ATTRIBUTE_UNUSED) { bfd_vma relocation, x; bfd_size_type reloc_addr = reloc_entry->address; bfd_vma output_base = 0; reloc_howto_type *howto = reloc_entry->howto; asection *output_section; - bfd_boolean relocatable = (output_bfd != NULL); + bool relocatable = (output_bfd != NULL); /* Is the address of the relocation really within the section? */ if (reloc_entry->address > bfd_get_section_limit (abfd, input_section)) @@ -214,18 +215,18 @@ bfin_imm16_reloc (bfd *abfd, static bfd_reloc_status_type bfin_byte4_reloc (bfd *abfd, - arelent *reloc_entry, - asymbol *symbol, - void * data, - asection *input_section, - bfd *output_bfd, - char **error_message ATTRIBUTE_UNUSED) + arelent *reloc_entry, + asymbol *symbol, + void * data, + asection *input_section, + bfd *output_bfd, + char **error_message ATTRIBUTE_UNUSED) { bfd_vma relocation, x; bfd_size_type addr = reloc_entry->address; bfd_vma output_base = 0; asection *output_section; - bfd_boolean relocatable = (output_bfd != NULL); + bool relocatable = (output_bfd != NULL); /* Is the address of the relocation really within the section? */ if (reloc_entry->address > bfd_get_section_limit (abfd, input_section)) @@ -281,18 +282,18 @@ bfin_byte4_reloc (bfd *abfd, static bfd_reloc_status_type bfin_bfd_reloc (bfd *abfd, arelent *reloc_entry, - asymbol *symbol, - void * data, - asection *input_section, - bfd *output_bfd, - char **error_message ATTRIBUTE_UNUSED) + asymbol *symbol, + void * data, + asection *input_section, + bfd *output_bfd, + char **error_message ATTRIBUTE_UNUSED) { bfd_vma relocation; bfd_size_type addr = reloc_entry->address; bfd_vma output_base = 0; reloc_howto_type *howto = reloc_entry->howto; asection *output_section; - bfd_boolean relocatable = (output_bfd != NULL); + bool relocatable = (output_bfd != NULL); /* Is the address of the relocation really within the section? */ if (reloc_entry->address > bfd_get_section_limit (abfd, input_section)) @@ -329,12 +330,12 @@ bfin_bfd_reloc (bfd *abfd, /* Here the variable relocation holds the final address of the symbol we are relocating against, plus any addend. */ - if (howto->pc_relative == TRUE) + if (howto->pc_relative) { relocation -= input_section->output_section->vma + input_section->output_offset; - if (howto->pcrel_offset == TRUE) - relocation -= reloc_entry->address; + if (howto->pcrel_offset) + relocation -= reloc_entry->address; } if (relocatable) @@ -348,10 +349,10 @@ bfin_bfd_reloc (bfd *abfd, bfd_reloc_status_type status; status = bfd_check_overflow (howto->complain_on_overflow, - howto->bitsize, - howto->rightshift, - bfd_arch_bits_per_address(abfd), - relocation); + howto->bitsize, + howto->rightshift, + bfd_arch_bits_per_address(abfd), + relocation); if (status != bfd_reloc_ok) return status; } @@ -377,17 +378,17 @@ bfin_bfd_reloc (bfd *abfd, { case 0: { - char x = bfd_get_8 (abfd, (char *) data + addr); - DOIT (x); - bfd_put_8 (abfd, x, (unsigned char *) data + addr); + char x = bfd_get_8 (abfd, (char *) data + addr); + DOIT (x); + bfd_put_8 (abfd, x, (unsigned char *) data + addr); } break; case 1: { - unsigned short x = bfd_get_16 (abfd, (bfd_byte *) data + addr); - DOIT (x); - bfd_put_16 (abfd, (bfd_vma) x, (unsigned char *) data + addr); + unsigned short x = bfd_get_16 (abfd, (bfd_byte *) data + addr); + DOIT (x); + bfd_put_16 (abfd, (bfd_vma) x, (unsigned char *) data + addr); } break; @@ -425,57 +426,57 @@ static reloc_howto_type bfin_howto_table [] = 0, /* rightshift. */ 3, /* 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_BFIN_UNUSED0", /* name. */ - FALSE, /* partial_inplace. */ + false, /* partial_inplace. */ 0, /* src_mask. */ 0, /* dst_mask. */ - FALSE), /* pcrel_offset. */ + false), /* pcrel_offset. */ HOWTO (R_BFIN_PCREL5M2, /* type. */ 1, /* rightshift. */ 1, /* size (0 = byte, 1 = short, 2 = long).. */ 4, /* bitsize. */ - TRUE, /* pc_relative. */ + true, /* pc_relative. */ 0, /* bitpos. */ complain_overflow_unsigned, /* complain_on_overflow. */ bfin_bfd_reloc, /* special_function. */ "R_BFIN_PCREL5M2", /* name. */ - FALSE, /* partial_inplace. */ + false, /* partial_inplace. */ 0, /* src_mask. */ 0x0000000F, /* dst_mask. */ - FALSE), /* pcrel_offset. */ + false), /* pcrel_offset. */ HOWTO (R_BFIN_UNUSED1, /* type. */ 0, /* rightshift. */ 3, /* 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_BFIN_UNUSED1", /* name. */ - FALSE, /* partial_inplace. */ + false, /* partial_inplace. */ 0, /* src_mask. */ 0, /* dst_mask. */ - FALSE), /* pcrel_offset. */ + false), /* pcrel_offset. */ HOWTO (R_BFIN_PCREL10, /* type. */ 1, /* rightshift. */ 1, /* size (0 = byte, 1 = short, 2 = long). */ 10, /* bitsize. */ - TRUE, /* pc_relative. */ + true, /* pc_relative. */ 0, /* bitpos. */ complain_overflow_signed, /* complain_on_overflow. */ bfin_bfd_reloc, /* special_function. */ "R_BFIN_PCREL10", /* name. */ - FALSE, /* partial_inplace. */ + false, /* partial_inplace. */ 0, /* src_mask. */ 0x000003FF, /* dst_mask. */ - TRUE), /* pcrel_offset. */ + true), /* pcrel_offset. */ HOWTO (R_BFIN_PCREL12_JUMP, /* type. */ 1, /* rightshift. */ @@ -485,289 +486,289 @@ static reloc_howto_type bfin_howto_table [] = Right shift the rightmost bit.. */ 1, /* size (0 = byte, 1 = short, 2 = long). */ 12, /* bitsize. */ - TRUE, /* pc_relative. */ + true, /* pc_relative. */ 0, /* bitpos. */ complain_overflow_signed, /* complain_on_overflow. */ bfin_bfd_reloc, /* special_function. */ "R_BFIN_PCREL12_JUMP", /* name. */ - FALSE, /* partial_inplace. */ + false, /* partial_inplace. */ 0, /* src_mask. */ 0x0FFF, /* dst_mask. */ - TRUE), /* pcrel_offset. */ + true), /* pcrel_offset. */ HOWTO (R_BFIN_RIMM16, /* 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. */ bfin_imm16_reloc, /* special_function. */ "R_BFIN_RIMM16", /* name. */ - FALSE, /* partial_inplace. */ + false, /* partial_inplace. */ 0, /* src_mask. */ 0x0000FFFF, /* dst_mask. */ - TRUE), /* pcrel_offset. */ + true), /* pcrel_offset. */ HOWTO (R_BFIN_LUIMM16, /* 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. */ bfin_imm16_reloc, /* special_function. */ "R_BFIN_LUIMM16", /* name. */ - FALSE, /* partial_inplace. */ + false, /* partial_inplace. */ 0, /* src_mask. */ 0x0000FFFF, /* dst_mask. */ - TRUE), /* pcrel_offset. */ + true), /* pcrel_offset. */ HOWTO (R_BFIN_HUIMM16, /* type. */ 16, /* rightshift. */ 1, /* size (0 = byte, 1 = short, 2 = long). */ 16, /* bitsize. */ - FALSE, /* pc_relative. */ + false, /* pc_relative. */ 0, /* bitpos. */ complain_overflow_unsigned, /* complain_on_overflow. */ bfin_imm16_reloc, /* special_function. */ "R_BFIN_HUIMM16", /* name. */ - FALSE, /* partial_inplace. */ + false, /* partial_inplace. */ 0, /* src_mask. */ 0x0000FFFF, /* dst_mask. */ - TRUE), /* pcrel_offset. */ + true), /* pcrel_offset. */ HOWTO (R_BFIN_PCREL12_JUMP_S, /* type. */ 1, /* rightshift. */ 1, /* size (0 = byte, 1 = short, 2 = long). */ 12, /* bitsize. */ - TRUE, /* pc_relative. */ + true, /* pc_relative. */ 0, /* bitpos. */ complain_overflow_signed, /* complain_on_overflow. */ bfin_bfd_reloc, /* special_function. */ "R_BFIN_PCREL12_JUMP_S", /* name. */ - FALSE, /* partial_inplace. */ + false, /* partial_inplace. */ 0, /* src_mask. */ 0x00000FFF, /* dst_mask. */ - TRUE), /* pcrel_offset. */ + true), /* pcrel_offset. */ HOWTO (R_BFIN_PCREL24_JUMP_X, /* type. */ - 1, /* rightshift. */ - 2, /* size (0 = byte, 1 = short, 2 = long). */ - 24, /* bitsize. */ - TRUE, /* pc_relative. */ - 0, /* bitpos. */ - complain_overflow_signed, /* complain_on_overflow. */ - bfin_pcrel24_reloc, /* special_function. */ + 1, /* rightshift. */ + 2, /* size (0 = byte, 1 = short, 2 = long). */ + 24, /* bitsize. */ + true, /* pc_relative. */ + 0, /* bitpos. */ + complain_overflow_signed, /* complain_on_overflow. */ + bfin_pcrel24_reloc, /* special_function. */ "R_BFIN_PCREL24_JUMP_X", /* name. */ - FALSE, /* partial_inplace. */ + false, /* partial_inplace. */ 0, /* src_mask. */ 0x00FFFFFF, /* dst_mask. */ - TRUE), /* pcrel_offset. */ + true), /* pcrel_offset. */ HOWTO (R_BFIN_PCREL24, /* type. */ 1, /* rightshift. */ 2, /* size (0 = byte, 1 = short, 2 = long). */ 24, /* bitsize. */ - TRUE, /* pc_relative. */ + true, /* pc_relative. */ 0, /* bitpos. */ complain_overflow_signed, /* complain_on_overflow. */ bfin_pcrel24_reloc, /* special_function. */ "R_BFIN_PCREL24", /* name. */ - FALSE, /* partial_inplace. */ + false, /* partial_inplace. */ 0, /* src_mask. */ 0x00FFFFFF, /* dst_mask. */ - TRUE), /* pcrel_offset. */ + true), /* pcrel_offset. */ HOWTO (R_BFIN_UNUSEDB, /* type. */ 0, /* rightshift. */ 3, /* 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_BFIN_UNUSEDB", /* name. */ - FALSE, /* partial_inplace. */ + false, /* partial_inplace. */ 0, /* src_mask. */ 0, /* dst_mask. */ - FALSE), /* pcrel_offset. */ + false), /* pcrel_offset. */ HOWTO (R_BFIN_UNUSEDC, /* type. */ 0, /* rightshift. */ 3, /* 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_BFIN_UNUSEDC", /* name. */ - FALSE, /* partial_inplace. */ + false, /* partial_inplace. */ 0, /* src_mask. */ 0, /* dst_mask. */ - FALSE), /* pcrel_offset. */ + false), /* pcrel_offset. */ HOWTO (R_BFIN_PCREL24_JUMP_L, /* type. */ 1, /* rightshift. */ 2, /* size (0 = byte, 1 = short, 2 = long). */ 24, /* bitsize. */ - TRUE, /* pc_relative. */ + true, /* pc_relative. */ 0, /* bitpos. */ complain_overflow_signed, /* complain_on_overflow. */ bfin_pcrel24_reloc, /* special_function. */ "R_BFIN_PCREL24_JUMP_L", /* name. */ - FALSE, /* partial_inplace. */ + false, /* partial_inplace. */ 0, /* src_mask. */ 0x00FFFFFF, /* dst_mask. */ - TRUE), /* pcrel_offset. */ + true), /* pcrel_offset. */ HOWTO (R_BFIN_PCREL24_CALL_X, /* type. */ 1, /* rightshift. */ 2, /* size (0 = byte, 1 = short, 2 = long). */ 24, /* bitsize. */ - TRUE, /* pc_relative. */ + true, /* pc_relative. */ 0, /* bitpos. */ complain_overflow_signed, /* complain_on_overflow. */ bfin_pcrel24_reloc, /* special_function. */ "R_BFIN_PCREL24_CALL_X", /* name. */ - FALSE, /* partial_inplace. */ + false, /* partial_inplace. */ 0, /* src_mask. */ 0x00FFFFFF, /* dst_mask. */ - TRUE), /* pcrel_offset. */ + true), /* pcrel_offset. */ HOWTO (R_BFIN_VAR_EQ_SYMB, /* type. */ 0, /* rightshift. */ 2, /* size (0 = byte, 1 = short, 2 = long). */ 32, /* bitsize. */ - FALSE, /* pc_relative. */ + false, /* pc_relative. */ 0, /* bitpos. */ complain_overflow_bitfield, /* complain_on_overflow. */ bfin_bfd_reloc, /* special_function. */ "R_BFIN_VAR_EQ_SYMB", /* name. */ - FALSE, /* partial_inplace. */ + false, /* partial_inplace. */ 0, /* src_mask. */ 0, /* dst_mask. */ - FALSE), /* pcrel_offset. */ + false), /* pcrel_offset. */ HOWTO (R_BFIN_BYTE_DATA, /* 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. */ bfin_bfd_reloc, /* special_function. */ "R_BFIN_BYTE_DATA", /* name. */ - FALSE, /* partial_inplace. */ + false, /* partial_inplace. */ 0, /* src_mask. */ 0xFF, /* dst_mask. */ - TRUE), /* pcrel_offset. */ + true), /* pcrel_offset. */ HOWTO (R_BFIN_BYTE2_DATA, /* 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. */ bfin_bfd_reloc, /* special_function. */ "R_BFIN_BYTE2_DATA", /* name. */ - FALSE, /* partial_inplace. */ + false, /* partial_inplace. */ 0, /* src_mask. */ 0xFFFF, /* dst_mask. */ - TRUE), /* pcrel_offset. */ + true), /* pcrel_offset. */ HOWTO (R_BFIN_BYTE4_DATA, /* type. */ 0, /* rightshift. */ 2, /* size (0 = byte, 1 = short, 2 = long). */ 32, /* bitsize. */ - FALSE, /* pc_relative. */ + false, /* pc_relative. */ 0, /* bitpos. */ complain_overflow_unsigned, /* complain_on_overflow. */ bfin_byte4_reloc, /* special_function. */ "R_BFIN_BYTE4_DATA", /* name. */ - FALSE, /* partial_inplace. */ + false, /* partial_inplace. */ 0, /* src_mask. */ 0xFFFFFFFF, /* dst_mask. */ - TRUE), /* pcrel_offset. */ + true), /* pcrel_offset. */ HOWTO (R_BFIN_PCREL11, /* type. */ 1, /* rightshift. */ 1, /* size (0 = byte, 1 = short, 2 = long). */ 10, /* bitsize. */ - TRUE, /* pc_relative. */ + true, /* pc_relative. */ 0, /* bitpos. */ complain_overflow_unsigned, /* complain_on_overflow. */ bfin_bfd_reloc, /* special_function. */ "R_BFIN_PCREL11", /* name. */ - FALSE, /* partial_inplace. */ + false, /* partial_inplace. */ 0, /* src_mask. */ 0x000003FF, /* dst_mask. */ - FALSE), /* pcrel_offset. */ + false), /* pcrel_offset. */ /* A 18-bit signed operand with the GOT offset for the address of the symbol. */ - HOWTO (R_BFIN_GOT17M4, /* type */ + HOWTO (R_BFIN_GOT17M4, /* type */ 2, /* 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_BFIN_GOT17M4", /* name */ - FALSE, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + false, /* partial_inplace */ + 0xffff, /* src_mask */ + 0xffff, /* dst_mask */ + false), /* pcrel_offset */ /* The upper 16 bits of the GOT offset for the address of the symbol. */ - HOWTO (R_BFIN_GOTHI, /* type */ + HOWTO (R_BFIN_GOTHI, /* 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_BFIN_GOTHI", /* name */ - FALSE, /* partial_inplace */ - 0xffff, /* src_mask */ + false, /* partial_inplace */ + 0xffff, /* src_mask */ 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + false), /* pcrel_offset */ /* The lower 16 bits of the GOT offset for the address of the symbol. */ - HOWTO (R_BFIN_GOTLO, /* type */ + HOWTO (R_BFIN_GOTLO, /* 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_BFIN_GOTLO", /* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + false), /* pcrel_offset */ /* The 32-bit address of the canonical descriptor of a function. */ HOWTO (R_BFIN_FUNCDESC, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 32, /* bitsize */ - FALSE, /* pc_relative */ + false, /* pc_relative */ 0, /* bitpos */ complain_overflow_bitfield, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_BFIN_FUNCDESC", /* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0xffffffff, /* src_mask */ 0xffffffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + false), /* pcrel_offset */ /* A 12-bit signed operand with the GOT offset for the address of canonical descriptor of a function. */ @@ -775,15 +776,15 @@ static reloc_howto_type bfin_howto_table [] = 2, /* 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_BFIN_FUNCDESC_GOT17M4", /* name */ - FALSE, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + false, /* partial_inplace */ + 0xffff, /* src_mask */ + 0xffff, /* dst_mask */ + false), /* pcrel_offset */ /* The upper 16 bits of the GOT offset for the address of the canonical descriptor of a function. */ @@ -791,15 +792,15 @@ static reloc_howto_type bfin_howto_table [] = 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_BFIN_FUNCDESC_GOTHI", /* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + false), /* pcrel_offset */ /* The lower 16 bits of the GOT offset for the address of the canonical descriptor of a function. */ @@ -807,30 +808,30 @@ static reloc_howto_type bfin_howto_table [] = 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_BFIN_FUNCDESC_GOTLO", /* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + false), /* pcrel_offset */ /* The 32-bit address of the canonical descriptor of a function. */ HOWTO (R_BFIN_FUNCDESC_VALUE, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ 64, /* bitsize */ - FALSE, /* pc_relative */ + false, /* pc_relative */ 0, /* bitpos */ complain_overflow_bitfield, /* complain_on_overflow */ bfd_elf_generic_reloc, /* special_function */ "R_BFIN_FUNCDESC_VALUE", /* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0xffffffff, /* src_mask */ 0xffffffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + false), /* pcrel_offset */ /* A 12-bit signed operand with the GOT offset for the address of canonical descriptor of a function. */ @@ -838,15 +839,15 @@ static reloc_howto_type bfin_howto_table [] = 2, /* 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_BFIN_FUNCDESC_GOTOFF17M4", /* name */ - FALSE, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + false, /* partial_inplace */ + 0xffff, /* src_mask */ + 0xffff, /* dst_mask */ + false), /* pcrel_offset */ /* The upper 16 bits of the GOT offset for the address of the canonical descriptor of a function. */ @@ -854,15 +855,15 @@ static reloc_howto_type bfin_howto_table [] = 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_BFIN_FUNCDESC_GOTOFFHI", /* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + false), /* pcrel_offset */ /* The lower 16 bits of the GOT offset for the address of the canonical descriptor of a function. */ @@ -870,47 +871,47 @@ static reloc_howto_type bfin_howto_table [] = 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_BFIN_FUNCDESC_GOTOFFLO", /* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + false), /* pcrel_offset */ /* A 12-bit signed operand with the GOT offset for the address of the symbol. */ - HOWTO (R_BFIN_GOTOFF17M4, /* type */ + HOWTO (R_BFIN_GOTOFF17M4, /* type */ 2, /* 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_BFIN_GOTOFF17M4", /* name */ - FALSE, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + false, /* partial_inplace */ + 0xffff, /* src_mask */ + 0xffff, /* dst_mask */ + false), /* pcrel_offset */ /* The upper 16 bits of the GOT offset for the address of the symbol. */ - HOWTO (R_BFIN_GOTOFFHI, /* type */ + HOWTO (R_BFIN_GOTOFFHI, /* 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_BFIN_GOTOFFHI", /* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + false), /* pcrel_offset */ /* The lower 16 bits of the GOT offset for the address of the symbol. */ @@ -918,15 +919,15 @@ static reloc_howto_type bfin_howto_table [] = 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_BFIN_GOTOFFLO", /* name */ - FALSE, /* partial_inplace */ + false, /* partial_inplace */ 0xffff, /* src_mask */ 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ + false), /* pcrel_offset */ }; static reloc_howto_type bfin_gnuext_howto_table [] = @@ -935,64 +936,64 @@ static reloc_howto_type bfin_gnuext_howto_table [] = 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. */ bfin_pltpc_reloc, /* special_function. */ "R_BFIN_PLTPC", /* name. */ - FALSE, /* partial_inplace. */ + false, /* partial_inplace. */ 0xffff, /* src_mask. */ 0xffff, /* dst_mask. */ - FALSE), /* pcrel_offset. */ + false), /* pcrel_offset. */ HOWTO (R_BFIN_GOT, /* 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_BFIN_GOT", /* name. */ - FALSE, /* partial_inplace. */ + false, /* partial_inplace. */ 0x7fff, /* src_mask. */ 0x7fff, /* dst_mask. */ - FALSE), /* pcrel_offset. */ + false), /* pcrel_offset. */ /* GNU extension to record C++ vtable hierarchy. */ - HOWTO (R_BFIN_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_BFIN_GNU_VTINHERIT", /* name. */ - FALSE, /* partial_inplace. */ - 0, /* src_mask. */ - 0, /* dst_mask. */ - FALSE), /* pcrel_offset. */ + HOWTO (R_BFIN_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_BFIN_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_BFIN_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_BFIN_GNU_VTENTRY", /* 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. */ + _bfd_elf_rel_vtable_reloc_fn, /* special_function. */ + "R_BFIN_GNU_VTENTRY", /* name. */ + false, /* partial_inplace. */ + 0, /* src_mask. */ + 0, /* dst_mask. */ + false) /* pcrel_offset. */ }; struct bfin_reloc_map { - bfd_reloc_code_real_type bfd_reloc_val; + bfd_reloc_code_real_type bfd_reloc_val; unsigned int bfin_reloc_val; }; @@ -1040,10 +1041,10 @@ static const struct bfin_reloc_map bfin_reloc_map [] = }; -static void -bfin_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, - arelent *cache_ptr, - Elf_Internal_Rela *dst) +static bool +bfin_info_to_howto (bfd *abfd, + arelent *cache_ptr, + Elf_Internal_Rela *dst) { unsigned int r_type; @@ -1056,7 +1057,15 @@ bfin_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, cache_ptr->howto = &bfin_gnuext_howto_table [r_type - BFIN_GNUEXT_RELOC_MIN]; else - cache_ptr->howto = (reloc_howto_type *) NULL; + { + /* 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; } /* Given a BFD reloc type, return the howto. */ @@ -1120,28 +1129,28 @@ bfin_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED, } /* Set by ld emulation if --code-in-l1. */ -bfd_boolean elf32_bfin_code_in_l1 = 0; +bool elf32_bfin_code_in_l1 = 0; /* Set by ld emulation if --data-in-l1. */ -bfd_boolean elf32_bfin_data_in_l1 = 0; +bool elf32_bfin_data_in_l1 = 0; -static void -elf32_bfin_final_write_processing (bfd *abfd, - bfd_boolean linker ATTRIBUTE_UNUSED) +static bool +elf32_bfin_final_write_processing (bfd *abfd) { if (elf32_bfin_code_in_l1) elf_elfheader (abfd)->e_flags |= EF_BFIN_CODE_IN_L1; if (elf32_bfin_data_in_l1) elf_elfheader (abfd)->e_flags |= EF_BFIN_DATA_IN_L1; + return _bfd_elf_final_write_processing (abfd); } /* Return TRUE if the name is a local label. bfin local labels begin with L$. */ -static bfd_boolean +static bool bfin_is_local_label_name (bfd *abfd, const char *label) { if (label[0] == 'L' && label[1] == '$' ) - return TRUE; + return true; return _bfd_elf_is_local_label_name (abfd, label); } @@ -1150,11 +1159,11 @@ bfin_is_local_label_name (bfd *abfd, const char *label) allocate space in the global offset table or procedure linkage table. */ -static bfd_boolean +static bool bfin_check_relocs (bfd * abfd, struct bfd_link_info *info, asection *sec, - const Elf_Internal_Rela *relocs) + const Elf_Internal_Rela *relocs) { bfd *dynobj; Elf_Internal_Shdr *symtab_hdr; @@ -1166,7 +1175,7 @@ bfin_check_relocs (bfd * abfd, asection *srelgot; if (bfd_link_relocatable (info)) - return TRUE; + return true; dynobj = elf_hash_table (info)->dynobj; symtab_hdr = &elf_tdata (abfd)->symtab_hdr; @@ -1188,29 +1197,26 @@ bfin_check_relocs (bfd * abfd, else { h = sym_hashes[r_symndx - symtab_hdr->sh_info]; - - /* PR15323, ref flags aren't set for references in the same - object. */ - h->root.non_ir_ref = 1; + 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; } switch (ELF32_R_TYPE (rel->r_info)) { /* This relocation describes the C++ object vtable hierarchy. - Reconstruct it for later use during GC. */ - case R_BFIN_GNU_VTINHERIT: - if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset)) - return FALSE; - break; - - /* This relocation describes which C++ vtable entries - are actually used. Record for later use during GC. */ - case R_BFIN_GNU_VTENTRY: - BFD_ASSERT (h != NULL); - if (h != NULL - && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend)) - return FALSE; - break; + Reconstruct it for later use during GC. */ + case R_BFIN_GNU_VTINHERIT: + if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset)) + return false; + break; + + /* This relocation describes which C++ vtable entries + are actually used. Record for later use during GC. */ + case R_BFIN_GNU_VTENTRY: + if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend)) + return false; + break; case R_BFIN_GOT: if (h != NULL @@ -1223,7 +1229,7 @@ bfin_check_relocs (bfd * abfd, /* Create the .got section. */ elf_hash_table (info)->dynobj = dynobj = abfd; if (!_bfd_elf_create_got_section (dynobj, info)) - return FALSE; + return false; } sgot = elf_hash_table (info)->sgot; @@ -1238,7 +1244,7 @@ bfin_check_relocs (bfd * abfd, if (h->dynindx == -1 && !h->forced_local) { if (!bfd_elf_link_record_dynamic_symbol (info, h)) - return FALSE; + return false; } /* Allocate space in the .got section. */ @@ -1260,7 +1266,7 @@ bfin_check_relocs (bfd * abfd, 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; } if (local_got_refcounts[r_symndx] == 0) @@ -1269,8 +1275,8 @@ bfin_check_relocs (bfd * abfd, if (bfd_link_pic (info)) { /* If we are generating a shared object, we need to - output a R_68K_RELATIVE reloc so that the dynamic - linker can adjust this GOT entry. */ + output a R_68K_RELATIVE reloc so that the dynamic + linker can adjust this GOT entry. */ srelgot->size += sizeof (Elf32_External_Rela); } } @@ -1283,7 +1289,7 @@ bfin_check_relocs (bfd * abfd, } } - return TRUE; + return true; } static enum elf_reloc_type_class @@ -1351,7 +1357,7 @@ bfin_final_link_relocate (Elf_Internal_Rela *rel, reloc_howto_type *howto, } -static bfd_boolean +static int bfin_relocate_section (bfd * output_bfd, struct bfd_link_info *info, bfd * input_bfd, @@ -1388,7 +1394,7 @@ bfin_relocate_section (bfd * output_bfd, Elf_Internal_Sym *sym; asection *sec; bfd_vma relocation = 0; - bfd_boolean unresolved_reloc; + bool unresolved_reloc; bfd_reloc_status_type r; bfd_vma address; @@ -1396,25 +1402,25 @@ bfin_relocate_section (bfd * output_bfd, if (r_type < 0 || r_type >= 243) { bfd_set_error (bfd_error_bad_value); - return FALSE; + return false; } if (r_type == R_BFIN_GNU_VTENTRY - || r_type == R_BFIN_GNU_VTINHERIT) + || r_type == R_BFIN_GNU_VTINHERIT) continue; howto = bfin_reloc_type_lookup (input_bfd, r_type); if (howto == NULL) { bfd_set_error (bfd_error_bad_value); - return FALSE; + return false; } r_symndx = ELF32_R_SYM (rel->r_info); h = NULL; sym = NULL; sec = NULL; - unresolved_reloc = FALSE; + unresolved_reloc = false; if (r_symndx < symtab_hdr->sh_info) { @@ -1424,7 +1430,7 @@ bfin_relocate_section (bfd * output_bfd, } else { - bfd_boolean warned, ignored; + bool warned, ignored; RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, r_symndx, symtab_hdr, sym_hashes, @@ -1466,7 +1472,7 @@ bfin_relocate_section (bfd * output_bfd, /* Create the .got section. */ elf_hash_table (info)->dynobj = dynobj = output_bfd; if (!_bfd_elf_create_got_section (dynobj, info)) - return FALSE; + return false; } sgot = elf_hash_table (info)->sgot; @@ -1474,7 +1480,7 @@ bfin_relocate_section (bfd * output_bfd, if (h != NULL) { - bfd_boolean dyn; + bool dyn; off = h->got.offset; BFD_ASSERT (off != (bfd_vma) - 1); @@ -1511,7 +1517,7 @@ bfin_relocate_section (bfd * output_bfd, } } else - unresolved_reloc = FALSE; + unresolved_reloc = false; } else { @@ -1554,8 +1560,8 @@ bfin_relocate_section (bfd * output_bfd, relocation = sgot->output_offset + off; rel->r_addend = 0; - /* bfin : preg = [preg + 17bitdiv4offset] relocation is div by 4. */ - relocation /= 4; + /* bfin : preg = [preg + 17bitdiv4offset] relocation is div by 4. */ + relocation /= 4; } goto do_default; @@ -1569,8 +1575,8 @@ bfin_relocate_section (bfd * output_bfd, } /* Dynamic relocs are not propagated for SEC_DEBUGGING sections - because such sections are not SEC_ALLOC and thus ld.so will - not process them. */ + because such sections are not SEC_ALLOC and thus ld.so will + not process them. */ if (unresolved_reloc && !((input_section->flags & SEC_DEBUGGING) != 0 && h->def_dynamic) && _bfd_elf_section_offset (output_bfd, info, input_section, @@ -1578,10 +1584,11 @@ bfin_relocate_section (bfd * output_bfd, { _bfd_error_handler /* xgettext:c-format */ - (_("%B(%A+0x%lx): unresolvable relocation against symbol `%s'"), - input_bfd, - input_section, (long) rel->r_offset, h->root.root.string); - return FALSE; + (_("%pB(%pA+%#" PRIx64 "): " + "unresolvable relocation against symbol `%s'"), + input_bfd, input_section, (uint64_t) rel->r_offset, + h->root.root.string); + return false; } if (r != bfd_reloc_ok) @@ -1596,9 +1603,9 @@ bfin_relocate_section (bfd * output_bfd, symtab_hdr->sh_link, sym->st_name); if (name == NULL) - return FALSE; + return false; if (*name == '\0') - name = bfd_section_name (input_bfd, sec); + name = bfd_section_name (sec); } if (r == bfd_reloc_overflow) @@ -1609,15 +1616,15 @@ bfin_relocate_section (bfd * output_bfd, { _bfd_error_handler /* xgettext:c-format */ - (_("%B(%A+0x%lx): reloc against `%s': error %d"), - input_bfd, input_section, - (long) rel->r_offset, name, (int) r); - return FALSE; + (_("%pB(%pA+%#" PRIx64 "): reloc against `%s': error %d"), + input_bfd, input_section, (uint64_t) rel->r_offset, + name, (int) r); + return false; } } } - return TRUE; + return true; } static asection * @@ -1625,7 +1632,7 @@ bfin_gc_mark_hook (asection * sec, struct bfd_link_info *info, Elf_Internal_Rela * rel, struct elf_link_hash_entry *h, - Elf_Internal_Sym * sym) + Elf_Internal_Sym * sym) { if (h != NULL) switch (ELF32_R_TYPE (rel->r_info)) @@ -1637,79 +1644,6 @@ bfin_gc_mark_hook (asection * sec, 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 -bfin_gc_sweep_hook (bfd * abfd, - struct bfd_link_info *info, - asection * sec, - const Elf_Internal_Rela * relocs) -{ - Elf_Internal_Shdr *symtab_hdr; - struct elf_link_hash_entry **sym_hashes; - bfd_signed_vma *local_got_refcounts; - const Elf_Internal_Rela *rel, *relend; - bfd *dynobj; - asection *sgot; - asection *srelgot; - - dynobj = elf_hash_table (info)->dynobj; - if (dynobj == NULL) - return TRUE; - - symtab_hdr = &elf_tdata (abfd)->symtab_hdr; - sym_hashes = elf_sym_hashes (abfd); - local_got_refcounts = elf_local_got_refcounts (abfd); - - sgot = elf_hash_table (info)->sgot; - srelgot = elf_hash_table (info)->srelgot; - - relend = relocs + sec->reloc_count; - for (rel = relocs; rel < relend; rel++) - { - unsigned long r_symndx; - struct elf_link_hash_entry *h; - - switch (ELF32_R_TYPE (rel->r_info)) - { - case R_BFIN_GOT: - r_symndx = ELF32_R_SYM (rel->r_info); - if (r_symndx >= symtab_hdr->sh_info) - { - h = sym_hashes[r_symndx - symtab_hdr->sh_info]; - if (h->got.refcount > 0) - { - --h->got.refcount; - if (h->got.refcount == 0) - { - /* We don't need the .got entry any more. */ - sgot->size -= 4; - srelgot->size -= sizeof (Elf32_External_Rela); - } - } - } - else if (local_got_refcounts != NULL) - { - if (local_got_refcounts[r_symndx] > 0) - { - --local_got_refcounts[r_symndx]; - if (local_got_refcounts[r_symndx] == 0) - { - /* We don't need the .got entry any more. */ - sgot->size -= 4; - if (bfd_link_pic (info)) - srelgot->size -= sizeof (Elf32_External_Rela); - } - } - } - break; - default: - break; - } - } - return TRUE; -} extern const bfd_target bfin_elf32_fdpic_vec; #define IS_FDPIC(bfd) ((bfd)->xvec == &bfin_elf32_fdpic_vec) @@ -1737,9 +1671,10 @@ struct bfinfdpic_elf_link_hash_table /* Get the Blackfin ELF linker hash table from a link_info structure. */ -#define bfinfdpic_hash_table(info) \ - (elf_hash_table_id ((struct elf_link_hash_table *) ((info)->hash)) \ - == BFIN_ELF_DATA ? ((struct bfinfdpic_elf_link_hash_table *) ((info)->hash)) : NULL) +#define bfinfdpic_hash_table(p) \ + ((is_elf_hash_table ((p)->hash) \ + && elf_hash_table_id (elf_hash_table (p)) == BFIN_ELF_DATA) \ + ? (struct bfinfdpic_elf_link_hash_table *) (p)->hash : NULL) #define bfinfdpic_got_section(info) \ (bfinfdpic_hash_table (info)->elf.sgot) @@ -1797,7 +1732,7 @@ static struct bfd_link_hash_table * bfinfdpic_elf_link_hash_table_create (bfd *abfd) { struct bfinfdpic_elf_link_hash_table *ret; - bfd_size_type amt = sizeof (struct bfinfdpic_elf_link_hash_table); + size_t amt = sizeof (struct bfinfdpic_elf_link_hash_table); ret = bfd_zmalloc (amt); if (ret == NULL) @@ -1879,7 +1814,7 @@ struct bfinfdpic_relocs_info for symbol+addend. Should be implied by something like: (plt || fdgotoff17m4 || fdgotofflohi || ((fd || fdgot17m4 || fdgothilo) - && (symndx != -1 || BFINFDPIC_FUNCDESC_LOCAL (info, d.h)))) */ + && (symndx != -1 || BFINFDPIC_FUNCDESC_LOCAL (info, d.h)))) */ unsigned privfd:1; /* Whether a lazy PLT entry is needed for this symbol+addend. Should be implied by something like: @@ -2115,7 +2050,7 @@ _bfinfdpic_osec_to_segment (bfd *output_bfd, asection *osec) return (p != NULL) ? p - elf_tdata (output_bfd)->phdr : -1; } -inline static bfd_boolean +inline static bool _bfinfdpic_osec_readonly_p (bfd *output_bfd, asection *osec) { unsigned seg = _bfinfdpic_osec_to_segment (output_bfd, osec); @@ -2126,7 +2061,7 @@ _bfinfdpic_osec_readonly_p (bfd *output_bfd, asection *osec) /* Generate relocations for GOT entries, function descriptors, and code for PLT and lazy PLT entries. */ -inline static bfd_boolean +inline static bool _bfinfdpic_emit_got_relocs_plt_entries (struct bfinfdpic_relocs_info *entry, bfd *output_bfd, struct bfd_link_info *info, @@ -2138,7 +2073,7 @@ _bfinfdpic_emit_got_relocs_plt_entries (struct bfinfdpic_relocs_info *entry, int dynindx = -1; if (entry->done) - return TRUE; + return true; entry->done = 1; if (entry->got_entry || entry->fdgot_entry || entry->fd_entry) @@ -2254,7 +2189,7 @@ _bfinfdpic_emit_got_relocs_plt_entries (struct bfinfdpic_relocs_info *entry, idx = dynindx; ad = addend; if (ad) - return FALSE; + return false; } else { @@ -2398,7 +2333,7 @@ _bfinfdpic_emit_got_relocs_plt_entries (struct bfinfdpic_relocs_info *entry, else if (entry->lazyplt) { if (ad) - return FALSE; + return false; fd_lazy_rel_offset = ofst; @@ -2519,7 +2454,7 @@ _bfinfdpic_emit_got_relocs_plt_entries (struct bfinfdpic_relocs_info *entry, } } - return TRUE; + return true; } /* Relocate an Blackfin ELF section. @@ -2552,7 +2487,7 @@ _bfinfdpic_emit_got_relocs_plt_entries (struct bfinfdpic_relocs_info *entry, section, which means that the addend must be adjusted accordingly. */ -static bfd_boolean +static int bfinfdpic_relocate_section (bfd * output_bfd, struct bfd_link_info *info, bfd * input_bfd, @@ -2615,12 +2550,13 @@ bfinfdpic_relocate_section (bfd * output_bfd, if (howto == NULL) { bfd_set_error (bfd_error_bad_value); - return FALSE; + return false; } h = NULL; sym = NULL; sec = NULL; + picrel = NULL; if (r_symndx < symtab_hdr->sh_info) { @@ -2630,12 +2566,12 @@ bfinfdpic_relocate_section (bfd * output_bfd, name = bfd_elf_string_from_elf_section (input_bfd, symtab_hdr->sh_link, sym->st_name); - name = (name == NULL) ? bfd_section_name (input_bfd, sec) : name; + name = name == NULL ? bfd_section_name (sec) : name; } else { - bfd_boolean warned, ignored; - bfd_boolean unresolved_reloc; + bool warned, ignored; + bool unresolved_reloc; RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, r_symndx, symtab_hdr, sym_hashes, @@ -2683,6 +2619,9 @@ bfinfdpic_relocate_section (bfd * output_bfd, case R_BFIN_FUNCDESC_GOTOFFLO: case R_BFIN_FUNCDESC: case R_BFIN_FUNCDESC_VALUE: + if ((input_section->flags & SEC_ALLOC) == 0) + break; + if (h != NULL) picrel = bfinfdpic_relocs_info_for_global (bfinfdpic_relocs_info (info), input_bfd, h, @@ -2695,7 +2634,7 @@ bfinfdpic_relocate_section (bfd * output_bfd, (info), input_bfd, r_symndx, orig_addend, INSERT); if (! picrel) - return FALSE; + return false; if (!_bfinfdpic_emit_got_relocs_plt_entries (picrel, output_bfd, info, osec, sym, @@ -2703,9 +2642,10 @@ bfinfdpic_relocate_section (bfd * output_bfd, { _bfd_error_handler /* xgettext:c-format */ - (_("%B: relocation at `%A+0x%x' references symbol `%s' with nonzero addend"), - input_bfd, input_section, rel->r_offset, name); - return FALSE; + (_("%pB: relocation at `%pA+%#" PRIx64 "' " + "references symbol `%s' with nonzero addend"), + input_bfd, input_section, (uint64_t) rel->r_offset, name); + return false; } @@ -2721,7 +2661,7 @@ bfinfdpic_relocate_section (bfd * output_bfd, info->callbacks->warning (info, _("relocation references symbol not defined in the module"), name, input_bfd, input_section, rel->r_offset); - return FALSE; + return false; } break; } @@ -2787,131 +2727,130 @@ bfinfdpic_relocate_section (bfd * output_bfd, break; case R_BFIN_FUNCDESC: - { - int dynindx; - bfd_vma addend = rel->r_addend; - - if (! (h && h->root.type == bfd_link_hash_undefweak - && BFINFDPIC_SYM_LOCAL (info, h))) - { - /* If the symbol is dynamic and there may be dynamic - symbol resolution because we are or are linked with a - shared library, emit a FUNCDESC relocation such that - the dynamic linker will allocate the function - descriptor. If the symbol needs a non-local function - descriptor but binds locally (e.g., its visibility is - protected, emit a dynamic relocation decayed to - section+offset. */ - if (h && ! BFINFDPIC_FUNCDESC_LOCAL (info, h) - && BFINFDPIC_SYM_LOCAL (info, h) - && !bfd_link_pde (info)) - { - dynindx = elf_section_data (h->root.u.def.section - ->output_section)->dynindx; - addend += h->root.u.def.section->output_offset - + h->root.u.def.value; - } - else if (h && ! BFINFDPIC_FUNCDESC_LOCAL (info, h)) - { - if (addend) - { - info->callbacks->warning - (info, _("R_BFIN_FUNCDESC references dynamic symbol with nonzero addend"), - name, input_bfd, input_section, rel->r_offset); - return FALSE; - } - dynindx = h->dynindx; - } - else - { - /* Otherwise, we know we have a private function - descriptor, so reference it directly. */ - BFD_ASSERT (picrel->privfd); - r_type = R_BFIN_BYTE4_DATA; - dynindx = elf_section_data (bfinfdpic_got_section (info) - ->output_section)->dynindx; - addend = bfinfdpic_got_section (info)->output_offset - + bfinfdpic_got_initial_offset (info) - + picrel->fd_entry; - } - - /* If there is room for dynamic symbol resolution, emit - the dynamic relocation. However, if we're linking an - executable at a fixed location, we won't have emitted a - dynamic symbol entry for the got section, so idx will - be zero, which means we can and should compute the - address of the private descriptor ourselves. */ - if (bfd_link_pde (info) - && (!h || BFINFDPIC_FUNCDESC_LOCAL (info, h))) - { - bfd_vma offset; - - addend += bfinfdpic_got_section (info)->output_section->vma; - if ((bfd_get_section_flags (output_bfd, - input_section->output_section) - & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD)) - { - if (_bfinfdpic_osec_readonly_p (output_bfd, - input_section - ->output_section)) - { - info->callbacks->warning - (info, - _("cannot emit fixups in read-only section"), - name, input_bfd, input_section, rel->r_offset); - return FALSE; - } + if ((input_section->flags & SEC_ALLOC) != 0) + { + int dynindx; + bfd_vma addend = rel->r_addend; - offset = _bfd_elf_section_offset - (output_bfd, info, - input_section, rel->r_offset); + if (! (h && h->root.type == bfd_link_hash_undefweak + && BFINFDPIC_SYM_LOCAL (info, h))) + { + /* If the symbol is dynamic and there may be dynamic + symbol resolution because we are or are linked with a + shared library, emit a FUNCDESC relocation such that + the dynamic linker will allocate the function + descriptor. If the symbol needs a non-local function + descriptor but binds locally (e.g., its visibility is + protected, emit a dynamic relocation decayed to + section+offset. */ + if (h && ! BFINFDPIC_FUNCDESC_LOCAL (info, h) + && BFINFDPIC_SYM_LOCAL (info, h) + && !bfd_link_pde (info)) + { + dynindx = elf_section_data (h->root.u.def.section + ->output_section)->dynindx; + addend += h->root.u.def.section->output_offset + + h->root.u.def.value; + } + else if (h && ! BFINFDPIC_FUNCDESC_LOCAL (info, h)) + { + if (addend) + { + info->callbacks->warning + (info, _("R_BFIN_FUNCDESC references dynamic symbol with nonzero addend"), + name, input_bfd, input_section, rel->r_offset); + return false; + } + dynindx = h->dynindx; + } + else + { + /* Otherwise, we know we have a private function + descriptor, so reference it directly. */ + BFD_ASSERT (picrel->privfd); + r_type = R_BFIN_BYTE4_DATA; + dynindx = elf_section_data (bfinfdpic_got_section (info) + ->output_section)->dynindx; + addend = bfinfdpic_got_section (info)->output_offset + + bfinfdpic_got_initial_offset (info) + + picrel->fd_entry; + } - if (offset != (bfd_vma)-1) - _bfinfdpic_add_rofixup (output_bfd, - bfinfdpic_gotfixup_section - (info), + /* If there is room for dynamic symbol resolution, emit + the dynamic relocation. However, if we're linking an + executable at a fixed location, we won't have emitted a + dynamic symbol entry for the got section, so idx will + be zero, which means we can and should compute the + address of the private descriptor ourselves. */ + if (bfd_link_pde (info) + && (!h || BFINFDPIC_FUNCDESC_LOCAL (info, h))) + { + bfd_vma offset; + + addend += bfinfdpic_got_section (info)->output_section->vma; + if ((bfd_section_flags (input_section->output_section) + & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD)) + { + if (_bfinfdpic_osec_readonly_p (output_bfd, + input_section + ->output_section)) + { + info->callbacks->warning + (info, + _("cannot emit fixups in read-only section"), + name, input_bfd, input_section, rel->r_offset); + return false; + } + + offset = _bfd_elf_section_offset + (output_bfd, info, + input_section, rel->r_offset); + + if (offset != (bfd_vma)-1) + _bfinfdpic_add_rofixup (output_bfd, + bfinfdpic_gotfixup_section + (info), + offset + input_section + ->output_section->vma + + input_section->output_offset, + picrel); + } + } + else if ((bfd_section_flags (input_section->output_section) + & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD)) + { + bfd_vma offset; + + if (_bfinfdpic_osec_readonly_p (output_bfd, + input_section + ->output_section)) + { + info->callbacks->warning + (info, + _("cannot emit dynamic relocations in read-only section"), + name, input_bfd, input_section, rel->r_offset); + return false; + } + offset = _bfd_elf_section_offset (output_bfd, info, + input_section, rel->r_offset); + + if (offset != (bfd_vma)-1) + _bfinfdpic_add_dyn_reloc (output_bfd, + bfinfdpic_gotrel_section (info), offset + input_section ->output_section->vma + input_section->output_offset, - picrel); - } - } - else if ((bfd_get_section_flags (output_bfd, - input_section->output_section) - & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD)) - { - bfd_vma offset; - - if (_bfinfdpic_osec_readonly_p (output_bfd, - input_section - ->output_section)) - { - info->callbacks->warning - (info, - _("cannot emit dynamic relocations in read-only section"), - name, input_bfd, input_section, rel->r_offset); - return FALSE; - } - offset = _bfd_elf_section_offset (output_bfd, info, - input_section, rel->r_offset); - - if (offset != (bfd_vma)-1) - _bfinfdpic_add_dyn_reloc (output_bfd, - bfinfdpic_gotrel_section (info), - offset + input_section - ->output_section->vma - + input_section->output_offset, - r_type, - dynindx, addend, picrel); - } - else - addend += bfinfdpic_got_section (info)->output_section->vma; - } + r_type, + dynindx, addend, picrel); + } + else + addend += bfinfdpic_got_section (info)->output_section->vma; + } - /* We want the addend in-place because dynamic - relocations are REL. Setting relocation to it should - arrange for it to be installed. */ - relocation = addend - rel->r_addend; + /* We want the addend in-place because dynamic + relocations are REL. Setting relocation to it should + arrange for it to be installed. */ + relocation = addend - rel->r_addend; } check_segment[0] = check_segment[1] = got_segment; break; @@ -2940,7 +2879,7 @@ bfinfdpic_relocate_section (bfd * output_bfd, info->callbacks->warning (info, _("R_BFIN_FUNCDESC_VALUE references dynamic symbol with nonzero addend"), name, input_bfd, input_section, rel->r_offset); - return FALSE; + return false; } dynindx = h->dynindx; } @@ -2970,8 +2909,7 @@ bfinfdpic_relocate_section (bfd * output_bfd, if (osec) addend += osec->output_section->vma; if (IS_FDPIC (input_bfd) - && (bfd_get_section_flags (output_bfd, - input_section->output_section) + && (bfd_section_flags (input_section->output_section) & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD)) { if (_bfinfdpic_osec_readonly_p (output_bfd, @@ -2982,7 +2920,7 @@ bfinfdpic_relocate_section (bfd * output_bfd, (info, _("cannot emit fixups in read-only section"), name, input_bfd, input_section, rel->r_offset); - return FALSE; + return false; } if (!h || h->root.type != bfd_link_hash_undefweak) { @@ -3008,8 +2946,7 @@ bfinfdpic_relocate_section (bfd * output_bfd, } else { - if ((bfd_get_section_flags (output_bfd, - input_section->output_section) + if ((bfd_section_flags (input_section->output_section) & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD)) { if (_bfinfdpic_osec_readonly_p (output_bfd, @@ -3020,7 +2957,7 @@ bfinfdpic_relocate_section (bfd * output_bfd, (info, _("cannot emit dynamic relocations in read-only section"), name, input_bfd, input_section, rel->r_offset); - return FALSE; + return false; } if (offset != (bfd_vma)-1) @@ -3087,11 +3024,11 @@ bfinfdpic_relocate_section (bfd * output_bfd, input file basename is crt0.o only once. */ if (silence_segment_error == 1) silence_segment_error = - (strlen (input_bfd->filename) == 6 - && filename_cmp (input_bfd->filename, "crt0.o") == 0) - || (strlen (input_bfd->filename) > 6 - && filename_cmp (input_bfd->filename - + strlen (input_bfd->filename) - 7, + (strlen (bfd_get_filename (input_bfd)) == 6 + && filename_cmp (bfd_get_filename (input_bfd), "crt0.o") == 0) + || (strlen (bfd_get_filename (input_bfd)) > 6 + && filename_cmp (bfd_get_filename (input_bfd) + + strlen (bfd_get_filename (input_bfd)) - 7, "/crt0.o") == 0) ? -1 : 0; #endif @@ -3107,7 +3044,7 @@ bfinfdpic_relocate_section (bfd * output_bfd, : _("warning: relocation references a different segment"), name, input_bfd, input_section, rel->r_offset); if (!silence_segment_error && bfd_link_pic (info)) - return FALSE; + return false; elf_elfheader (output_bfd)->e_flags |= EF_BFIN_PIC; } @@ -3187,7 +3124,7 @@ bfinfdpic_relocate_section (bfd * output_bfd, case bfd_reloc_undefined: (*info->callbacks->undefined_symbol) - (info, name, input_bfd, input_section, rel->r_offset, TRUE); + (info, name, input_bfd, input_section, rel->r_offset, true); break; case bfd_reloc_outofrange: @@ -3213,124 +3150,12 @@ bfinfdpic_relocate_section (bfd * output_bfd, } } - return TRUE; -} - -/* Update the relocation information for the relocations of the section - being removed. */ - -static bfd_boolean -bfinfdpic_gc_sweep_hook (bfd *abfd, - struct bfd_link_info *info, - asection *sec, - const Elf_Internal_Rela *relocs) -{ - Elf_Internal_Shdr *symtab_hdr; - struct elf_link_hash_entry **sym_hashes, **sym_hashes_end; - const Elf_Internal_Rela *rel; - const Elf_Internal_Rela *rel_end; - struct bfinfdpic_relocs_info *picrel; - - BFD_ASSERT (IS_FDPIC (abfd)); - - symtab_hdr = &elf_tdata (abfd)->symtab_hdr; - sym_hashes = elf_sym_hashes (abfd); - sym_hashes_end = sym_hashes + symtab_hdr->sh_size/sizeof(Elf32_External_Sym); - if (!elf_bad_symtab (abfd)) - sym_hashes_end -= symtab_hdr->sh_info; - - rel_end = relocs + sec->reloc_count; - for (rel = relocs; rel < rel_end; rel++) - { - struct elf_link_hash_entry *h; - unsigned long r_symndx; - - r_symndx = ELF32_R_SYM (rel->r_info); - if (r_symndx < symtab_hdr->sh_info) - h = NULL; - else - h = sym_hashes[r_symndx - symtab_hdr->sh_info]; - - if (h != NULL) - picrel = bfinfdpic_relocs_info_for_global (bfinfdpic_relocs_info (info), - abfd, h, - rel->r_addend, NO_INSERT); - else - picrel = bfinfdpic_relocs_info_for_local (bfinfdpic_relocs_info - (info), abfd, r_symndx, - rel->r_addend, NO_INSERT); - - if (!picrel) - return TRUE; - - switch (ELF32_R_TYPE (rel->r_info)) - { - case R_BFIN_PCREL24: - case R_BFIN_PCREL24_JUMP_L: - picrel->call--; - break; - - case R_BFIN_FUNCDESC_VALUE: - picrel->relocsfdv--; - if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC) - picrel->relocs32++; - /* Fall through. */ - - case R_BFIN_BYTE4_DATA: - picrel->sym--; - if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC) - picrel->relocs32--; - break; - - case R_BFIN_GOT17M4: - picrel->got17m4--; - break; - - case R_BFIN_GOTHI: - case R_BFIN_GOTLO: - picrel->gothilo--; - break; - - case R_BFIN_FUNCDESC_GOT17M4: - picrel->fdgot17m4--; - break; - - case R_BFIN_FUNCDESC_GOTHI: - case R_BFIN_FUNCDESC_GOTLO: - picrel->fdgothilo--; - break; - - case R_BFIN_GOTOFF17M4: - case R_BFIN_GOTOFFHI: - case R_BFIN_GOTOFFLO: - picrel->gotoff--; - break; - - case R_BFIN_FUNCDESC_GOTOFF17M4: - picrel->fdgoff17m4--; - break; - - case R_BFIN_FUNCDESC_GOTOFFHI: - case R_BFIN_FUNCDESC_GOTOFFLO: - picrel->fdgoffhilo--; - break; - - case R_BFIN_FUNCDESC: - picrel->fd--; - picrel->relocsfd--; - break; - - default: - break; - } - } - - return TRUE; + return true; } /* We need dynamic symbols for every section, since segments can relocate independently. */ -static bfd_boolean +static bool _bfinfdpic_link_omit_section_dynsym (bfd *output_bfd ATTRIBUTE_UNUSED, struct bfd_link_info *info ATTRIBUTE_UNUSED, asection *p) @@ -3342,12 +3167,12 @@ _bfinfdpic_link_omit_section_dynsym (bfd *output_bfd ATTRIBUTE_UNUSED, /* If sh_type is yet undecided, assume it could be SHT_PROGBITS/SHT_NOBITS. */ case SHT_NULL: - return FALSE; + return false; /* There shouldn't be section relative relocations against any other section. */ default: - return TRUE; + return true; } } @@ -3355,7 +3180,7 @@ _bfinfdpic_link_omit_section_dynsym (bfd *output_bfd ATTRIBUTE_UNUSED, is almost entirely copied from elflink.c:_bfd_elf_create_got_section(). */ -static bfd_boolean +static bool _bfin_create_got_section (bfd *abfd, struct bfd_link_info *info) { flagword flags, pltflags; @@ -3367,7 +3192,7 @@ _bfin_create_got_section (bfd *abfd, struct bfd_link_info *info) /* This function may be called more than once. */ s = elf_hash_table (info)->sgot; if (s != NULL) - return TRUE; + return true; /* Machine specific: although pointers are 32-bits wide, we want the GOT to be aligned to a 64-bit boundary, such that function @@ -3382,8 +3207,8 @@ _bfin_create_got_section (bfd *abfd, struct bfd_link_info *info) s = bfd_make_section_anyway_with_flags (abfd, ".got", flags); elf_hash_table (info)->sgot = s; if (s == NULL - || !bfd_set_section_alignment (abfd, s, ptralign)) - return FALSE; + || !bfd_set_section_alignment (s, ptralign)) + return false; if (bed->want_got_sym) { @@ -3394,12 +3219,12 @@ _bfin_create_got_section (bfd *abfd, struct bfd_link_info *info) h = _bfd_elf_define_linkage_sym (abfd, info, s, "__GLOBAL_OFFSET_TABLE_"); elf_hash_table (info)->hgot = h; if (h == NULL) - return FALSE; + return false; /* Machine-specific: we want the symbol for executables as well. */ if (! bfd_elf_link_record_dynamic_symbol (info, h)) - return FALSE; + return false; } /* The first bit of the global offset table is the header. */ @@ -3414,13 +3239,13 @@ _bfin_create_got_section (bfd *abfd, struct bfd_link_info *info) bfinfdpic_relocs_info_eq, (htab_del) NULL); if (! bfinfdpic_relocs_info (info)) - return FALSE; + return false; s = bfd_make_section_anyway_with_flags (abfd, ".rel.got", (flags | SEC_READONLY)); if (s == NULL - || ! bfd_set_section_alignment (abfd, s, 2)) - return FALSE; + || !bfd_set_section_alignment (s, 2)) + return false; bfinfdpic_gotrel_section (info) = s; @@ -3428,8 +3253,8 @@ _bfin_create_got_section (bfd *abfd, struct bfd_link_info *info) s = bfd_make_section_anyway_with_flags (abfd, ".rofixup", (flags | SEC_READONLY)); if (s == NULL - || ! bfd_set_section_alignment (abfd, s, 2)) - return FALSE; + || !bfd_set_section_alignment (s, 2)) + return false; bfinfdpic_gotfixup_section (info) = s; } @@ -3442,8 +3267,8 @@ _bfin_create_got_section (bfd *abfd, struct bfd_link_info *info) s = bfd_make_section_anyway_with_flags (abfd, ".plt", pltflags); if (s == NULL - || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment)) - return FALSE; + || !bfd_set_section_alignment (s, bed->plt_alignment)) + return false; /* Blackfin-specific: remember it. */ bfinfdpic_plt_section (info) = s; @@ -3455,33 +3280,33 @@ _bfin_create_got_section (bfd *abfd, struct bfd_link_info *info) if (! (_bfd_generic_link_add_one_symbol (info, abfd, "__PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL, s, 0, NULL, - FALSE, get_elf_backend_data (abfd)->collect, &bh))) - return FALSE; + false, get_elf_backend_data (abfd)->collect, &bh))) + return false; h = (struct elf_link_hash_entry *) bh; h->def_regular = 1; h->type = STT_OBJECT; if (! bfd_link_executable (info) && ! bfd_elf_link_record_dynamic_symbol (info, h)) - return FALSE; + return false; } /* Blackfin-specific: we want rel relocations for the plt. */ s = bfd_make_section_anyway_with_flags (abfd, ".rel.plt", 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; /* Blackfin-specific: remember it. */ bfinfdpic_pltrel_section (info) = s; - return TRUE; + return true; } /* Make sure the got and plt sections exist, and that our pointers in the link hash table point to them. */ -static bfd_boolean +static bool elf32_bfinfdpic_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) { /* This is mostly copied from @@ -3498,7 +3323,7 @@ elf32_bfinfdpic_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) /* Blackfin-specific: we want to create the GOT in the Blackfin way. */ if (! _bfin_create_got_section (abfd, info)) - return FALSE; + return false; /* Blackfin-specific: make sure we created everything we wanted. */ BFD_ASSERT (bfinfdpic_got_section (info) && bfinfdpic_gotrel_section (info) @@ -3517,7 +3342,7 @@ elf32_bfinfdpic_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) s = bfd_make_section_anyway_with_flags (abfd, ".dynbss", SEC_ALLOC | SEC_LINKER_CREATED); if (s == NULL) - return FALSE; + return false; /* The .rel[a].bss section holds copy relocs. This section is not normally needed. We need to create it here, though, so that the @@ -3536,12 +3361,12 @@ elf32_bfinfdpic_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) ".rela.bss", 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; } } - return TRUE; + return true; } /* Compute the total GOT size required by each symbol in each range. @@ -3609,7 +3434,7 @@ _bfinfdpic_count_nontls_entries (struct bfinfdpic_relocs_info *entry, static void _bfinfdpic_count_relocs_fixups (struct bfinfdpic_relocs_info *entry, struct _bfinfdpic_dynamic_got_info *dinfo, - bfd_boolean subtract) + bool subtract) { bfd_vma relocs = 0, fixups = 0; @@ -3662,7 +3487,7 @@ _bfinfdpic_count_got_plt_entries (void **entryp, void *dinfo_) _bfinfdpic_count_nontls_entries (entry, dinfo); - _bfinfdpic_count_relocs_fixups (entry, dinfo, FALSE); + _bfinfdpic_count_relocs_fixups (entry, dinfo, false); return 1; } @@ -4035,7 +3860,7 @@ _bfinfdpic_resolve_final_relocs_info (void **entryp, void *p) section and the rofixup section. Assign locations for GOT and PLT entries. */ -static bfd_boolean +static bool _bfinfdpic_size_got_plt (bfd *output_bfd, struct _bfinfdpic_dynamic_got_plt_info *gpinfop) { @@ -4101,7 +3926,7 @@ _bfinfdpic_size_got_plt (bfd *output_bfd, (bfd_byte *) bfd_zalloc (dynobj, bfinfdpic_got_section (info)->size); if (bfinfdpic_got_section (info)->contents == NULL) - return FALSE; + return false; } if (elf_hash_table (info)->dynamic_sections_created) @@ -4120,7 +3945,7 @@ _bfinfdpic_size_got_plt (bfd *output_bfd, (bfd_byte *) bfd_zalloc (dynobj, bfinfdpic_gotrel_section (info)->size); if (bfinfdpic_gotrel_section (info)->contents == NULL) - return FALSE; + return false; } bfinfdpic_gotfixup_section (info)->size = (gpinfop->g.fixups + 1) * 4; @@ -4132,7 +3957,7 @@ _bfinfdpic_size_got_plt (bfd *output_bfd, (bfd_byte *) bfd_zalloc (dynobj, bfinfdpic_gotfixup_section (info)->size); if (bfinfdpic_gotfixup_section (info)->contents == NULL) - return FALSE; + return false; } if (elf_hash_table (info)->dynamic_sections_created) @@ -4146,7 +3971,7 @@ _bfinfdpic_size_got_plt (bfd *output_bfd, (bfd_byte *) bfd_zalloc (dynobj, bfinfdpic_pltrel_section (info)->size); if (bfinfdpic_pltrel_section (info)->contents == NULL) - return FALSE; + return false; } /* Add 4 bytes for every block of at most 65535 lazy PLT entries, @@ -4191,15 +4016,15 @@ _bfinfdpic_size_got_plt (bfd *output_bfd, (bfd_byte *) bfd_zalloc (dynobj, bfinfdpic_plt_section (info)->size); if (bfinfdpic_plt_section (info)->contents == NULL) - return FALSE; + return false; } - return TRUE; + return true; } /* Set the sizes of the dynamic sections. */ -static bfd_boolean +static bool elf32_bfinfdpic_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info) { @@ -4245,27 +4070,7 @@ elf32_bfinfdpic_size_dynamic_sections (bfd *output_bfd, bfinfdpic_dynamic_got_plt_info (info) = bfd_alloc (dynobj, sizeof (gpinfo.g)); if (!_bfinfdpic_size_got_plt (output_bfd, &gpinfo)) - return FALSE; - - if (elf_hash_table (info)->dynamic_sections_created) - { - if (bfinfdpic_got_section (info)->size) - if (!_bfd_elf_add_dynamic_entry (info, DT_PLTGOT, 0)) - return FALSE; - - if (bfinfdpic_pltrel_section (info)->size) - if (!_bfd_elf_add_dynamic_entry (info, DT_PLTRELSZ, 0) - || !_bfd_elf_add_dynamic_entry (info, DT_PLTREL, DT_REL) - || !_bfd_elf_add_dynamic_entry (info, DT_JMPREL, 0)) - return FALSE; - - if (bfinfdpic_gotrel_section (info)->size) - if (!_bfd_elf_add_dynamic_entry (info, DT_REL, 0) - || !_bfd_elf_add_dynamic_entry (info, DT_RELSZ, 0) - || !_bfd_elf_add_dynamic_entry (info, DT_RELENT, - sizeof (Elf32_External_Rel))) - return FALSE; - } + return false; s = bfd_get_linker_section (dynobj, ".dynbss"); if (s && s->size == 0) @@ -4275,27 +4080,27 @@ elf32_bfinfdpic_size_dynamic_sections (bfd *output_bfd, if (s && s->size == 0) s->flags |= SEC_EXCLUDE; - return TRUE; + return _bfd_elf_add_dynamic_tags (output_bfd, info, true); } -static bfd_boolean +static bool elf32_bfinfdpic_always_size_sections (bfd *output_bfd, struct bfd_link_info *info) { if (!bfd_link_relocatable (info) && !bfd_elf_stack_segment_size (output_bfd, info, "__stacksize", DEFAULT_STACK_SIZE)) - return FALSE; + return false; - return TRUE; + return true; } /* Check whether any of the relocations was optimized away, and subtract it from the relocation or fixup count. */ -static bfd_boolean +static bool _bfinfdpic_check_discarded_relocs (bfd *abfd, asection *sec, struct bfd_link_info *info, - bfd_boolean *changed) + bool *changed) { Elf_Internal_Shdr *symtab_hdr; struct elf_link_hash_entry **sym_hashes, **sym_hashes_end; @@ -4303,7 +4108,7 @@ _bfinfdpic_check_discarded_relocs (bfd *abfd, asection *sec, if ((sec->flags & SEC_RELOC) == 0 || sec->reloc_count == 0) - return TRUE; + return true; symtab_hdr = &elf_tdata (abfd)->symtab_hdr; sym_hashes = elf_sym_hashes (abfd); @@ -4351,28 +4156,28 @@ _bfinfdpic_check_discarded_relocs (bfd *abfd, asection *sec, rel->r_addend, NO_INSERT); if (! picrel) - return FALSE; + return false; - *changed = TRUE; + *changed = true; dinfo = bfinfdpic_dynamic_got_plt_info (info); - _bfinfdpic_count_relocs_fixups (picrel, dinfo, TRUE); + _bfinfdpic_count_relocs_fixups (picrel, dinfo, true); if (ELF32_R_TYPE (rel->r_info) == R_BFIN_BYTE4_DATA) picrel->relocs32--; else /* we know (ELF32_R_TYPE (rel->r_info) == R_BFIN_FUNCDESC) */ picrel->relocsfd--; - _bfinfdpic_count_relocs_fixups (picrel, dinfo, FALSE); + _bfinfdpic_count_relocs_fixups (picrel, dinfo, false); } - return TRUE; + return true; } -static bfd_boolean +static bool bfinfdpic_elf_discard_info (bfd *ibfd, struct elf_reloc_cookie *cookie ATTRIBUTE_UNUSED, struct bfd_link_info *info) { - bfd_boolean changed = FALSE; + bool changed = false; asection *s; bfd *obfd = NULL; @@ -4381,7 +4186,7 @@ bfinfdpic_elf_discard_info (bfd *ibfd, if (s->sec_info_type == SEC_INFO_TYPE_EH_FRAME) { if (!_bfinfdpic_check_discarded_relocs (ibfd, s, info, &changed)) - return FALSE; + return false; obfd = s->output_section->owner; } @@ -4399,13 +4204,13 @@ bfinfdpic_elf_discard_info (bfd *ibfd, NULL); if (!_bfinfdpic_size_got_plt (obfd, &gpinfo)) - return FALSE; + return false; } - return TRUE; + return true; } -static bfd_boolean +static bool elf32_bfinfdpic_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info) { @@ -4441,7 +4246,7 @@ elf32_bfinfdpic_finish_dynamic_sections (bfd *output_bfd, { _bfd_error_handler ("LINKER BUG: .rofixup section size mismatch"); - return FALSE; + return false; } } } @@ -4497,13 +4302,13 @@ elf32_bfinfdpic_finish_dynamic_sections (bfd *output_bfd, } } - return TRUE; + return true; } /* Adjust a symbol defined by a dynamic object and referenced by a regular object. */ -static bfd_boolean +static bool elf32_bfinfdpic_adjust_dynamic_symbol (struct bfd_link_info *info, struct elf_link_hash_entry *h) { @@ -4513,7 +4318,7 @@ elf32_bfinfdpic_adjust_dynamic_symbol (struct bfd_link_info *info, /* Make sure we know what is going on here. */ BFD_ASSERT (dynobj != NULL - && (h->u.weakdef != NULL + && (h->is_weakalias || (h->def_dynamic && h->ref_regular && !h->def_regular))); @@ -4521,40 +4326,40 @@ elf32_bfinfdpic_adjust_dynamic_symbol (struct bfd_link_info *info, /* If this is a weak symbol, and there is a real definition, the processor independent code will have arranged for us to see the real definition first, and we can just use the same value. */ - if (h->u.weakdef != NULL) + if (h->is_weakalias) { - BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined - || h->u.weakdef->root.type == bfd_link_hash_defweak); - h->root.u.def.section = h->u.weakdef->root.u.def.section; - h->root.u.def.value = h->u.weakdef->root.u.def.value; + struct elf_link_hash_entry *def = weakdef (h); + BFD_ASSERT (def->root.type == bfd_link_hash_defined); + h->root.u.def.section = def->root.u.def.section; + h->root.u.def.value = def->root.u.def.value; } - return TRUE; + return true; } /* Perform any actions needed for dynamic symbols. */ -static bfd_boolean +static bool elf32_bfinfdpic_finish_dynamic_symbol (bfd *output_bfd ATTRIBUTE_UNUSED, struct bfd_link_info *info ATTRIBUTE_UNUSED, struct elf_link_hash_entry *h ATTRIBUTE_UNUSED, Elf_Internal_Sym *sym ATTRIBUTE_UNUSED) { - return TRUE; + return true; } /* Decide whether to attempt to turn absptr or lsda encodings in shared libraries into pcrel within the given input section. */ -static bfd_boolean +static bool bfinfdpic_elf_use_relative_eh_frame (bfd *input_bfd ATTRIBUTE_UNUSED, struct bfd_link_info *info ATTRIBUTE_UNUSED, asection *eh_frame_section ATTRIBUTE_UNUSED) { /* We can't use PC-relative encodings in FDPIC binaries, in general. */ - return FALSE; + return false; } /* Adjust the contents of an eh_frame_hdr section before they're output. */ @@ -4694,7 +4499,7 @@ bfinfdpic_elf_encode_eh_address (bfd *abfd, PLT entry should be faster), or taking hints from the compiler. Given infinite time and money... :-) */ -static bfd_boolean +static bool bfinfdpic_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, const Elf_Internal_Rela *relocs) { @@ -4706,7 +4511,7 @@ bfinfdpic_check_relocs (bfd *abfd, struct bfd_link_info *info, struct bfinfdpic_relocs_info *picrel; if (bfd_link_relocatable (info)) - return TRUE; + return true; symtab_hdr = &elf_tdata (abfd)->symtab_hdr; sym_hashes = elf_sym_hashes (abfd); @@ -4720,9 +4525,14 @@ bfinfdpic_check_relocs (bfd *abfd, struct bfd_link_info *info, r_symndx = ELF32_R_SYM (rel->r_info); if (r_symndx < symtab_hdr->sh_info) - h = NULL; + h = NULL; else - h = sym_hashes[r_symndx - symtab_hdr->sh_info]; + { + 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; + } switch (ELF32_R_TYPE (rel->r_info)) { @@ -4750,7 +4560,7 @@ bfinfdpic_check_relocs (bfd *abfd, struct bfd_link_info *info, { elf_hash_table (info)->dynobj = dynobj = abfd; if (! _bfin_create_got_section (abfd, info)) - return FALSE; + return false; } if (! IS_FDPIC (abfd)) { @@ -4779,7 +4589,7 @@ bfinfdpic_check_relocs (bfd *abfd, struct bfd_link_info *info, (info), abfd, r_symndx, rel->r_addend, INSERT); if (! picrel) - return FALSE; + return false; break; default: @@ -4788,7 +4598,7 @@ bfinfdpic_check_relocs (bfd *abfd, struct bfd_link_info *info, } switch (ELF32_R_TYPE (rel->r_info)) - { + { case R_BFIN_PCREL24: case R_BFIN_PCREL24_JUMP_L: if (IS_FDPIC (abfd)) @@ -4797,7 +4607,7 @@ bfinfdpic_check_relocs (bfd *abfd, struct bfd_link_info *info, case R_BFIN_FUNCDESC_VALUE: picrel->relocsfdv++; - if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC) + if (bfd_section_flags (sec) & SEC_ALLOC) picrel->relocs32--; /* Fall through. */ @@ -4806,7 +4616,7 @@ bfinfdpic_check_relocs (bfd *abfd, struct bfd_link_info *info, break; picrel->sym++; - if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC) + if (bfd_section_flags (sec) & SEC_ALLOC) picrel->relocs32++; break; @@ -4848,21 +4658,21 @@ bfinfdpic_check_relocs (bfd *abfd, struct bfd_link_info *info, picrel->relocsfd++; break; - /* This relocation describes the C++ object vtable hierarchy. - Reconstruct it for later use during GC. */ - case R_BFIN_GNU_VTINHERIT: - if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset)) - return FALSE; - break; - - /* This relocation describes which C++ vtable entries are actually - used. Record for later use during GC. */ - case R_BFIN_GNU_VTENTRY: - BFD_ASSERT (h != NULL); - if (h != NULL - && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend)) - return FALSE; - break; + /* This relocation describes the C++ object vtable hierarchy. + Reconstruct it for later use during GC. */ + case R_BFIN_GNU_VTINHERIT: + if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset)) + return false; + break; + + /* This relocation describes which C++ vtable entries are actually + used. Record for later use during GC. */ + case R_BFIN_GNU_VTENTRY: + BFD_ASSERT (h != NULL); + if (h != NULL + && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend)) + return false; + break; case R_BFIN_HUIMM16: case R_BFIN_LUIMM16: @@ -4874,18 +4684,18 @@ bfinfdpic_check_relocs (bfd *abfd, struct bfd_link_info *info, bad_reloc: _bfd_error_handler /* xgettext:c-format */ - (_("%B: unsupported relocation type %i"), - abfd, ELF32_R_TYPE (rel->r_info)); - return FALSE; - } + (_("%pB: unsupported relocation type %#x"), + abfd, (int) ELF32_R_TYPE (rel->r_info)); + return false; + } } - return TRUE; + return true; } /* Set the right machine number for a Blackfin ELF file. */ -static bfd_boolean +static bool elf32_bfin_object_p (bfd *abfd) { bfd_default_set_arch_mach (abfd, bfd_arch_bfin, 0); @@ -4893,16 +4703,16 @@ elf32_bfin_object_p (bfd *abfd) == (IS_FDPIC (abfd))); } -static bfd_boolean +static bool elf32_bfin_set_private_flags (bfd * abfd, flagword flags) { elf_elfheader (abfd)->e_flags = flags; - elf_flags_init (abfd) = TRUE; - return TRUE; + elf_flags_init (abfd) = true; + return true; } /* Display the flags field. */ -static bfd_boolean +static bool elf32_bfin_print_private_bfd_data (bfd * abfd, void * ptr) { FILE *file = (FILE *) ptr; @@ -4926,18 +4736,22 @@ elf32_bfin_print_private_bfd_data (bfd * abfd, void * ptr) fputc ('\n', file); - return TRUE; + return true; } /* Merge backend specific data from an object file to the output object file when linking. */ -static bfd_boolean +static bool elf32_bfin_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info) { bfd *obfd = info->output_bfd; flagword old_flags, new_flags; - bfd_boolean error = FALSE; + bool error = false; + + /* FIXME: What should be checked when linking shared libraries? */ + if ((ibfd->flags & DYNAMIC) != 0) + return true; new_flags = elf_elfheader (ibfd)->e_flags; old_flags = elf_elfheader (obfd)->e_flags; @@ -4949,27 +4763,26 @@ elf32_bfin_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info) if (0) #endif _bfd_error_handler - ("old_flags = 0x%.8lx, new_flags = 0x%.8lx, init = %s, filename = %s", - old_flags, new_flags, elf_flags_init (obfd) ? "yes" : "no", - bfd_get_filename (ibfd)); + ("old_flags = 0x%.8x, new_flags = 0x%.8x, init = %s, filename = %pB", + old_flags, new_flags, elf_flags_init (obfd) ? "yes" : "no", ibfd); if (!elf_flags_init (obfd)) /* First call, no flags set. */ { - elf_flags_init (obfd) = TRUE; + elf_flags_init (obfd) = true; elf_elfheader (obfd)->e_flags = new_flags; } if (((new_flags & EF_BFIN_FDPIC) == 0) != (! IS_FDPIC (obfd))) { - error = TRUE; + error = true; if (IS_FDPIC (obfd)) _bfd_error_handler - (_("%s: cannot link non-fdpic object file into fdpic executable"), - bfd_get_filename (ibfd)); + (_("%pB: cannot link non-fdpic object file into fdpic executable"), + ibfd); else _bfd_error_handler - (_("%s: cannot link fdpic object file into non-fdpic executable"), - bfd_get_filename (ibfd)); + (_("%pB: cannot link fdpic object file into non-fdpic executable"), + ibfd); } if (error) @@ -4988,16 +4801,6 @@ struct bfin_link_hash_entry struct bfin_pcrel_relocs_copied *pcrel_relocs_copied; }; -/* bfin ELF linker hash table. */ - -struct bfin_link_hash_table -{ - struct elf_link_hash_table root; - - /* Small local sym cache. */ - struct sym_cache sym_cache; -}; - #define bfin_hash_entry(ent) ((struct bfin_link_hash_entry *) (ent)) static struct bfd_hash_entry * @@ -5026,15 +4829,14 @@ bfin_link_hash_newfunc (struct bfd_hash_entry *entry, static struct bfd_link_hash_table * bfin_link_hash_table_create (bfd * abfd) { - struct bfin_link_hash_table *ret; - bfd_size_type amt = sizeof (struct bfin_link_hash_table); + struct elf_link_hash_table *ret; + size_t amt = sizeof (struct elf_link_hash_table); ret = bfd_zmalloc (amt); if (ret == NULL) return NULL; - if (!_bfd_elf_link_hash_table_init (&ret->root, abfd, - bfin_link_hash_newfunc, + if (!_bfd_elf_link_hash_table_init (ret, abfd, bfin_link_hash_newfunc, sizeof (struct elf_link_hash_entry), BFIN_ELF_DATA)) { @@ -5042,16 +4844,14 @@ bfin_link_hash_table_create (bfd * abfd) return NULL; } - ret->sym_cache.abfd = NULL; - - return &ret->root.root; + return &ret->root; } /* The size in bytes of an entry in the procedure linkage table. */ /* Finish up the dynamic sections. */ -static bfd_boolean +static bool bfin_finish_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED, struct bfd_link_info *info) { @@ -5079,13 +4879,13 @@ bfin_finish_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED, } } - return TRUE; + return true; } /* Finish up dynamic symbol handling. We set the contents of various dynamic sections here. */ -static bfd_boolean +static bool bfin_finish_dynamic_symbol (bfd * output_bfd, struct bfd_link_info *info, struct elf_link_hash_entry *h, @@ -5099,7 +4899,7 @@ bfin_finish_dynamic_symbol (bfd * output_bfd, bfd_byte *loc; /* This symbol has an entry in the global offset table. - Set it up. */ + Set it up. */ sgot = elf_hash_table (info)->sgot; srela = elf_hash_table (info)->srelgot; @@ -5110,10 +4910,10 @@ bfin_finish_dynamic_symbol (bfd * output_bfd, + (h->got.offset & ~(bfd_vma) 1)); /* If this is a -Bsymbolic link, and the symbol is defined - locally, we just want to emit a RELATIVE reloc. Likewise if - the symbol was forced to be local because of a version file. - The entry in the global offset table will already have been - initialized in the relocate_section function. */ + locally, we just want to emit a RELATIVE reloc. Likewise if + the symbol was forced to be local because of a version file. + The entry in the global offset table will already have been + initialized in the relocate_section function. */ if (bfd_link_pic (info) && (info->symbolic || h->dynindx == -1 || h->forced_local) && h->def_regular) @@ -5149,7 +4949,7 @@ bfin_finish_dynamic_symbol (bfd * output_bfd, || h == elf_hash_table (info)->hgot) sym->st_shndx = SHN_ABS; - return TRUE; + return true; } /* Adjust a symbol defined by a dynamic object and referenced by a @@ -5158,7 +4958,7 @@ bfin_finish_dynamic_symbol (bfd * output_bfd, change the definition to something the rest of the link can understand. */ -static bfd_boolean +static bool bfin_adjust_dynamic_symbol (struct bfd_link_info *info, struct elf_link_hash_entry *h) { @@ -5171,7 +4971,7 @@ bfin_adjust_dynamic_symbol (struct bfd_link_info *info, /* Make sure we know what is going on here. */ BFD_ASSERT (dynobj != NULL && (h->needs_plt - || h->u.weakdef != NULL + || h->is_weakalias || (h->def_dynamic && h->ref_regular && !h->def_regular))); /* If this is a function, put it in the procedure linkage table. We @@ -5185,13 +4985,13 @@ bfin_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 @@ -5202,7 +5002,7 @@ bfin_adjust_dynamic_symbol (struct bfd_link_info *info, For such cases we need not do anything here; the relocations will be handled correctly by relocate_section. */ if (bfd_link_pic (info)) - return TRUE; + return true; /* We must allocate the symbol in our .dynbss section, which will become part of the .bss section of the executable. There will be @@ -5235,7 +5035,7 @@ bfin_adjust_dynamic_symbol (struct bfd_link_info *info, if ((h->root.u.def.section->flags & SEC_ALLOC) != 0) { _bfd_error_handler (_("the bfin target does not currently support the generation of copy relocations")); - return FALSE; + return false; } #endif /* We need to figure out the alignment required for this symbol. I @@ -5246,10 +5046,10 @@ bfin_adjust_dynamic_symbol (struct bfd_link_info *info, /* Apply the required alignment. */ s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two)); - if (power_of_two > bfd_get_section_alignment (dynobj, s)) + if (power_of_two > bfd_section_alignment (s)) { - if (!bfd_set_section_alignment (dynobj, s, power_of_two)) - return FALSE; + if (!bfd_set_section_alignment (s, power_of_two)) + return false; } /* Define the symbol as being at this point in the section. */ @@ -5259,7 +5059,7 @@ bfin_adjust_dynamic_symbol (struct bfd_link_info *info, /* Increment the section size to make room for the symbol. */ s->size += h->size; - return TRUE; + return true; } /* The bfin linker needs to keep track of the number of relocs that it @@ -5294,7 +5094,7 @@ struct bfin_pcrel_relocs_copied against a readonly section, and set the DF_TEXTREL flag in this case. */ -static bfd_boolean +static bool bfin_discard_copies (struct elf_link_hash_entry *h, void * inf) { struct bfd_link_info *info = (struct bfd_link_info *) inf; @@ -5314,23 +5114,23 @@ bfin_discard_copies (struct elf_link_hash_entry *h, void * inf) } } - return TRUE; + return true; } for (s = bfin_hash_entry (h)->pcrel_relocs_copied; s != NULL; s = s->next) s->section->size -= s->count * sizeof (Elf32_External_Rela); - return TRUE; + return true; } -static bfd_boolean +static bool bfin_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED, struct bfd_link_info *info) { bfd *dynobj; asection *s; - bfd_boolean relocs; + bool relocs; dynobj = elf_hash_table (info)->dynobj; BFD_ASSERT (dynobj != NULL); @@ -5338,7 +5138,7 @@ bfin_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED, if (elf_hash_table (info)->dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (bfd_link_executable (info)) + if (bfd_link_executable (info) && !info->nointerp) { s = bfd_get_linker_section (dynobj, ".interp"); BFD_ASSERT (s != NULL); @@ -5349,10 +5149,10 @@ bfin_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED, else { /* We may have created entries in the .rela.got section. - However, if we are not creating the dynamic sections, we will - not actually use these entries. Reset the size of .rela.got, - which will cause it to get stripped from the output file - below. */ + However, if we are not creating the dynamic sections, we will + not actually use these entries. Reset the size of .rela.got, + which will cause it to get stripped from the output file + below. */ s = elf_hash_table (info)->srelgot; if (s != NULL) s->size = 0; @@ -5371,46 +5171,46 @@ bfin_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED, /* The check_relocs and adjust_dynamic_symbol entry points have determined the sizes of the various dynamic sections. Allocate memory for them. */ - relocs = FALSE; + relocs = false; for (s = dynobj->sections; s != NULL; s = s->next) { const char *name; - bfd_boolean strip; + bool strip; if ((s->flags & SEC_LINKER_CREATED) == 0) continue; /* It's OK to base decisions on the section name, because none - of the dynobj section names depend upon the input files. */ - name = bfd_get_section_name (dynobj, s); + of the dynobj section names depend upon the input files. */ + name = bfd_section_name (s); - strip = FALSE; + strip = false; - if (CONST_STRNEQ (name, ".rela")) + if (startswith (name, ".rela")) { if (s->size == 0) { /* If we don't need this section, strip it from the - output file. This is mostly to handle .rela.bss and - .rela.plt. We must create both sections in - create_dynamic_sections, because they must be created - before the linker maps input sections to output - sections. The linker does that before - adjust_dynamic_symbol is called, and it is that - function which decides whether anything needs to go - into these sections. */ - strip = TRUE; + output file. This is mostly to handle .rela.bss and + .rela.plt. We must create both sections in + create_dynamic_sections, because they must be created + before the linker maps input sections to output + sections. The linker does that before + adjust_dynamic_symbol is called, and it is that + function which decides whether anything needs to go + into these sections. */ + strip = true; } else { - relocs = TRUE; + relocs = true; /* We use the reloc_count field as a counter if we need - to copy relocs into the output file. */ + to copy relocs into the output file. */ s->reloc_count = 0; } } - else if (! CONST_STRNEQ (name, ".got")) + else if (! startswith (name, ".got")) { /* It's not one of our sections, so don't allocate space. */ continue; @@ -5424,29 +5224,29 @@ bfin_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED, /* Allocate memory for the section contents. */ /* FIXME: This should be a call to bfd_alloc not bfd_zalloc. - Unused entries should be reclaimed before the section's contents - are written out, but at the moment this does not happen. Thus in - order to prevent writing out garbage, we initialise the section's - contents to zero. */ + Unused entries should be reclaimed before the section's contents + are written out, but at the moment this does not happen. Thus in + order to prevent writing out garbage, we initialise the section's + contents to zero. */ s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size); if (s->contents == NULL && s->size != 0) - 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 bfin_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. */ + values later, in bfin_finish_dynamic_sections, but we + must add the entries now so that we get the correct size for + the .dynamic section. The DT_DEBUG entry is filled in by the + dynamic linker and used by the debugger. */ #define add_dynamic_entry(TAG, VAL) \ _bfd_elf_add_dynamic_entry (info, TAG, VAL) if (!bfd_link_pic (info)) { if (!add_dynamic_entry (DT_DEBUG, 0)) - return FALSE; + return false; } @@ -5456,18 +5256,18 @@ bfin_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED, || !add_dynamic_entry (DT_RELASZ, 0) || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela))) - return FALSE; + return false; } if ((info->flags & DF_TEXTREL) != 0) { if (!add_dynamic_entry (DT_TEXTREL, 0)) - return FALSE; + return false; } } #undef add_dynamic_entry - return TRUE; + return true; } /* Given a .data section and a .emreloc in-memory section, store @@ -5477,7 +5277,7 @@ bfin_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED, after the add_symbols entry point has been called for all the objects, and before the final_link entry point is called. */ -bfd_boolean +bool bfd_bfin_elf32_create_embedded_relocs (bfd *abfd, struct bfd_link_info *info, asection *datasec, @@ -5496,7 +5296,7 @@ bfd_bfin_elf32_create_embedded_relocs (bfd *abfd, *errmsg = NULL; if (datasec->reloc_count == 0) - return TRUE; + return true; symtab_hdr = &elf_tdata (abfd)->symtab_hdr; @@ -5528,7 +5328,7 @@ bfd_bfin_elf32_create_embedded_relocs (bfd *abfd, /* We can only relocate absolute longword relocs at run time. */ if (ELF32_R_TYPE (irel->r_info) != (int) R_BFIN_BYTE4_DATA) { - *errmsg = _("unsupported reloc type"); + *errmsg = _("unsupported relocation type"); bfd_set_error (bfd_error_bad_value); goto error_return; } @@ -5576,27 +5376,25 @@ bfd_bfin_elf32_create_embedded_relocs (bfd *abfd, strncpy ((char *) p + 4, targetsec->output_section->name, 8); } - if (isymbuf != NULL && symtab_hdr->contents != (unsigned char *) isymbuf) + if (symtab_hdr->contents != (unsigned char *) isymbuf) free (isymbuf); - if (internal_relocs != NULL - && elf_section_data (datasec)->relocs != internal_relocs) + if (elf_section_data (datasec)->relocs != internal_relocs) free (internal_relocs); - return TRUE; + return true; -error_return: - if (isymbuf != NULL && symtab_hdr->contents != (unsigned char *) isymbuf) + error_return: + if (symtab_hdr->contents != (unsigned char *) isymbuf) free (isymbuf); - if (internal_relocs != NULL - && elf_section_data (datasec)->relocs != internal_relocs) + if (elf_section_data (datasec)->relocs != internal_relocs) free (internal_relocs); - return FALSE; + return false; } struct bfd_elf_special_section const elf32_bfin_special_sections[] = { { ".l1.text", 8, -2, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR }, { ".l1.data", 8, -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE }, - { NULL, 0, 0, 0, 0 } + { NULL, 0, 0, 0, 0 } }; @@ -5612,43 +5410,38 @@ struct bfd_elf_special_section const elf32_bfin_special_sections[] = #define bfd_elf32_bfd_reloc_name_lookup \ bfin_bfd_reloc_name_lookup #define elf_info_to_howto bfin_info_to_howto -#define elf_info_to_howto_rel 0 +#define elf_info_to_howto_rel NULL #define elf_backend_object_p elf32_bfin_object_p #define bfd_elf32_bfd_is_local_label_name \ - bfin_is_local_label_name -#define bfin_hash_table(p) \ - ((struct bfin_link_hash_table *) (p)->hash) - - + bfin_is_local_label_name #define elf_backend_create_dynamic_sections \ - _bfd_elf_create_dynamic_sections + _bfd_elf_create_dynamic_sections #define bfd_elf32_bfd_link_hash_table_create \ - bfin_link_hash_table_create -#define bfd_elf32_bfd_final_link bfd_elf_gc_common_final_link + bfin_link_hash_table_create +#define bfd_elf32_bfd_final_link bfd_elf_gc_common_final_link -#define elf_backend_check_relocs bfin_check_relocs +#define elf_backend_check_relocs bfin_check_relocs #define elf_backend_adjust_dynamic_symbol \ - bfin_adjust_dynamic_symbol + bfin_adjust_dynamic_symbol #define elf_backend_size_dynamic_sections \ - bfin_size_dynamic_sections -#define elf_backend_relocate_section bfin_relocate_section + bfin_size_dynamic_sections +#define elf_backend_relocate_section bfin_relocate_section #define elf_backend_finish_dynamic_symbol \ - bfin_finish_dynamic_symbol + bfin_finish_dynamic_symbol #define elf_backend_finish_dynamic_sections \ - bfin_finish_dynamic_sections -#define elf_backend_gc_mark_hook bfin_gc_mark_hook -#define elf_backend_gc_sweep_hook bfin_gc_sweep_hook + bfin_finish_dynamic_sections +#define elf_backend_gc_mark_hook bfin_gc_mark_hook #define bfd_elf32_bfd_merge_private_bfd_data \ - elf32_bfin_merge_private_bfd_data + elf32_bfin_merge_private_bfd_data #define bfd_elf32_bfd_set_private_flags \ - elf32_bfin_set_private_flags + elf32_bfin_set_private_flags #define bfd_elf32_bfd_print_private_bfd_data \ - elf32_bfin_print_private_bfd_data + elf32_bfin_print_private_bfd_data #define elf_backend_final_write_processing \ - elf32_bfin_final_write_processing -#define elf_backend_reloc_type_class elf32_bfin_reloc_type_class + elf32_bfin_final_write_processing +#define elf_backend_reloc_type_class elf32_bfin_reloc_type_class #define elf_backend_stack_align 8 #define elf_backend_can_gc_sections 1 #define elf_backend_special_sections elf32_bfin_special_sections @@ -5656,28 +5449,25 @@ struct bfd_elf_special_section const elf32_bfin_special_sections[] = #define elf_backend_want_got_plt 0 #define elf_backend_plt_readonly 1 #define elf_backend_want_plt_sym 0 -#define elf_backend_got_header_size 12 -#define elf_backend_rela_normal 1 +#define elf_backend_got_header_size 12 +#define elf_backend_rela_normal 1 #include "elf32-target.h" #undef TARGET_LITTLE_SYM -#define TARGET_LITTLE_SYM bfin_elf32_fdpic_vec +#define TARGET_LITTLE_SYM bfin_elf32_fdpic_vec #undef TARGET_LITTLE_NAME #define TARGET_LITTLE_NAME "elf32-bfinfdpic" #undef elf32_bed -#define elf32_bed elf32_bfinfdpic_bed - -#undef elf_backend_gc_sweep_hook -#define elf_backend_gc_sweep_hook bfinfdpic_gc_sweep_hook +#define elf32_bed elf32_bfinfdpic_bed #undef elf_backend_got_header_size -#define elf_backend_got_header_size 0 +#define elf_backend_got_header_size 0 #undef elf_backend_relocate_section -#define elf_backend_relocate_section bfinfdpic_relocate_section +#define elf_backend_relocate_section bfinfdpic_relocate_section #undef elf_backend_check_relocs -#define elf_backend_check_relocs bfinfdpic_check_relocs +#define elf_backend_check_relocs bfinfdpic_check_relocs #undef bfd_elf32_bfd_link_hash_table_create #define bfd_elf32_bfd_link_hash_table_create \ @@ -5716,12 +5506,12 @@ struct bfd_elf_special_section const elf32_bfin_special_sections[] = bfinfdpic_elf_encode_eh_address #undef elf_backend_may_use_rel_p -#define elf_backend_may_use_rel_p 1 +#define elf_backend_may_use_rel_p 1 #undef elf_backend_may_use_rela_p -#define elf_backend_may_use_rela_p 1 +#define elf_backend_may_use_rela_p 1 /* We use REL for dynamic relocations only. */ #undef elf_backend_default_use_rela_p -#define elf_backend_default_use_rela_p 1 +#define elf_backend_default_use_rela_p 1 #undef elf_backend_omit_section_dynsym #define elf_backend_omit_section_dynsym _bfinfdpic_link_omit_section_dynsym