/* FRV-specific support for 32-bit ELF.
- Copyright (C) 2002-2019 Free Software Foundation, Inc.
+ Copyright (C) 2002-2021 Free Software Foundation, Inc.
This file is part of BFD, the Binary File Descriptor library.
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_FRV_NONE", /* name */
- FALSE, /* partial_inplace */
+ false, /* partial_inplace */
0, /* src_mask */
0, /* dst_mask */
- FALSE), /* pcrel_offset */
+ false), /* pcrel_offset */
/* A 32 bit absolute relocation. */
HOWTO (R_FRV_32, /* 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_FRV_32", /* name */
- FALSE, /* partial_inplace */
+ false, /* partial_inplace */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
- FALSE), /* pcrel_offset */
+ false), /* pcrel_offset */
/* A 16 bit pc-relative relocation. */
HOWTO (R_FRV_LABEL16, /* type */
2, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
16, /* bitsize */
- TRUE, /* pc_relative */
+ true, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
"R_FRV_LABEL16", /* name */
- FALSE, /* partial_inplace */
+ false, /* partial_inplace */
0xffff, /* src_mask */
0xffff, /* dst_mask */
- TRUE), /* pcrel_offset */
+ true), /* pcrel_offset */
/* A 24-bit pc-relative relocation. */
HOWTO (R_FRV_LABEL24, /* type */
2, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
26, /* bitsize */
- TRUE, /* pc_relative */
+ true, /* pc_relative */
0, /* bitpos */
complain_overflow_bitfield, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
"R_FRV_LABEL24", /* name */
- FALSE, /* partial_inplace */
+ false, /* partial_inplace */
0x7e03ffff, /* src_mask */
0x7e03ffff, /* dst_mask */
- TRUE), /* pcrel_offset */
+ true), /* pcrel_offset */
HOWTO (R_FRV_LO16, /* type */
0, /* rightshift */
2, /* 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_FRV_LO16", /* name */
- FALSE, /* partial_inplace */
+ false, /* partial_inplace */
0xffff, /* src_mask */
0xffff, /* dst_mask */
- FALSE), /* pcrel_offset */
+ false), /* pcrel_offset */
HOWTO (R_FRV_HI16, /* type */
0, /* rightshift */
2, /* 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_FRV_HI16", /* name */
- FALSE, /* partial_inplace */
+ false, /* partial_inplace */
0xffff, /* src_mask */
0xffff, /* dst_mask */
- FALSE), /* pcrel_offset */
+ false), /* pcrel_offset */
HOWTO (R_FRV_GPREL12, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
- FALSE, /* pc_relative */
+ false, /* pc_relative */
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
"R_FRV_GPREL12", /* name */
- FALSE, /* partial_inplace */
+ false, /* partial_inplace */
0xfff, /* src_mask */
0xfff, /* dst_mask */
- FALSE), /* pcrel_offset */
+ false), /* pcrel_offset */
HOWTO (R_FRV_GPRELU12, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
- FALSE, /* pc_relative */
+ false, /* pc_relative */
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
"R_FRV_GPRELU12", /* name */
- FALSE, /* partial_inplace */
+ false, /* partial_inplace */
0xfff, /* src_mask */
0x3f03f, /* dst_mask */
- FALSE), /* pcrel_offset */
+ false), /* pcrel_offset */
HOWTO (R_FRV_GPREL32, /* type */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
32, /* bitsize */
- FALSE, /* pc_relative */
+ false, /* pc_relative */
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
"R_FRV_GPREL32", /* name */
- FALSE, /* partial_inplace */
+ false, /* partial_inplace */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
- FALSE), /* pcrel_offset */
+ false), /* pcrel_offset */
HOWTO (R_FRV_GPRELHI, /* type */
0, /* rightshift */
2, /* 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_FRV_GPRELHI", /* name */
- FALSE, /* partial_inplace */
+ false, /* partial_inplace */
0xffff, /* src_mask */
0xffff, /* dst_mask */
- FALSE), /* pcrel_offset */
+ false), /* pcrel_offset */
HOWTO (R_FRV_GPRELLO, /* type */
0, /* rightshift */
2, /* 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_FRV_GPRELLO", /* 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. */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
- FALSE, /* pc_relative */
+ false, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
"R_FRV_GOT12", /* name */
- FALSE, /* partial_inplace */
+ false, /* partial_inplace */
0xfff, /* src_mask */
0xfff, /* dst_mask */
- FALSE), /* pcrel_offset */
+ false), /* pcrel_offset */
/* The upper 16 bits of the GOT offset for the address of the
symbol. */
0, /* rightshift */
2, /* 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_FRV_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
symbol. */
0, /* rightshift */
2, /* 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_FRV_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_FRV_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_FRV_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. */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
- FALSE, /* pc_relative */
+ false, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
"R_FRV_FUNCDESC_GOT12", /* name */
- FALSE, /* partial_inplace */
+ false, /* partial_inplace */
0xfff, /* src_mask */
0xfff, /* dst_mask */
- FALSE), /* pcrel_offset */
+ false), /* pcrel_offset */
/* The upper 16 bits of the GOT offset for the address of the
canonical descriptor of a function. */
0, /* rightshift */
2, /* 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_FRV_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. */
0, /* rightshift */
2, /* 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_FRV_FUNCDESC_GOTLO", /* name */
- FALSE, /* partial_inplace */
+ false, /* partial_inplace */
0xffff, /* src_mask */
0xffff, /* dst_mask */
- FALSE), /* pcrel_offset */
+ false), /* pcrel_offset */
/* The 64-bit descriptor of a function. */
HOWTO (R_FRV_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_FRV_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. */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
- FALSE, /* pc_relative */
+ false, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
"R_FRV_FUNCDESC_GOTOFF12", /* name */
- FALSE, /* partial_inplace */
+ false, /* partial_inplace */
0xfff, /* src_mask */
0xfff, /* dst_mask */
- FALSE), /* pcrel_offset */
+ false), /* pcrel_offset */
/* The upper 16 bits of the GOT offset for the address of the
canonical descriptor of a function. */
0, /* rightshift */
2, /* 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_FRV_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. */
0, /* rightshift */
2, /* 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_FRV_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. */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
- FALSE, /* pc_relative */
+ false, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
"R_FRV_GOTOFF12", /* name */
- FALSE, /* partial_inplace */
+ false, /* partial_inplace */
0xfff, /* src_mask */
0xfff, /* dst_mask */
- FALSE), /* pcrel_offset */
+ false), /* pcrel_offset */
/* The upper 16 bits of the GOT offset for the address of the
symbol. */
0, /* rightshift */
2, /* 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_FRV_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. */
0, /* rightshift */
2, /* 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_FRV_GOTOFFLO", /* name */
- FALSE, /* partial_inplace */
+ false, /* partial_inplace */
0xffff, /* src_mask */
0xffff, /* dst_mask */
- FALSE), /* pcrel_offset */
+ false), /* pcrel_offset */
/* A 24-bit pc-relative relocation referencing the TLS PLT entry for
a thread-local symbol. If the symbol number is 0, it refers to
2, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
26, /* bitsize */
- TRUE, /* pc_relative */
+ true, /* pc_relative */
0, /* bitpos */
complain_overflow_bitfield, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
"R_FRV_GETTLSOFF", /* name */
- FALSE, /* partial_inplace */
+ false, /* partial_inplace */
0x7e03ffff, /* src_mask */
0x7e03ffff, /* dst_mask */
- TRUE), /* pcrel_offset */
+ true), /* pcrel_offset */
/* A 64-bit TLS descriptor for a symbol. This relocation is only
valid as a REL, dynamic relocation. */
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_FRV_TLSDESC_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 TLS
descriptor of the symbol. */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
- FALSE, /* pc_relative */
+ false, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
"R_FRV_GOTTLSDESC12", /* name */
- FALSE, /* partial_inplace */
+ false, /* partial_inplace */
0xfff, /* src_mask */
0xfff, /* dst_mask */
- FALSE), /* pcrel_offset */
+ false), /* pcrel_offset */
/* The upper 16 bits of the GOT offset for the TLS descriptor of the
symbol. */
0, /* rightshift */
2, /* 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_FRV_GOTTLSDESCHI", /* 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 TLS descriptor of the
symbol. */
0, /* rightshift */
2, /* 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_FRV_GOTTLSDESCLO", /* 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 offset from the module base
address to the thread-local symbol address. */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
- FALSE, /* pc_relative */
+ false, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
"R_FRV_TLSMOFF12", /* name */
- FALSE, /* partial_inplace */
+ false, /* partial_inplace */
0xfff, /* src_mask */
0xfff, /* dst_mask */
- FALSE), /* pcrel_offset */
+ false), /* pcrel_offset */
/* The upper 16 bits of the offset from the module base address to
the thread-local symbol address. */
0, /* rightshift */
2, /* 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_FRV_TLSMOFFHI", /* 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 offset from the module base address to
the thread-local symbol address. */
0, /* rightshift */
2, /* 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_FRV_TLSMOFFLO", /* 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 TLSOFF entry
for a symbol. */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
12, /* bitsize */
- FALSE, /* pc_relative */
+ false, /* pc_relative */
0, /* bitpos */
complain_overflow_signed, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
"R_FRV_GOTTLSOFF12", /* name */
- FALSE, /* partial_inplace */
+ false, /* partial_inplace */
0xfff, /* src_mask */
0xfff, /* dst_mask */
- FALSE), /* pcrel_offset */
+ false), /* pcrel_offset */
/* The upper 16 bits of the GOT offset for the TLSOFF entry for a
symbol. */
0, /* rightshift */
2, /* 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_FRV_GOTTLSOFFHI", /* 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 TLSOFF entry for a
symbol. */
0, /* rightshift */
2, /* 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_FRV_GOTTLSOFFLO", /* name */
- FALSE, /* partial_inplace */
+ false, /* partial_inplace */
0xffff, /* src_mask */
0xffff, /* dst_mask */
- FALSE), /* pcrel_offset */
+ false), /* pcrel_offset */
/* The 32-bit offset from the thread pointer (not the module base
address) to a thread-local symbol. */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
32, /* bitsize */
- FALSE, /* pc_relative */
+ false, /* pc_relative */
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
"R_FRV_TLSOFF", /* name */
- FALSE, /* partial_inplace */
+ false, /* partial_inplace */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
- FALSE), /* pcrel_offset */
+ false), /* pcrel_offset */
/* An annotation for linker relaxation, that denotes the
symbol+addend whose TLS descriptor is referenced by the sum of
0, /* rightshift */
2, /* 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_FRV_TLSDESC_RELAX", /* name */
- FALSE, /* partial_inplace */
+ false, /* partial_inplace */
0, /* src_mask */
0, /* dst_mask */
- FALSE), /* pcrel_offset */
+ false), /* pcrel_offset */
/* An annotation for linker relaxation, that denotes the
symbol+addend whose TLS resolver entry point is given by the sum
0, /* rightshift */
2, /* 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_FRV_GETTLSOFF_RELAX", /* name */
- FALSE, /* partial_inplace */
+ false, /* partial_inplace */
0, /* src_mask */
0, /* dst_mask */
- FALSE), /* pcrel_offset */
+ false), /* pcrel_offset */
/* An annotation for linker relaxation, that denotes the
symbol+addend whose TLS offset GOT entry is given by the sum of
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
0, /* bitsize */
- FALSE, /* pc_relative */
+ false, /* pc_relative */
0, /* bitpos */
complain_overflow_bitfield, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
"R_FRV_TLSOFF_RELAX", /* name */
- FALSE, /* partial_inplace */
+ false, /* partial_inplace */
0, /* src_mask */
0, /* dst_mask */
- FALSE), /* pcrel_offset */
+ false), /* pcrel_offset */
/* A 32-bit offset from the module base address to
the thread-local symbol address. */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
32, /* bitsize */
- FALSE, /* pc_relative */
+ false, /* pc_relative */
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
bfd_elf_generic_reloc, /* special_function */
"R_FRV_TLSMOFF", /* name */
- FALSE, /* partial_inplace */
+ false, /* partial_inplace */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
- FALSE), /* pcrel_offset */
+ false), /* pcrel_offset */
};
/* GNU extension to record C++ vtable hierarchy. */
0, /* rightshift */
2, /* size (0 = byte, 1 = short, 2 = long) */
0, /* bitsize */
- FALSE, /* pc_relative */
+ false, /* pc_relative */
0, /* bitpos */
complain_overflow_dont, /* complain_on_overflow */
NULL, /* special_function */
"R_FRV_GNU_VTINHERIT", /* name */
- FALSE, /* partial_inplace */
+ false, /* partial_inplace */
0, /* src_mask */
0, /* dst_mask */
- FALSE); /* pcrel_offset */
+ false); /* pcrel_offset */
/* GNU extension to record C++ vtable member usage. */
static reloc_howto_type elf32_frv_vtentry_howto =
0, /* rightshift */
2, /* 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_rel_vtable_reloc_fn, /* special_function */
"R_FRV_GNU_VTENTRY", /* name */
- FALSE, /* partial_inplace */
+ false, /* partial_inplace */
0, /* src_mask */
0, /* dst_mask */
- FALSE); /* pcrel_offset */
+ false); /* pcrel_offset */
/* The following 3 relocations are REL. The only difference to the
- entries in the table above are that partial_inplace is TRUE. */
+ entries in the table above are that partial_inplace is true. */
static reloc_howto_type elf32_frv_rel_32_howto =
HOWTO (R_FRV_32, /* 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_FRV_32", /* name */
- TRUE, /* partial_inplace */
+ true, /* partial_inplace */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
- FALSE); /* pcrel_offset */
+ false); /* pcrel_offset */
static reloc_howto_type elf32_frv_rel_funcdesc_howto =
HOWTO (R_FRV_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_FRV_FUNCDESC", /* name */
- TRUE, /* partial_inplace */
+ true, /* partial_inplace */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
- FALSE); /* pcrel_offset */
+ false); /* pcrel_offset */
static reloc_howto_type elf32_frv_rel_funcdesc_value_howto =
HOWTO (R_FRV_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_FRV_FUNCDESC_VALUE", /* name */
- TRUE, /* partial_inplace */
+ true, /* partial_inplace */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
- FALSE); /* pcrel_offset */
+ false); /* pcrel_offset */
static reloc_howto_type elf32_frv_rel_tlsdesc_value_howto =
/* A 64-bit TLS descriptor for a symbol. The first word resolves to
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_FRV_TLSDESC_VALUE", /* name */
- TRUE, /* partial_inplace */
+ true, /* partial_inplace */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
- FALSE); /* pcrel_offset */
+ false); /* pcrel_offset */
static reloc_howto_type elf32_frv_rel_tlsoff_howto =
/* The 32-bit offset from the thread pointer (not the module base
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_FRV_TLSOFF", /* name */
- TRUE, /* partial_inplace */
+ true, /* partial_inplace */
0xffffffff, /* src_mask */
0xffffffff, /* dst_mask */
- FALSE); /* pcrel_offset */
+ false); /* pcrel_offset */
\f
/* Get the FRV ELF linker hash table from a link_info structure. */
#define frvfdpic_hash_table(p) \
- (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
- == FRV_ELF_DATA ? ((struct frvfdpic_elf_link_hash_table *) ((p)->hash)) : NULL)
+ ((is_elf_hash_table ((p)->hash) \
+ && elf_hash_table_id (elf_hash_table (p)) == FRV_ELF_DATA) \
+ ? (struct frvfdpic_elf_link_hash_table *) (p)->hash : NULL)
#define frvfdpic_got_section(info) \
(frvfdpic_hash_table (info)->elf.sgot)
frvfdpic_elf_link_hash_table_create (bfd *abfd)
{
struct frvfdpic_elf_link_hash_table *ret;
- bfd_size_type amt = sizeof (struct frvfdpic_elf_link_hash_table);
+ size_t amt = sizeof (struct frvfdpic_elf_link_hash_table);
ret = bfd_zmalloc (amt);
if (ret == NULL)
return (p != NULL) ? p - elf_tdata (output_bfd)->phdr : -1;
}
-inline static bfd_boolean
+inline static bool
_frvfdpic_osec_readonly_p (bfd *output_bfd, asection *osec)
{
unsigned seg = _frvfdpic_osec_to_segment (output_bfd, osec);
/* Generate relocations for GOT entries, function descriptors, and
code for PLT and lazy PLT entries. */
-inline static bfd_boolean
+inline static bool
_frvfdpic_emit_got_relocs_plt_entries (struct frvfdpic_relocs_info *entry,
bfd *output_bfd,
struct bfd_link_info *info,
int dynindx = -1;
if (entry->done)
- return TRUE;
+ return true;
entry->done = 1;
if (entry->got_entry || entry->fdgot_entry || entry->fd_entry
elf_hash_table (info)->dynobj,
frvfdpic_got_section (info),
entry->fdgot_entry);
- return FALSE;
+ return false;
}
}
else
elf_hash_table (info)->dynobj,
frvfdpic_got_section (info),
entry->fd_entry);
- return FALSE;
+ return false;
}
fd_lazy_rel_offset = ofst;
{
(*info->callbacks->undefined_symbol)
(info, "TLS section", elf_hash_table (info)->dynobj,
- frvfdpic_got_section (info), entry->tlsoff_entry, TRUE);
- return FALSE;
+ frvfdpic_got_section (info), entry->tlsoff_entry, true);
+ return false;
}
idx = elf_section_data (elf_hash_table (info)->tls_sec)->dynindx;
ad += FRVFDPIC_TLS_BIAS;
{
(*info->callbacks->undefined_symbol)
(info, "TLS section", elf_hash_table (info)->dynobj,
- frvfdpic_got_section (info), entry->tlsdesc_entry, TRUE);
- return FALSE;
+ frvfdpic_got_section (info), entry->tlsdesc_entry, true);
+ return false;
}
idx = elf_section_data (elf_hash_table (info)->tls_sec)->dynindx;
ad += FRVFDPIC_TLS_BIAS;
}
}
- return TRUE;
+ return true;
}
/* Handle an FRV small data reloc. */
bfd_vma gp;
struct bfd_link_hash_entry *h;
- h = bfd_link_hash_lookup (info->hash, "_gp", FALSE, FALSE, TRUE);
+ h = bfd_link_hash_lookup (info->hash, "_gp", false, false, true);
gp = (h->u.def.value
+ h->u.def.section->output_section->vma
struct bfd_link_hash_entry *h;
bfd_vma mask;
- h = bfd_link_hash_lookup (info->hash, "_gp", FALSE, FALSE, TRUE);
+ h = bfd_link_hash_lookup (info->hash, "_gp", false, false, true);
gp = (h->u.def.value
+ h->u.def.section->output_section->vma
bfd_vma gp;
struct bfd_link_hash_entry *h;
- h = bfd_link_hash_lookup (info->hash, "_gp", FALSE, FALSE, TRUE);
+ h = bfd_link_hash_lookup (info->hash, "_gp", false, false, true);
gp = (h->u.def.value
+ h->u.def.section->output_section->vma
bfd_vma gp;
struct bfd_link_hash_entry *h;
- h = bfd_link_hash_lookup (info->hash, "_gp", FALSE, FALSE, TRUE);
+ h = bfd_link_hash_lookup (info->hash, "_gp", false, false, true);
gp = (h->u.def.value
+ h->u.def.section->output_section->vma
/* Set the howto pointer for an FRV ELF reloc. */
-static bfd_boolean
+static bool
frv_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
arelent *cache_ptr,
Elf_Internal_Rela *dst)
_bfd_error_handler (_("%pB: unsupported relocation type %#x"),
abfd, r_type);
bfd_set_error (bfd_error_bad_value);
- return FALSE;
+ return false;
}
cache_ptr->howto = & elf32_frv_howto_table [r_type];
break;
}
- return TRUE;
+ return true;
}
/* Set the howto pointer for an FRV ELF REL reloc. */
-static bfd_boolean
+static bool
frvfdpic_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
arelent *cache_ptr, Elf_Internal_Rela *dst)
{
default:
cache_ptr->howto = NULL;
- return FALSE;
+ return false;
}
- return TRUE;
+ return true;
}
\f
/* Perform a single relocation. By default we use the standard BFD
section, which means that the addend must be adjusted
accordingly. */
-static bfd_boolean
+static int
elf32_frv_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
struct bfd_link_info *info,
bfd *input_bfd,
const char *name;
int r_type;
asection *osec;
- struct frvfdpic_relocs_info *picrel;
+ struct frvfdpic_relocs_info *picrel = NULL;
bfd_vma orig_addend = rel->r_addend;
r_type = ELF32_R_TYPE (rel->r_info);
name = bfd_elf_string_from_elf_section
(input_bfd, symtab_hdr->sh_link, sym->st_name);
if (name == NULL || name[0] == 0)
- name = bfd_section_name (input_bfd, sec);
+ name = bfd_section_name (sec);
}
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,
case R_FRV_GETTLSOFF_RELAX:
case R_FRV_TLSOFF_RELAX:
case R_FRV_TLSMOFF:
+ if ((input_section->flags & SEC_ALLOC) == 0)
+ break;
+
if (h != NULL)
picrel = frvfdpic_relocs_info_for_global (frvfdpic_relocs_info
(info), input_bfd, h,
(info), input_bfd, r_symndx,
orig_addend, INSERT);
if (! picrel)
- return FALSE;
+ return false;
if (!_frvfdpic_emit_got_relocs_plt_entries (picrel, output_bfd, info,
osec, sym,
(_("%H: relocation to `%s+%v'"
" may have caused the error above\n"),
input_bfd, input_section, rel->r_offset, name, rel->r_addend);
- return FALSE;
+ return false;
}
break;
(_("%H: relocation references symbol"
" not defined in the module\n"),
input_bfd, input_section, rel->r_offset);
- return FALSE;
+ return false;
}
break;
}
info->callbacks->einfo
(_("%H: R_FRV_GETTLSOFF not applied to a call instruction\n"),
input_bfd, input_section, rel->r_offset);
- return FALSE;
+ return false;
}
if (RELAX_GETTLSOFF_LOCAL_EXEC_P (info, picrel,
(_("%H: R_FRV_GOTTLSDESC12"
" not applied to an lddi instruction\n"),
input_bfd, input_section, rel->r_offset);
- return FALSE;
+ return false;
}
if (RELAX_TLSDESC_LOCAL_EXEC_P (info, picrel,
(_("%H: R_FRV_GOTTLSDESCHI"
" not applied to a sethi instruction\n"),
input_bfd, input_section, rel->r_offset);
- return FALSE;
+ return false;
}
if (RELAX_TLSDESC_LOCAL_EXEC_P (info, picrel,
(_("%H: R_FRV_GOTTLSDESCLO"
" not applied to a setlo or setlos instruction\n"),
input_bfd, input_section, rel->r_offset);
- return FALSE;
+ return false;
}
if (RELAX_TLSDESC_LOCAL_EXEC_P (info, picrel,
(_("%H: R_FRV_TLSDESC_RELAX"
" not applied to an ldd instruction\n"),
input_bfd, input_section, rel->r_offset);
- return FALSE;
+ return false;
}
if (RELAX_TLSDESC_LOCAL_EXEC_P (info, picrel,
(_("%H: R_FRV_GETTLSOFF_RELAX"
" not applied to a calll instruction\n"),
input_bfd, input_section, rel->r_offset);
- return FALSE;
+ return false;
}
if (RELAX_TLSDESC_LOCAL_EXEC_P (info, picrel,
(_("%H: R_FRV_GOTTLSOFF12"
" not applied to an ldi instruction\n"),
input_bfd, input_section, rel->r_offset);
- return FALSE;
+ return false;
}
if (RELAX_GOTTLSOFF_LOCAL_EXEC_P (info, picrel,
(_("%H: R_FRV_GOTTLSOFFHI"
" not applied to a sethi instruction\n"),
input_bfd, input_section, rel->r_offset);
- return FALSE;
+ return false;
}
if (RELAX_GOTTLSOFF_LOCAL_EXEC_P (info, picrel,
(_("%H: R_FRV_GOTTLSOFFLO"
" not applied to a setlo or setlos instruction\n"),
input_bfd, input_section, rel->r_offset);
- return FALSE;
+ return false;
}
if (RELAX_GOTTLSOFF_LOCAL_EXEC_P (info, picrel,
(_("%H: R_FRV_TLSOFF_RELAX"
" not applied to an ld instruction\n"),
input_bfd, input_section, rel->r_offset);
- return FALSE;
+ return false;
}
if (RELAX_GOTTLSOFF_LOCAL_EXEC_P (info, picrel,
(_("%H: R_FRV_TLSMOFFHI"
" not applied to a sethi instruction\n"),
input_bfd, input_section, rel->r_offset);
- return FALSE;
+ return false;
}
if (TLSMOFF_IN_RANGE_FOR_SETLOS_P (relocation + rel->r_addend,
(_("R_FRV_TLSMOFFLO"
" not applied to a setlo or setlos instruction\n"),
input_bfd, input_section, rel->r_offset);
- return FALSE;
+ return false;
}
if (TLSMOFF_IN_RANGE_FOR_SETLOS_P (relocation + rel->r_addend,
" with nonzero addend\n"),
input_bfd, input_section, rel->r_offset,
"R_FRV_FUNCDESC");
- return FALSE;
+ return false;
}
dynindx = h->dynindx;
}
&& (!h || FRVFDPIC_FUNCDESC_LOCAL (info, h)))
{
addend += frvfdpic_got_section (info)->output_section->vma;
- 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))
{
bfd_vma offset;
(_("%H: cannot emit fixups"
" in read-only section\n"),
input_bfd, input_section, rel->r_offset);
- return FALSE;
+ return false;
}
offset = _bfd_elf_section_offset
picrel);
}
}
- else if ((bfd_get_section_flags (output_bfd,
- input_section->output_section)
+ else if ((bfd_section_flags (input_section->output_section)
& (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
{
bfd_vma offset;
(_("%H: cannot emit dynamic relocations"
" in read-only section\n"),
input_bfd, input_section, rel->r_offset);
- return FALSE;
+ return false;
}
offset = _bfd_elf_section_offset
" with nonzero addend\n"),
input_bfd, input_section, rel->r_offset,
"R_FRV_FUNCDESC_VALUE");
- return FALSE;
+ return false;
}
dynindx = h->dynindx;
}
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 (_frvfdpic_osec_readonly_p (output_bfd,
info->callbacks->einfo
(_("%H: cannot emit fixups in read-only section\n"),
input_bfd, input_section, rel->r_offset);
- return FALSE;
+ return false;
}
if (!h || h->root.type != bfd_link_hash_undefweak)
{
}
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))
{
bfd_vma offset;
(_("%H: cannot emit dynamic relocations"
" in read-only section\n"),
input_bfd, input_section, rel->r_offset);
- return FALSE;
+ return false;
}
offset = _bfd_elf_section_offset
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;
if (!silence_segment_error
input_bfd, input_section, rel->r_offset, name);
}
if (!silence_segment_error && bfd_link_pic (info))
- return FALSE;
+ return false;
elf_elfheader (output_bfd)->e_flags |= EF_FRV_PIC;
}
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:
/* xgettext:c-format */
(_("%H: reloc against `%s': %s\n"),
input_bfd, input_section, rel->r_offset, name, msg);
- return FALSE;
+ return false;
}
}
}
- return TRUE;
+ return true;
}
\f
/* Return the section that should be marked against GC for a given
/* Hook called by the linker routine which adds symbols from an object
file. We use it to put .comm items in .scomm, and not .comm. */
-static bfd_boolean
+static bool
elf32_frv_add_symbol_hook (bfd *abfd,
struct bfd_link_info *info,
Elf_Internal_Sym *sym,
scomm = bfd_make_section_with_flags (abfd, ".scommon",
(SEC_ALLOC
| SEC_IS_COMMON
+ | SEC_SMALL_DATA
| SEC_LINKER_CREATED));
if (scomm == NULL)
- return FALSE;
+ return false;
}
*secp = scomm;
*valp = sym->st_size;
}
- return TRUE;
+ return true;
}
/* We need dynamic symbols for every section, since segments can
relocate independently. */
-static bfd_boolean
+static bool
_frvfdpic_link_omit_section_dynsym (bfd *output_bfd ATTRIBUTE_UNUSED,
struct bfd_link_info *info
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;
}
}
is almost entirely copied from
elflink.c:_bfd_elf_create_got_section(). */
-static bfd_boolean
+static bool
_frv_create_got_section (bfd *abfd, struct bfd_link_info *info)
{
flagword flags, pltflags;
/* 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
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)
{
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. */
frvfdpic_relocs_info_eq,
(htab_del) NULL);
if (! frvfdpic_relocs_info (info))
- return FALSE;
+ return false;
s = bfd_make_section_anyway_with_flags (abfd, ".rel.got",
(flags | SEC_READONLY));
elf_hash_table (info)->srelgot = s;
if (s == NULL
- || ! bfd_set_section_alignment (abfd, s, 2))
- return FALSE;
+ || !bfd_set_section_alignment (s, 2))
+ return false;
/* Machine-specific. */
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;
frvfdpic_gotfixup_section (info) = s;
offset = -2048;
linker script will override it. */
bh = NULL;
if (!(_bfd_generic_link_add_one_symbol
- (info, abfd, "_gp", flags, s, offset, (const char *) NULL, FALSE,
+ (info, abfd, "_gp", flags, s, offset, (const char *) NULL, false,
bed->collect, &bh)))
- return FALSE;
+ return false;
h = (struct elf_link_hash_entry *) bh;
h->def_regular = 1;
h->type = STT_OBJECT;
/* Machine-specific: we want the symbol for executables as well. */
if (IS_FDPIC (abfd) && ! bfd_elf_link_record_dynamic_symbol (info, h))
- return FALSE;
+ return false;
if (!IS_FDPIC (abfd))
- return TRUE;
+ return true;
/* FDPIC supports Thread Local Storage, and this may require a
procedure linkage table for TLS PLT entries. */
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;
/* FRV-specific: remember it. */
frvfdpic_plt_section (info) = s;
"_PROCEDURE_LINKAGE_TABLE_");
elf_hash_table (info)->hplt = h;
if (h == NULL)
- return FALSE;
+ return false;
}
/* FRV-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;
/* FRV-specific: remember it. */
frvfdpic_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_frvfdpic_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
{
/* This is mostly copied from
/* FRV-specific: we want to create the GOT and the PLT in the FRV
way. */
if (! _frv_create_got_section (abfd, info))
- return FALSE;
+ return false;
/* FRV-specific: make sure we created everything we wanted. */
BFD_ASSERT (frvfdpic_got_section (info) && frvfdpic_gotrel_section (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
? ".rela.bss" : ".rel.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 and PLT size required by each symbol in each
static void
_frvfdpic_count_tls_entries (struct frvfdpic_relocs_info *entry,
struct _frvfdpic_dynamic_got_info *dinfo,
- bfd_boolean subtract)
+ bool subtract)
{
const int l = subtract ? -1 : 1;
static void
_frvfdpic_count_relocs_fixups (struct frvfdpic_relocs_info *entry,
struct _frvfdpic_dynamic_got_info *dinfo,
- bfd_boolean subtract)
+ bool subtract)
{
bfd_vma relocs = 0, fixups = 0, tlsrets = 0;
static void
_frvfdpic_relax_tls_entries (struct frvfdpic_relocs_info *entry,
struct _frvfdpic_dynamic_got_info *dinfo,
- bfd_boolean relaxing)
+ bool relaxing)
{
- bfd_boolean changed = ! relaxing;
+ bool changed = ! relaxing;
BFD_ASSERT (bfd_link_executable (dinfo->info)
|| (dinfo->info->flags & DF_STATIC_TLS));
{
if (! changed)
{
- _frvfdpic_count_relocs_fixups (entry, dinfo, TRUE);
- _frvfdpic_count_tls_entries (entry, dinfo, TRUE);
- changed = TRUE;
+ _frvfdpic_count_relocs_fixups (entry, dinfo, true);
+ _frvfdpic_count_tls_entries (entry, dinfo, true);
+ changed = true;
}
/* When linking an executable, we can always decay GOTTLSDESC to
{
if (! changed)
{
- _frvfdpic_count_relocs_fixups (entry, dinfo, TRUE);
- _frvfdpic_count_tls_entries (entry, dinfo, TRUE);
- changed = TRUE;
+ _frvfdpic_count_relocs_fixups (entry, dinfo, true);
+ _frvfdpic_count_tls_entries (entry, dinfo, true);
+ changed = true;
}
entry->tlsplt =
{
if (! changed)
{
- _frvfdpic_count_relocs_fixups (entry, dinfo, TRUE);
- _frvfdpic_count_tls_entries (entry, dinfo, TRUE);
- changed = TRUE;
+ _frvfdpic_count_relocs_fixups (entry, dinfo, true);
+ _frvfdpic_count_tls_entries (entry, dinfo, true);
+ changed = true;
}
entry->tlsoff12 = 1;
if (changed)
{
- _frvfdpic_count_tls_entries (entry, dinfo, FALSE);
- _frvfdpic_count_relocs_fixups (entry, dinfo, FALSE);
+ _frvfdpic_count_tls_entries (entry, dinfo, false);
+ _frvfdpic_count_relocs_fixups (entry, dinfo, false);
}
return;
if (bfd_link_executable (dinfo->info)
|| (dinfo->info->flags & DF_STATIC_TLS))
- _frvfdpic_relax_tls_entries (entry, dinfo, FALSE);
+ _frvfdpic_relax_tls_entries (entry, dinfo, false);
else
{
- _frvfdpic_count_tls_entries (entry, dinfo, FALSE);
- _frvfdpic_count_relocs_fixups (entry, dinfo, FALSE);
+ _frvfdpic_count_tls_entries (entry, dinfo, false);
+ _frvfdpic_count_relocs_fixups (entry, dinfo, false);
}
return 1;
section and the rofixup section. Assign locations for GOT and PLT
entries. */
-static bfd_boolean
+static bool
_frvfdpic_size_got_plt (bfd *output_bfd,
struct _frvfdpic_dynamic_got_plt_info *gpinfop)
{
(bfd_byte *) bfd_zalloc (dynobj,
frvfdpic_got_section (info)->size);
if (frvfdpic_got_section (info)->contents == NULL)
- return FALSE;
+ return false;
}
if (frvfdpic_gotrel_section (info))
(bfd_byte *) bfd_zalloc (dynobj,
frvfdpic_gotrel_section (info)->size);
if (frvfdpic_gotrel_section (info)->contents == NULL)
- return FALSE;
+ return false;
}
frvfdpic_gotfixup_section (info)->size = (gpinfop->g.fixups + 1) * 4;
(bfd_byte *) bfd_zalloc (dynobj,
frvfdpic_gotfixup_section (info)->size);
if (frvfdpic_gotfixup_section (info)->contents == NULL)
- return FALSE;
+ return false;
}
if (frvfdpic_pltrel_section (info))
(bfd_byte *) bfd_zalloc (dynobj,
frvfdpic_pltrel_section (info)->size);
if (frvfdpic_pltrel_section (info)->contents == NULL)
- return FALSE;
+ return false;
}
}
(bfd_byte *) bfd_zalloc (dynobj,
frvfdpic_plt_section (info)->size);
if (frvfdpic_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_frvfdpic_size_dynamic_sections (bfd *output_bfd,
struct bfd_link_info *info)
{
frvfdpic_dynamic_got_plt_info (info) = bfd_alloc (dynobj, sizeof (gpinfo.g));
if (!_frvfdpic_size_got_plt (output_bfd, &gpinfo))
- return FALSE;
-
- if (elf_hash_table (info)->dynamic_sections_created)
- {
- if (frvfdpic_got_section (info)->size)
- if (!_bfd_elf_add_dynamic_entry (info, DT_PLTGOT, 0))
- return FALSE;
-
- if (frvfdpic_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 (frvfdpic_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;
- return TRUE;
+ return _bfd_elf_add_dynamic_tags (output_bfd, info, true);
}
-static bfd_boolean
+static bool
elf32_frvfdpic_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
_frvfdpic_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;
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);
rel->r_addend, NO_INSERT);
if (! picrel)
- return FALSE;
+ return false;
- *changed = TRUE;
+ *changed = true;
dinfo = frvfdpic_dynamic_got_plt_info (info);
- _frvfdpic_count_relocs_fixups (picrel, dinfo, TRUE);
+ _frvfdpic_count_relocs_fixups (picrel, dinfo, true);
if (ELF32_R_TYPE (rel->r_info) == R_FRV_32)
picrel->relocs32--;
else /* we know (ELF32_R_TYPE (rel->r_info) == R_FRV_FUNCDESC) */
picrel->relocsfd--;
- _frvfdpic_count_relocs_fixups (picrel, dinfo, FALSE);
+ _frvfdpic_count_relocs_fixups (picrel, dinfo, false);
}
- return TRUE;
+ return true;
}
-static bfd_boolean
+static bool
frvfdpic_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;
if (s->sec_info_type == SEC_INFO_TYPE_EH_FRAME)
{
if (!_frvfdpic_check_discarded_relocs (ibfd, s, info, &changed))
- return FALSE;
+ return false;
obfd = s->output_section->owner;
}
NULL);
if (!_frvfdpic_size_got_plt (obfd, &gpinfo))
- return FALSE;
+ return false;
}
- return TRUE;
+ return true;
}
/* Look for opportunities to relax TLS relocations. We can assume
struct frvfdpic_relocs_info *entry = *entryp;
struct _frvfdpic_dynamic_got_info *dinfo = dinfo_;
- _frvfdpic_relax_tls_entries (entry, dinfo, TRUE);
+ _frvfdpic_relax_tls_entries (entry, dinfo, true);
return 1;
}
-static bfd_boolean
+static bool
elf32_frvfdpic_relax_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec,
- struct bfd_link_info *info, bfd_boolean *again)
+ struct bfd_link_info *info, bool *again)
{
struct _frvfdpic_dynamic_got_plt_info gpinfo;
(_("%P%F: --relax and -r may not be used together\n"));
/* If we return early, we didn't change anything. */
- *again = FALSE;
+ *again = false;
/* We'll do our thing when requested to relax the GOT section. */
if (sec != frvfdpic_got_section (info))
- return TRUE;
+ return true;
/* We can only relax when linking the main executable or a library
that can't be dlopened. */
if (! bfd_link_executable (info) && ! (info->flags & DF_STATIC_TLS))
- return TRUE;
+ return true;
/* If there isn't a TLS section for this binary, we can't do
anything about its TLS relocations (it probably doesn't have
any. */
if (elf_hash_table (info)->tls_sec == NULL)
- return TRUE;
+ return true;
memset (&gpinfo, 0, sizeof (gpinfo));
memcpy (&gpinfo.g, frvfdpic_dynamic_got_plt_info (info), sizeof (gpinfo.g));
be a better way to get to it. */
if (!_frvfdpic_size_got_plt (elf_hash_table (info)->tls_sec->owner,
&gpinfo))
- return FALSE;
+ return false;
/* Repeat until we don't make any further changes. We could fail to
introduce changes in a round if, for example, the 12-bit range is
descriptors in it. We have to repeat the whole process because
we might have changed the size of a section processed before this
one. */
- *again = TRUE;
+ *again = true;
}
- return TRUE;
+ return true;
}
/* Fill in code and data in dynamic sections. */
-static bfd_boolean
+static bool
elf32_frv_finish_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
struct bfd_link_info *info ATTRIBUTE_UNUSED)
{
/* Nothing to be done for non-FDPIC. */
- return TRUE;
+ return true;
}
-static bfd_boolean
+static bool
elf32_frvfdpic_finish_dynamic_sections (bfd *output_bfd,
struct bfd_link_info *info)
{
error:
info->callbacks->einfo
("LINKER BUG: .rofixup section size mismatch\n");
- return FALSE;
+ return false;
}
hend = bfd_link_hash_lookup (info->hash, "__ROFIXUP_END__",
- FALSE, FALSE, TRUE);
+ false, false, true);
if (hend
&& (hend->type == bfd_link_hash_defined
|| hend->type == bfd_link_hash_defweak)
}
}
- return TRUE;
+ return true;
}
/* Adjust a symbol defined by a dynamic object and referenced by a
regular object. */
-static bfd_boolean
+static bool
elf32_frvfdpic_adjust_dynamic_symbol
(struct bfd_link_info *info ATTRIBUTE_UNUSED,
struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
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;
}
- return TRUE;
+ return true;
}
/* Perform any actions needed for dynamic symbols. */
-static bfd_boolean
+static bool
elf32_frvfdpic_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
frvfdpic_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. */
PLT entry should be faster), or taking hints from the compiler.
Given infinite time and money... :-) */
-static bfd_boolean
+static bool
elf32_frv_check_relocs (bfd *abfd,
struct bfd_link_info *info,
asection *sec,
struct frvfdpic_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);
{
elf_hash_table (info)->dynobj = dynobj = abfd;
if (! _frv_create_got_section (abfd, info))
- return FALSE;
+ return false;
}
if (! IS_FDPIC (abfd))
{
(info), abfd, r_symndx,
rel->r_addend, INSERT);
if (! picrel)
- return FALSE;
+ return false;
break;
default:
case R_FRV_FUNCDESC_VALUE:
picrel->relocsfdv++;
- if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
+ if (bfd_section_flags (sec) & SEC_ALLOC)
picrel->relocs32--;
/* Fall through. */
break;
picrel->sym = 1;
- if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
+ if (bfd_section_flags (sec) & SEC_ALLOC)
picrel->relocs32++;
break;
Reconstruct it for later use during GC. */
case R_FRV_GNU_VTINHERIT:
if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
- return FALSE;
+ return false;
break;
/* This relocation describes which C++ vtable entries are actually
used. Record for later use during GC. */
case R_FRV_GNU_VTENTRY:
if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
- return FALSE;
+ return false;
break;
case R_FRV_LABEL16:
/* xgettext:c-format */
_bfd_error_handler (_("%pB: unsupported relocation type %#x"),
abfd, (unsigned int) ELF32_R_TYPE (rel->r_info));
- return FALSE;
+ return false;
}
}
- return TRUE;
+ return true;
}
\f
/* Set the right machine number for a FRV ELF file. */
-static bfd_boolean
+static bool
elf32_frv_object_p (bfd *abfd)
{
bfd_default_set_arch_mach (abfd, bfd_arch_frv, elf32_frv_machine (abfd));
\f
/* Function to set the ELF flag bits. */
-static bfd_boolean
+static bool
frv_elf_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;
}
/* Return true if the architecture described by elf header flag
EXTENSION is an extension of the architecture described by BASE. */
-static bfd_boolean
+static bool
frv_elf_arch_extension_p (flagword base, flagword extension)
{
if (base == extension)
- return TRUE;
+ return true;
/* CPU_GENERIC code can be merged with code for a specific
architecture, in which case the result is marked as being
for the specific architecture. Everything is therefore
an extension of CPU_GENERIC. */
if (base == EF_FRV_CPU_GENERIC)
- return TRUE;
+ return true;
if (extension == EF_FRV_CPU_FR450)
if (base == EF_FRV_CPU_FR400 || base == EF_FRV_CPU_FR405)
- return TRUE;
+ return true;
if (extension == EF_FRV_CPU_FR405)
if (base == EF_FRV_CPU_FR400)
- return TRUE;
+ return true;
- return FALSE;
+ return false;
}
/* Merge backend specific data from an object file to the output
object file when linking. */
-static bfd_boolean
+static bool
frv_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
{
bfd *obfd = info->output_bfd;
flagword old_flags, old_partial;
flagword new_flags, new_partial;
- bfd_boolean error = FALSE;
+ bool error = false;
char new_opt[80];
char old_opt[80];
+ /* FIXME: What should be checked when linking shared libraries? */
+ if ((ibfd->flags & DYNAMIC) != 0)
+ return true;
+
new_opt[0] = old_opt[0] = '\0';
new_flags = elf_elfheader (ibfd)->e_flags;
old_flags = elf_elfheader (obfd)->e_flags;
if (!elf_flags_init (obfd)) /* First call, no flags set. */
{
- elf_flags_init (obfd) = TRUE;
+ elf_flags_init (obfd) = true;
old_flags = new_flags;
}
{
old_flags &= ~ EF_FRV_PIC_FLAGS;
#ifndef FRV_NO_PIC_ERROR
- error = TRUE;
+ error = true;
_bfd_error_handler
/* xgettext:c-format */
(_("%pB: compiled with %s and linked with modules"
/* Print out any mismatches from above. */
if (new_opt[0])
{
- error = TRUE;
+ error = true;
_bfd_error_handler
/* xgettext:c-format */
(_("%pB: compiled with %s and linked with modules compiled with %s"),
if (new_partial != old_partial)
{
old_flags |= new_partial;
- error = TRUE;
+ error = true;
_bfd_error_handler
/* xgettext:c-format */
(_("%pB: uses different unknown e_flags (%#x) fields"
if (((new_flags & EF_FRV_FDPIC) == 0)
!= (! IS_FDPIC (ibfd)))
{
- error = TRUE;
+ error = true;
if (IS_FDPIC (obfd))
_bfd_error_handler
(_("%pB: cannot link non-fdpic object file into fdpic executable"),
}
\f
-static bfd_boolean
+static bool
frv_elf_print_private_bfd_data (bfd *abfd, void * ptr)
{
FILE *file = (FILE *) ptr;
fprintf (file, " -G0");
fputc ('\n', file);
- return TRUE;
+ return true;
}
\f
/* Support for core dump NOTE sections. */
-static bfd_boolean
+static bool
elf32_frv_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
{
int offset;
switch (note->descsz)
{
default:
- return FALSE;
+ return false;
/* The Linux/FRV elf_prstatus struct is 268 bytes long. The other
hardcoded offsets and sizes listed below (and contained within
note->descpos + offset);
}
-static bfd_boolean
+static bool
elf32_frv_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
{
switch (note->descsz)
{
default:
- return FALSE;
+ return false;
/* The Linux/FRV elf_prpsinfo struct is 124 bytes long. */
case 124:
command[n - 1] = '\0';
}
- return TRUE;
+ return true;
}
#define ELF_ARCH bfd_arch_frv
#define ELF_MACHINE_CODE EM_CYGNUS_FRV
#define elf_backend_grok_prstatus elf32_frv_grok_prstatus
#define elf_backend_grok_psinfo elf32_frv_grok_psinfo
-#define elf_backend_linux_prpsinfo32_ugid16 TRUE
+#define elf_backend_linux_prpsinfo32_ugid16 true
#include "elf32-target.h"