| Index: bfd/elf32-ppc.c
|
| diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c
|
| index 18922dc02a54fad29a11957ba13cce54bc575ff8..3d0a2d939d6a7305c6796f5d9dfaf9871e2e8b49 100644
|
| --- a/bfd/elf32-ppc.c
|
| +++ b/bfd/elf32-ppc.c
|
| @@ -1,6 +1,6 @@
|
| /* PowerPC-specific support for 32-bit ELF
|
| Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
|
| - 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
|
| + 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
|
| Free Software Foundation, Inc.
|
| Written by Ian Lance Taylor, Cygnus Support.
|
|
|
| @@ -38,12 +38,21 @@
|
| #include "elf-vxworks.h"
|
| #include "dwarf2.h"
|
|
|
| +typedef enum split16_format_type
|
| +{
|
| + split16a_type = 0,
|
| + split16d_type
|
| +}
|
| +split16_format_type;
|
| +
|
| /* RELA relocations are used here. */
|
|
|
| static bfd_reloc_status_type ppc_elf_addr16_ha_reloc
|
| (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
|
| static bfd_reloc_status_type ppc_elf_unhandled_reloc
|
| (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
|
| +static void ppc_elf_vle_split16
|
| + (bfd *, bfd_byte *, bfd_vma, bfd_vma, split16_format_type);
|
|
|
| /* Branch prediction bit for branch taken relocs. */
|
| #define BRANCH_PREDICT_BIT 0x200000
|
| @@ -1392,6 +1401,262 @@ static reloc_howto_type ppc_elf_howto_raw[] = {
|
| 0xffff, /* dst_mask */
|
| FALSE), /* pcrel_offset */
|
|
|
| + /* A relative 8 bit branch. */
|
| + HOWTO (R_PPC_VLE_REL8, /* type */
|
| + 1, /* rightshift */
|
| + 1, /* size (0 = byte, 1 = short, 2 = long) */
|
| + 8, /* bitsize */
|
| + TRUE, /* pc_relative */
|
| + 0, /* bitpos */
|
| + complain_overflow_signed, /* complain_on_overflow */
|
| + bfd_elf_generic_reloc, /* special_function */
|
| + "R_PPC_VLE_REL8", /* name */
|
| + FALSE, /* partial_inplace */
|
| + 0, /* src_mask */
|
| + 0xff, /* dst_mask */
|
| + TRUE), /* pcrel_offset */
|
| +
|
| + /* A relative 15 bit branch. */
|
| + HOWTO (R_PPC_VLE_REL15, /* type */
|
| + 1, /* rightshift */
|
| + 2, /* size (0 = byte, 1 = short, 2 = long) */
|
| + 15, /* bitsize */
|
| + TRUE, /* pc_relative */
|
| + 1, /* bitpos */
|
| + complain_overflow_signed, /* complain_on_overflow */
|
| + bfd_elf_generic_reloc, /* special_function */
|
| + "R_PPC_VLE_REL15", /* name */
|
| + FALSE, /* partial_inplace */
|
| + 0, /* src_mask */
|
| + 0xfe, /* dst_mask */
|
| + TRUE), /* pcrel_offset */
|
| +
|
| + /* A relative 24 bit branch. */
|
| + HOWTO (R_PPC_VLE_REL24, /* type */
|
| + 1, /* rightshift */
|
| + 2, /* size (0 = byte, 1 = short, 2 = long) */
|
| + 24, /* bitsize */
|
| + TRUE, /* pc_relative */
|
| + 1, /* bitpos */
|
| + complain_overflow_signed, /* complain_on_overflow */
|
| + bfd_elf_generic_reloc, /* special_function */
|
| + "R_PPC_VLE_REL24", /* name */
|
| + FALSE, /* partial_inplace */
|
| + 0, /* src_mask */
|
| + 0x1fffffe, /* dst_mask */
|
| + TRUE), /* pcrel_offset */
|
| +
|
| + /* The 16 LSBS in split16a format. */
|
| + HOWTO (R_PPC_VLE_LO16A, /* type */
|
| + 0, /* rightshift */
|
| + 2, /* size (0 = byte, 1 = short, 2 = long) */
|
| + 32, /* bitsize */
|
| + FALSE, /* pc_relative */ /* FIXME: Does this apply to split relocs? */
|
| + 0, /* bitpos */
|
| + complain_overflow_bitfield, /* complain_on_overflow */
|
| + bfd_elf_generic_reloc, /* special_function */
|
| + "R_PPC_VLE_LO16A", /* name */
|
| + FALSE, /* partial_inplace */
|
| + 0, /* src_mask */
|
| + 0x1f00fff, /* dst_mask */
|
| + FALSE), /* pcrel_offset */
|
| +
|
| + /* The 16 LSBS in split16d format. */
|
| + HOWTO (R_PPC_VLE_LO16D, /* type */
|
| + 0, /* rightshift */
|
| + 2, /* size (0 = byte, 1 = short, 2 = long) */
|
| + 32, /* bitsize */
|
| + FALSE, /* pc_relative */
|
| + 0, /* bitpos */
|
| + complain_overflow_bitfield, /* complain_on_overflow */
|
| + bfd_elf_generic_reloc, /* special_function */
|
| + "R_PPC_VLE_LO16D", /* name */
|
| + FALSE, /* partial_inplace */
|
| + 0, /* src_mask */
|
| + 0x1f07ff, /* dst_mask */
|
| + FALSE), /* pcrel_offset */
|
| +
|
| + /* Bits 16-31 split16a format. */
|
| + HOWTO (R_PPC_VLE_HI16A, /* type */
|
| + 0, /* rightshift */
|
| + 2, /* size (0 = byte, 1 = short, 2 = long) */
|
| + 32, /* bitsize */
|
| + FALSE, /* pc_relative */
|
| + 0, /* bitpos */
|
| + complain_overflow_bitfield, /* complain_on_overflow */
|
| + bfd_elf_generic_reloc, /* special_function */
|
| + "R_PPC_VLE_HI16A", /* name */
|
| + FALSE, /* partial_inplace */
|
| + 0, /* src_mask */
|
| + 0x1f00fff, /* dst_mask */
|
| + FALSE), /* pcrel_offset */
|
| +
|
| + /* Bits 16-31 split16d format. */
|
| + HOWTO (R_PPC_VLE_HI16D, /* type */
|
| + 0, /* rightshift */
|
| + 2, /* size (0 = byte, 1 = short, 2 = long) */
|
| + 32, /* bitsize */
|
| + FALSE, /* pc_relative */
|
| + 0, /* bitpos */
|
| + complain_overflow_bitfield, /* complain_on_overflow */
|
| + bfd_elf_generic_reloc, /* special_function */
|
| + "R_PPC_VLE_HI16D", /* name */
|
| + FALSE, /* partial_inplace */
|
| + 0, /* src_mask */
|
| + 0x1f07ff, /* dst_mask */
|
| + FALSE), /* pcrel_offset */
|
| +
|
| + /* Bits 16-31 (High Adjusted) in split16a format. */
|
| + HOWTO (R_PPC_VLE_HA16A, /* type */
|
| + 0, /* rightshift */
|
| + 2, /* size (0 = byte, 1 = short, 2 = long) */
|
| + 32, /* bitsize */
|
| + FALSE, /* pc_relative */
|
| + 0, /* bitpos */
|
| + complain_overflow_bitfield, /* complain_on_overflow */
|
| + bfd_elf_generic_reloc, /* special_function */
|
| + "R_PPC_VLE_HA16A", /* name */
|
| + FALSE, /* partial_inplace */
|
| + 0, /* src_mask */
|
| + 0x1f00fff, /* dst_mask */
|
| + FALSE), /* pcrel_offset */
|
| +
|
| + /* Bits 16-31 (High Adjusted) in split16d format. */
|
| + HOWTO (R_PPC_VLE_HA16D, /* type */
|
| + 0, /* rightshift */
|
| + 2, /* size (0 = byte, 1 = short, 2 = long) */
|
| + 32, /* bitsize */
|
| + FALSE, /* pc_relative */
|
| + 0, /* bitpos */
|
| + complain_overflow_bitfield, /* complain_on_overflow */
|
| + bfd_elf_generic_reloc, /* special_function */
|
| + "R_PPC_VLE_HA16D", /* name */
|
| + FALSE, /* partial_inplace */
|
| + 0, /* src_mask */
|
| + 0x1f07ff, /* dst_mask */
|
| + FALSE), /* pcrel_offset */
|
| +
|
| + /* This reloc does nothing. */
|
| + HOWTO (R_PPC_VLE_SDA21, /* type */
|
| + 0, /* rightshift */
|
| + 2, /* size (0 = byte, 1 = short, 2 = long) */
|
| + 32, /* bitsize */
|
| + FALSE, /* pc_relative */
|
| + 0, /* bitpos */
|
| + complain_overflow_bitfield, /* complain_on_overflow */
|
| + bfd_elf_generic_reloc, /* special_function */
|
| + "R_PPC_VLE_SDA21", /* name */
|
| + FALSE, /* partial_inplace */
|
| + 0, /* src_mask */
|
| + 0xffff, /* dst_mask */
|
| + FALSE), /* pcrel_offset */
|
| +
|
| + /* This reloc does nothing. */
|
| + HOWTO (R_PPC_VLE_SDA21_LO, /* type */
|
| + 0, /* rightshift */
|
| + 2, /* size (0 = byte, 1 = short, 2 = long) */
|
| + 32, /* bitsize */
|
| + FALSE, /* pc_relative */
|
| + 0, /* bitpos */
|
| + complain_overflow_bitfield, /* complain_on_overflow */
|
| + bfd_elf_generic_reloc, /* special_function */
|
| + "R_PPC_VLE_SDA21_LO", /* name */
|
| + FALSE, /* partial_inplace */
|
| + 0, /* src_mask */
|
| + 0, /* dst_mask */
|
| + FALSE), /* pcrel_offset */
|
| +
|
| + /* The 16 LSBS relative to _SDA_BASE_ in split16a format. */
|
| + HOWTO (R_PPC_VLE_SDAREL_LO16A,/* type */
|
| + 0, /* rightshift */
|
| + 2, /* size (0 = byte, 1 = short, 2 = long) */
|
| + 32, /* bitsize */
|
| + FALSE, /* pc_relative */
|
| + 0, /* bitpos */
|
| + complain_overflow_bitfield, /* complain_on_overflow */
|
| + bfd_elf_generic_reloc, /* special_function */
|
| + "R_PPC_VLE_SDAREL_LO16A", /* name */
|
| + FALSE, /* partial_inplace */
|
| + 0, /* src_mask */
|
| + 0x1f00fff, /* dst_mask */
|
| + FALSE), /* pcrel_offset */
|
| +
|
| + /* The 16 LSBS relative to _SDA_BASE_ in split16d format. */
|
| + /* This reloc does nothing. */
|
| + HOWTO (R_PPC_VLE_SDAREL_LO16D, /* type */
|
| + 0, /* rightshift */
|
| + 2, /* size (0 = byte, 1 = short, 2 = long) */
|
| + 32, /* bitsize */
|
| + FALSE, /* pc_relative */
|
| + 0, /* bitpos */
|
| + complain_overflow_bitfield, /* complain_on_overflow */
|
| + bfd_elf_generic_reloc, /* special_function */
|
| + "R_PPC_VLE_SDAREL_LO16D", /* name */
|
| + FALSE, /* partial_inplace */
|
| + 0, /* src_mask */
|
| + 0x1f07ff, /* dst_mask */
|
| + FALSE), /* pcrel_offset */
|
| +
|
| + /* Bits 16-31 relative to _SDA_BASE_ in split16a format. */
|
| + HOWTO (R_PPC_VLE_SDAREL_HI16A, /* type */
|
| + 0, /* rightshift */
|
| + 2, /* size (0 = byte, 1 = short, 2 = long) */
|
| + 32, /* bitsize */
|
| + FALSE, /* pc_relative */
|
| + 0, /* bitpos */
|
| + complain_overflow_bitfield, /* complain_on_overflow */
|
| + bfd_elf_generic_reloc, /* special_function */
|
| + "R_PPC_VLE_SDAREL_HI16A", /* name */
|
| + FALSE, /* partial_inplace */
|
| + 0, /* src_mask */
|
| + 0x1f00fff, /* dst_mask */
|
| + FALSE), /* pcrel_offset */
|
| +
|
| + /* Bits 16-31 relative to _SDA_BASE_ in split16d format. */
|
| + HOWTO (R_PPC_VLE_SDAREL_HI16D, /* type */
|
| + 0, /* rightshift */
|
| + 2, /* size (0 = byte, 1 = short, 2 = long) */
|
| + 32, /* bitsize */
|
| + FALSE, /* pc_relative */
|
| + 0, /* bitpos */
|
| + complain_overflow_bitfield, /* complain_on_overflow */
|
| + bfd_elf_generic_reloc, /* special_function */
|
| + "R_PPC_VLE_SDAREL_HI16D", /* name */
|
| + FALSE, /* partial_inplace */
|
| + 0, /* src_mask */
|
| + 0x1f07ff, /* dst_mask */
|
| + FALSE), /* pcrel_offset */
|
| +
|
| + /* Bits 16-31 (HA) relative to _SDA_BASE split16a format. */
|
| + HOWTO (R_PPC_VLE_SDAREL_HA16A, /* type */
|
| + 0, /* rightshift */
|
| + 2, /* size (0 = byte, 1 = short, 2 = long) */
|
| + 32, /* bitsize */
|
| + FALSE, /* pc_relative */
|
| + 0, /* bitpos */
|
| + complain_overflow_bitfield, /* complain_on_overflow */
|
| + bfd_elf_generic_reloc, /* special_function */
|
| + "R_PPC_VLE_SDAREL_HA16A", /* name */
|
| + FALSE, /* partial_inplace */
|
| + 0, /* src_mask */
|
| + 0x1f00fff, /* dst_mask */
|
| + FALSE), /* pcrel_offset */
|
| +
|
| + /* Bits 16-31 (HA) relative to _SDA_BASE split16d format. */
|
| + HOWTO (R_PPC_VLE_SDAREL_HA16D, /* type */
|
| + 0, /* rightshift */
|
| + 2, /* size (0 = byte, 1 = short, 2 = long) */
|
| + 32, /* bitsize */
|
| + FALSE, /* pc_relative */
|
| + 0, /* bitpos */
|
| + complain_overflow_bitfield, /* complain_on_overflow */
|
| + bfd_elf_generic_reloc, /* special_function */
|
| + "R_PPC_VLE_SDAREL_HA16D", /* name */
|
| + FALSE, /* partial_inplace */
|
| + 0, /* src_mask */
|
| + 0x1f07ff, /* dst_mask */
|
| + FALSE), /* pcrel_offset */
|
| +
|
| HOWTO (R_PPC_IRELATIVE, /* type */
|
| 0, /* rightshift */
|
| 2, /* size (0 = byte, 1 = short, 2 = long) */
|
| @@ -1628,6 +1893,35 @@ ppc_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
|
| case BFD_RELOC_PPC_EMB_RELST_HA: r = R_PPC_EMB_RELST_HA; break;
|
| case BFD_RELOC_PPC_EMB_BIT_FLD: r = R_PPC_EMB_BIT_FLD; break;
|
| case BFD_RELOC_PPC_EMB_RELSDA: r = R_PPC_EMB_RELSDA; break;
|
| + case BFD_RELOC_PPC_VLE_REL8: r = R_PPC_VLE_REL8; break;
|
| + case BFD_RELOC_PPC_VLE_REL15: r = R_PPC_VLE_REL15; break;
|
| + case BFD_RELOC_PPC_VLE_REL24: r = R_PPC_VLE_REL24; break;
|
| + case BFD_RELOC_PPC_VLE_LO16A: r = R_PPC_VLE_LO16A; break;
|
| + case BFD_RELOC_PPC_VLE_LO16D: r = R_PPC_VLE_LO16D; break;
|
| + case BFD_RELOC_PPC_VLE_HI16A: r = R_PPC_VLE_HI16A; break;
|
| + case BFD_RELOC_PPC_VLE_HI16D: r = R_PPC_VLE_HI16D; break;
|
| + case BFD_RELOC_PPC_VLE_HA16A: r = R_PPC_VLE_HA16A; break;
|
| + case BFD_RELOC_PPC_VLE_HA16D: r = R_PPC_VLE_HA16D; break;
|
| + case BFD_RELOC_PPC_VLE_SDA21: r = R_PPC_VLE_SDA21; break;
|
| + case BFD_RELOC_PPC_VLE_SDA21_LO: r = R_PPC_VLE_SDA21_LO; break;
|
| + case BFD_RELOC_PPC_VLE_SDAREL_LO16A:
|
| + r = R_PPC_VLE_SDAREL_LO16A;
|
| + break;
|
| + case BFD_RELOC_PPC_VLE_SDAREL_LO16D:
|
| + r = R_PPC_VLE_SDAREL_LO16D;
|
| + break;
|
| + case BFD_RELOC_PPC_VLE_SDAREL_HI16A:
|
| + r = R_PPC_VLE_SDAREL_HI16A;
|
| + break;
|
| + case BFD_RELOC_PPC_VLE_SDAREL_HI16D:
|
| + r = R_PPC_VLE_SDAREL_HI16D;
|
| + break;
|
| + case BFD_RELOC_PPC_VLE_SDAREL_HA16A:
|
| + r = R_PPC_VLE_SDAREL_HA16A;
|
| + break;
|
| + case BFD_RELOC_PPC_VLE_SDAREL_HA16D:
|
| + r = R_PPC_VLE_SDAREL_HA16D;
|
| + break;
|
| case BFD_RELOC_16_PCREL: r = R_PPC_REL16; break;
|
| case BFD_RELOC_LO16_PCREL: r = R_PPC_REL16_LO; break;
|
| case BFD_RELOC_HI16_PCREL: r = R_PPC_REL16_HI; break;
|
| @@ -1920,7 +2214,7 @@ ppc_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type, ...)
|
| va_list ap;
|
|
|
| va_start (ap, note_type);
|
| - memset (data, 0, 32);
|
| + memset (data, 0, sizeof (data));
|
| strncpy (data + 32, va_arg (ap, const char *), 16);
|
| strncpy (data + 48, va_arg (ap, const char *), 80);
|
| va_end (ap);
|
| @@ -1952,6 +2246,28 @@ ppc_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type, ...)
|
| }
|
| }
|
|
|
| +static flagword
|
| +ppc_elf_lookup_section_flags (char *flag_name)
|
| +{
|
| +
|
| + if (!strcmp (flag_name, "SHF_PPC_VLE"))
|
| + return SHF_PPC_VLE;
|
| +
|
| + return 0;
|
| +}
|
| +
|
| +/* Add the VLE flag if required. */
|
| +
|
| +bfd_boolean
|
| +ppc_elf_section_processing (bfd *abfd, Elf_Internal_Shdr *shdr)
|
| +{
|
| + if (bfd_get_mach (abfd) == bfd_mach_ppc_vle
|
| + && (shdr->sh_flags & SHF_EXECINSTR) != 0)
|
| + shdr->sh_flags |= SHF_PPC_VLE;
|
| +
|
| + return TRUE;
|
| +}
|
| +
|
| /* Return address for Ith PLT stub in section PLT, for relocation REL
|
| or (bfd_vma) -1 if it should not be included. */
|
|
|
| @@ -2025,6 +2341,70 @@ ppc_elf_additional_program_headers (bfd *abfd,
|
| return ret;
|
| }
|
|
|
| +/* Modify the segment map for VLE executables. */
|
| +
|
| +bfd_boolean
|
| +ppc_elf_modify_segment_map (bfd *abfd,
|
| + struct bfd_link_info *info ATTRIBUTE_UNUSED)
|
| +{
|
| + struct elf_segment_map *m, *n;
|
| + bfd_size_type amt;
|
| + unsigned int j, k;
|
| + bfd_boolean sect0_vle, sectj_vle;
|
| +
|
| + /* At this point in the link, output sections have already been sorted by
|
| + LMA and assigned to segments. All that is left to do is to ensure
|
| + there is no mixing of VLE & non-VLE sections in a text segment.
|
| + If we find that case, we split the segment.
|
| + We maintain the original output section order. */
|
| +
|
| + for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
|
| + {
|
| + if (m->count == 0)
|
| + continue;
|
| +
|
| + sect0_vle = (elf_section_flags (m->sections[0]) & SHF_PPC_VLE) != 0;
|
| + for (j = 1; j < m->count; ++j)
|
| + {
|
| + sectj_vle = (elf_section_flags (m->sections[j]) & SHF_PPC_VLE) != 0;
|
| +
|
| + if (sectj_vle != sect0_vle)
|
| + break;
|
| + }
|
| + if (j >= m->count)
|
| + continue;
|
| +
|
| + /* sections 0..j-1 stay in this (current) segment,
|
| + the remainder are put in a new segment.
|
| + The scan resumes with the new segment. */
|
| +
|
| + /* Fix the new segment. */
|
| + amt = sizeof (struct elf_segment_map);
|
| + amt += (m->count - j - 1) * sizeof (asection *);
|
| + n = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
|
| + if (n == NULL)
|
| + return FALSE;
|
| +
|
| + n->p_type = PT_LOAD;
|
| + n->p_flags = PF_X | PF_R;
|
| + if (sectj_vle)
|
| + n->p_flags |= PF_PPC_VLE;
|
| + n->count = m->count - j;
|
| + for (k = 0; k < n->count; ++k)
|
| + {
|
| + n->sections[k] = m->sections[j+k];
|
| + m->sections[j+k] = NULL;
|
| + }
|
| + n->next = m->next;
|
| + m->next = n;
|
| +
|
| + /* Fix the current segment */
|
| + m->count = j;
|
| + }
|
| +
|
| + return TRUE;
|
| +}
|
| +
|
| /* Add extra PPC sections -- Note, for now, make .sbss2 and
|
| .PPC.EMB.sbss0 a normal section, and not a bss section so
|
| that the linker doesn't crater when trying to make more than
|
| @@ -2732,7 +3112,7 @@ struct ppc_elf_link_hash_table
|
| };
|
|
|
| /* Rename some of the generic section flags to better document how they
|
| - are used here. */
|
| + are used for ppc32. The flags are only valid for ppc32 elf objects. */
|
|
|
| /* Nonzero if this section has TLS related relocations. */
|
| #define has_tls_reloc sec_flg0
|
| @@ -2829,13 +3209,13 @@ ppc_elf_create_got (bfd *abfd, struct bfd_link_info *info)
|
| return FALSE;
|
|
|
| htab = ppc_elf_hash_table (info);
|
| - htab->got = s = bfd_get_section_by_name (abfd, ".got");
|
| + htab->got = s = bfd_get_linker_section (abfd, ".got");
|
| if (s == NULL)
|
| abort ();
|
|
|
| if (htab->is_vxworks)
|
| {
|
| - htab->sgotplt = bfd_get_section_by_name (abfd, ".got.plt");
|
| + htab->sgotplt = bfd_get_linker_section (abfd, ".got.plt");
|
| if (!htab->sgotplt)
|
| abort ();
|
| }
|
| @@ -2849,7 +3229,7 @@ ppc_elf_create_got (bfd *abfd, struct bfd_link_info *info)
|
| return FALSE;
|
| }
|
|
|
| - htab->relgot = bfd_get_section_by_name (abfd, ".rela.got");
|
| + htab->relgot = bfd_get_linker_section (abfd, ".rela.got");
|
| if (!htab->relgot)
|
| abort ();
|
|
|
| @@ -2923,7 +3303,7 @@ ppc_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
|
| && !ppc_elf_create_glink (abfd, info))
|
| return FALSE;
|
|
|
| - htab->dynbss = bfd_get_section_by_name (abfd, ".dynbss");
|
| + htab->dynbss = bfd_get_linker_section (abfd, ".dynbss");
|
| s = bfd_make_section_anyway_with_flags (abfd, ".dynsbss",
|
| SEC_ALLOC | SEC_LINKER_CREATED);
|
| htab->dynsbss = s;
|
| @@ -2932,7 +3312,7 @@ ppc_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
|
|
|
| if (! info->shared)
|
| {
|
| - htab->relbss = bfd_get_section_by_name (abfd, ".rela.bss");
|
| + htab->relbss = bfd_get_linker_section (abfd, ".rela.bss");
|
| flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS
|
| | SEC_IN_MEMORY | SEC_LINKER_CREATED);
|
| s = bfd_make_section_anyway_with_flags (abfd, ".rela.sbss", flags);
|
| @@ -2946,8 +3326,8 @@ ppc_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
|
| && !elf_vxworks_create_dynamic_sections (abfd, info, &htab->srelplt2))
|
| return FALSE;
|
|
|
| - htab->relplt = bfd_get_section_by_name (abfd, ".rela.plt");
|
| - htab->plt = s = bfd_get_section_by_name (abfd, ".plt");
|
| + htab->relplt = bfd_get_linker_section (abfd, ".rela.plt");
|
| + htab->plt = s = bfd_get_linker_section (abfd, ".plt");
|
| if (s == NULL)
|
| abort ();
|
|
|
| @@ -3620,10 +4000,21 @@ ppc_elf_check_relocs (bfd *abfd,
|
| }
|
| break;
|
|
|
| + case R_PPC_VLE_SDAREL_LO16A:
|
| + case R_PPC_VLE_SDAREL_LO16D:
|
| + case R_PPC_VLE_SDAREL_HI16A:
|
| + case R_PPC_VLE_SDAREL_HI16D:
|
| + case R_PPC_VLE_SDAREL_HA16A:
|
| + case R_PPC_VLE_SDAREL_HA16D:
|
| case R_PPC_SDAREL16:
|
| if (htab->sdata[0].sym == NULL
|
| && !create_sdata_sym (info, &htab->sdata[0]))
|
| return FALSE;
|
| +
|
| + if (htab->sdata[1].sym == NULL
|
| + && !create_sdata_sym (info, &htab->sdata[1]))
|
| + return FALSE;
|
| +
|
| if (h != NULL)
|
| {
|
| ppc_elf_hash_entry (h)->has_sda_refs = TRUE;
|
| @@ -3631,6 +4022,17 @@ ppc_elf_check_relocs (bfd *abfd,
|
| }
|
| break;
|
|
|
| + case R_PPC_VLE_REL8:
|
| + case R_PPC_VLE_REL15:
|
| + case R_PPC_VLE_REL24:
|
| + case R_PPC_VLE_LO16A:
|
| + case R_PPC_VLE_LO16D:
|
| + case R_PPC_VLE_HI16A:
|
| + case R_PPC_VLE_HI16D:
|
| + case R_PPC_VLE_HA16A:
|
| + case R_PPC_VLE_HA16D:
|
| + break;
|
| +
|
| case R_PPC_EMB_SDA2REL:
|
| if (info->shared)
|
| {
|
| @@ -3647,6 +4049,8 @@ ppc_elf_check_relocs (bfd *abfd,
|
| }
|
| break;
|
|
|
| + case R_PPC_VLE_SDA21_LO:
|
| + case R_PPC_VLE_SDA21:
|
| case R_PPC_EMB_SDA21:
|
| case R_PPC_EMB_RELSDA:
|
| if (info->shared)
|
| @@ -4244,6 +4648,24 @@ ppc_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
|
|
|
| return TRUE;
|
| }
|
| +
|
| +static void
|
| +ppc_elf_vle_split16 (bfd *output_bfd, bfd_byte *contents,
|
| + bfd_vma offset, bfd_vma relocation,
|
| + split16_format_type split16_format)
|
| +
|
| +{
|
| + bfd_vma insn, top5, bottom11;
|
| +
|
| + insn = bfd_get_32 (output_bfd, contents + offset);
|
| + top5 = relocation >> 11;
|
| + top5 = top5 << (split16_format == split16a_type ? 20 : 16);
|
| + bottom11 = relocation & 0x7ff;
|
| + insn |= top5;
|
| + insn |= bottom11;
|
| + bfd_put_32 (output_bfd, insn, contents + offset);
|
| +}
|
| +
|
|
|
| /* Choose which PLT scheme to use, and set .plt flags appropriately.
|
| Returns -1 on error, 0 for old PLT, 1 for new PLT. */
|
| @@ -5045,13 +5467,6 @@ ppc_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
| return TRUE;
|
| }
|
|
|
| - if (h->size == 0)
|
| - {
|
| - info->callbacks->einfo (_("%P: dynamic variable `%s' is zero size\n"),
|
| - h->root.root.string);
|
| - return TRUE;
|
| - }
|
| -
|
| /* We must allocate the symbol in our .dynbss section, which will
|
| become part of the .bss section of the executable. There will be
|
| an entry for this symbol in the .dynsym section. The dynamic
|
| @@ -5075,7 +5490,7 @@ ppc_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
|
| copy the initial value out of the dynamic object and into the
|
| runtime process image. We need to remember the offset into the
|
| .rela.bss section we are going to use. */
|
| - if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
|
| + if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
|
| {
|
| asection *srel;
|
|
|
| @@ -5589,7 +6004,7 @@ ppc_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
|
| /* Set the contents of the .interp section to the interpreter. */
|
| if (info->executable)
|
| {
|
| - s = bfd_get_section_by_name (htab->elf.dynobj, ".interp");
|
| + s = bfd_get_linker_section (htab->elf.dynobj, ".interp");
|
| BFD_ASSERT (s != NULL);
|
| s->size = sizeof ELF_DYNAMIC_INTERPRETER;
|
| s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
|
| @@ -5829,7 +6244,8 @@ ppc_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
|
| if (htab->glink != NULL
|
| && htab->glink->size != 0
|
| && htab->glink_eh_frame != NULL
|
| - && !bfd_is_abs_section (htab->glink_eh_frame->output_section))
|
| + && !bfd_is_abs_section (htab->glink_eh_frame->output_section)
|
| + && _bfd_elf_eh_frame_present (info))
|
| {
|
| s = htab->glink_eh_frame;
|
| s->size = sizeof (glink_eh_frame_cie) + 20;
|
| @@ -5874,7 +6290,8 @@ ppc_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
|
| {
|
| /* Strip these too. */
|
| }
|
| - else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
|
| + else if (CONST_STRNEQ (bfd_get_section_name (htab->elf.dynobj, s),
|
| + ".rela"))
|
| {
|
| if (s->size != 0)
|
| {
|
| @@ -5977,6 +6394,66 @@ ppc_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
|
| }
|
| #undef add_dynamic_entry
|
|
|
| + if (htab->glink_eh_frame != NULL
|
| + && htab->glink_eh_frame->contents != NULL)
|
| + {
|
| + unsigned char *p = htab->glink_eh_frame->contents;
|
| + bfd_vma val;
|
| +
|
| + memcpy (p, glink_eh_frame_cie, sizeof (glink_eh_frame_cie));
|
| + /* CIE length (rewrite in case little-endian). */
|
| + bfd_put_32 (htab->elf.dynobj, sizeof (glink_eh_frame_cie) - 4, p);
|
| + p += sizeof (glink_eh_frame_cie);
|
| + /* FDE length. */
|
| + val = htab->glink_eh_frame->size - 4 - sizeof (glink_eh_frame_cie);
|
| + bfd_put_32 (htab->elf.dynobj, val, p);
|
| + p += 4;
|
| + /* CIE pointer. */
|
| + val = p - htab->glink_eh_frame->contents;
|
| + bfd_put_32 (htab->elf.dynobj, val, p);
|
| + p += 4;
|
| + /* Offset to .glink. Set later. */
|
| + p += 4;
|
| + /* .glink size. */
|
| + bfd_put_32 (htab->elf.dynobj, htab->glink->size, p);
|
| + p += 4;
|
| + /* Augmentation. */
|
| + p += 1;
|
| +
|
| + if (info->shared
|
| + && htab->elf.dynamic_sections_created)
|
| + {
|
| + bfd_vma adv = (htab->glink->size - GLINK_PLTRESOLVE + 8) >> 2;
|
| + if (adv < 64)
|
| + *p++ = DW_CFA_advance_loc + adv;
|
| + else if (adv < 256)
|
| + {
|
| + *p++ = DW_CFA_advance_loc1;
|
| + *p++ = adv;
|
| + }
|
| + else if (adv < 65536)
|
| + {
|
| + *p++ = DW_CFA_advance_loc2;
|
| + bfd_put_16 (htab->elf.dynobj, adv, p);
|
| + p += 2;
|
| + }
|
| + else
|
| + {
|
| + *p++ = DW_CFA_advance_loc4;
|
| + bfd_put_32 (htab->elf.dynobj, adv, p);
|
| + p += 4;
|
| + }
|
| + *p++ = DW_CFA_register;
|
| + *p++ = 65;
|
| + p++;
|
| + *p++ = DW_CFA_advance_loc + 4;
|
| + *p++ = DW_CFA_restore_extended;
|
| + *p++ = 65;
|
| + }
|
| + BFD_ASSERT ((bfd_vma) ((p + 3 - htab->glink_eh_frame->contents) & -4)
|
| + == htab->glink_eh_frame->size);
|
| + }
|
| +
|
| return TRUE;
|
| }
|
|
|
| @@ -6231,7 +6708,7 @@ ppc_elf_relax_section (bfd *abfd,
|
| attribute for a code section, and we are only looking at
|
| branches. However, implement it correctly here as a
|
| reference for other target relax_section functions. */
|
| - if (0 && tsec->sec_info_type == ELF_INFO_TYPE_MERGE)
|
| + if (0 && tsec->sec_info_type == SEC_INFO_TYPE_MERGE)
|
| {
|
| /* At this stage in linking, no SEC_MERGE symbol has been
|
| adjusted, so all references to such symbols need to be
|
| @@ -6886,7 +7363,7 @@ ppc_elf_relocate_section (bfd *output_bfd,
|
| sym_name = h->root.root.string;
|
| }
|
|
|
| - if (sec != NULL && elf_discarded_section (sec))
|
| + if (sec != NULL && discarded_section (sec))
|
| {
|
| /* For relocs against symbols from removed linkonce sections,
|
| or sections discarded by a linker script, we just want the
|
| @@ -6895,7 +7372,7 @@ ppc_elf_relocate_section (bfd *output_bfd,
|
| if (r_type < R_PPC_max)
|
| howto = ppc_elf_howto_table[r_type];
|
| RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
|
| - rel, relend, howto, contents);
|
| + rel, 1, relend, howto, 0, contents);
|
| }
|
|
|
| if (info->relocatable)
|
| @@ -7618,6 +8095,9 @@ ppc_elf_relocate_section (bfd *output_bfd,
|
| case R_PPC_UADDR16:
|
| goto dodyn;
|
|
|
| + case R_PPC_VLE_REL8:
|
| + case R_PPC_VLE_REL15:
|
| + case R_PPC_VLE_REL24:
|
| case R_PPC_REL24:
|
| case R_PPC_REL14:
|
| case R_PPC_REL14_BRTAKEN:
|
| @@ -7893,8 +8373,10 @@ ppc_elf_relocate_section (bfd *output_bfd,
|
| unresolved_reloc = TRUE;
|
| break;
|
| }
|
| - BFD_ASSERT (strcmp (bfd_get_section_name (abfd, sec), ".got") == 0
|
| - || strcmp (bfd_get_section_name (abfd, sec), ".cgot") == 0);
|
| + BFD_ASSERT (strcmp (bfd_get_section_name (sec->owner, sec),
|
| + ".got") == 0
|
| + || strcmp (bfd_get_section_name (sec->owner, sec),
|
| + ".cgot") == 0);
|
|
|
| addend -= sec->output_section->vma + sec->output_offset + 0x8000;
|
| break;
|
| @@ -7944,7 +8426,7 @@ ppc_elf_relocate_section (bfd *output_bfd,
|
| }
|
| addend -= SYM_VAL (sda);
|
|
|
| - name = bfd_get_section_name (abfd, sec->output_section);
|
| + name = bfd_get_section_name (output_bfd, sec->output_section);
|
| if (! ((CONST_STRNEQ (name, ".sdata")
|
| && (name[6] == 0 || name[6] == '.'))
|
| || (CONST_STRNEQ (name, ".sbss")
|
| @@ -7976,7 +8458,7 @@ ppc_elf_relocate_section (bfd *output_bfd,
|
| }
|
| addend -= SYM_VAL (sda);
|
|
|
| - name = bfd_get_section_name (abfd, sec->output_section);
|
| + name = bfd_get_section_name (output_bfd, sec->output_section);
|
| if (! (CONST_STRNEQ (name, ".sdata2")
|
| || CONST_STRNEQ (name, ".sbss2")))
|
| {
|
| @@ -7991,9 +8473,53 @@ ppc_elf_relocate_section (bfd *output_bfd,
|
| }
|
| break;
|
|
|
| + case R_PPC_VLE_LO16A:
|
| + relocation = (relocation + addend) & 0xffff;
|
| + ppc_elf_vle_split16 (output_bfd, contents, rel->r_offset,
|
| + relocation, split16a_type);
|
| + continue;
|
| +
|
| + case R_PPC_VLE_LO16D:
|
| + relocation = (relocation + addend) & 0xffff;
|
| + ppc_elf_vle_split16 (output_bfd, contents, rel->r_offset,
|
| + relocation, split16d_type);
|
| + continue;
|
| +
|
| + case R_PPC_VLE_HI16A:
|
| + relocation = ((relocation + addend) >> 16) & 0xffff;
|
| + ppc_elf_vle_split16 (output_bfd, contents, rel->r_offset,
|
| + relocation, split16a_type);
|
| + continue;
|
| +
|
| + case R_PPC_VLE_HI16D:
|
| + relocation = ((relocation + addend) >> 16) & 0xffff;
|
| + ppc_elf_vle_split16 (output_bfd, contents, rel->r_offset,
|
| + relocation, split16d_type);
|
| + continue;
|
| +
|
| + case R_PPC_VLE_HA16A:
|
| + {
|
| + bfd_vma value = relocation + addend;
|
| + value = (((value >> 16) + ((value & 0x8000) ? 1 : 0)) & 0xffff);
|
| + ppc_elf_vle_split16 (output_bfd, contents, rel->r_offset,
|
| + value, split16a_type);
|
| + }
|
| + continue;
|
| +
|
| + case R_PPC_VLE_HA16D:
|
| + {
|
| + bfd_vma value = relocation + addend;
|
| + value = (((value >> 16) + ((value & 0x8000) ? 1 : 0)) & 0xffff);
|
| + ppc_elf_vle_split16 (output_bfd, contents, rel->r_offset,
|
| + value, split16d_type);
|
| + }
|
| + continue;
|
| +
|
| /* Relocate against either _SDA_BASE_, _SDA2_BASE_, or 0. */
|
| case R_PPC_EMB_SDA21:
|
| + case R_PPC_VLE_SDA21:
|
| case R_PPC_EMB_RELSDA:
|
| + case R_PPC_VLE_SDA21_LO:
|
| {
|
| const char *name;
|
| int reg;
|
| @@ -8005,7 +8531,7 @@ ppc_elf_relocate_section (bfd *output_bfd,
|
| break;
|
| }
|
|
|
| - name = bfd_get_section_name (abfd, sec->output_section);
|
| + name = bfd_get_section_name (output_bfd, sec->output_section);
|
| if (((CONST_STRNEQ (name, ".sdata")
|
| && (name[6] == 0 || name[6] == '.'))
|
| || (CONST_STRNEQ (name, ".sbss")
|
| @@ -8050,7 +8576,25 @@ ppc_elf_relocate_section (bfd *output_bfd,
|
| addend -= SYM_VAL (sda);
|
| }
|
|
|
| - if (r_type == R_PPC_EMB_SDA21)
|
| + if (reg == 0
|
| + && (r_type == R_PPC_VLE_SDA21
|
| + || r_type == R_PPC_VLE_SDA21_LO))
|
| + {
|
| + /* Use the split20 format. */
|
| + bfd_vma insn, bits12to15, bits21to31;
|
| + bfd_vma value = (relocation + rel->r_offset) & 0xffff;
|
| + /* Propagate sign bit, if necessary. */
|
| + insn = (value & 0x8000) ? 0x70107800 : 0x70000000;
|
| + bits12to15 = value & 0x700;
|
| + bits21to31 = value & 0x7ff;
|
| + insn |= bits12to15;
|
| + insn |= bits21to31;
|
| + bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
|
| + continue;
|
| + }
|
| + else if (r_type == R_PPC_EMB_SDA21
|
| + || r_type == R_PPC_VLE_SDA21
|
| + || r_type == R_PPC_VLE_SDA21_LO)
|
| {
|
| bfd_vma insn; /* Fill in register field. */
|
|
|
| @@ -8061,6 +8605,107 @@ ppc_elf_relocate_section (bfd *output_bfd,
|
| }
|
| break;
|
|
|
| + case R_PPC_VLE_SDAREL_LO16A:
|
| + case R_PPC_VLE_SDAREL_LO16D:
|
| + case R_PPC_VLE_SDAREL_HI16A:
|
| + case R_PPC_VLE_SDAREL_HI16D:
|
| + case R_PPC_VLE_SDAREL_HA16A:
|
| + case R_PPC_VLE_SDAREL_HA16D:
|
| + {
|
| + bfd_vma value;
|
| + const char *name;
|
| + //int reg;
|
| + struct elf_link_hash_entry *sda = NULL;
|
| +
|
| + if (sec == NULL || sec->output_section == NULL)
|
| + {
|
| + unresolved_reloc = TRUE;
|
| + break;
|
| + }
|
| +
|
| + name = bfd_get_section_name (output_bfd, sec->output_section);
|
| + if (((CONST_STRNEQ (name, ".sdata")
|
| + && (name[6] == 0 || name[6] == '.'))
|
| + || (CONST_STRNEQ (name, ".sbss")
|
| + && (name[5] == 0 || name[5] == '.'))))
|
| + {
|
| + //reg = 13;
|
| + sda = htab->sdata[0].sym;
|
| + }
|
| + else if (CONST_STRNEQ (name, ".sdata2")
|
| + || CONST_STRNEQ (name, ".sbss2"))
|
| + {
|
| + //reg = 2;
|
| + sda = htab->sdata[1].sym;
|
| + }
|
| + else
|
| + {
|
| + (*_bfd_error_handler)
|
| + (_("%B: the target (%s) of a %s relocation is "
|
| + "in the wrong output section (%s)"),
|
| + input_bfd,
|
| + sym_name,
|
| + howto->name,
|
| + name);
|
| +
|
| + bfd_set_error (bfd_error_bad_value);
|
| + ret = FALSE;
|
| + continue;
|
| + }
|
| +
|
| + if (sda != NULL)
|
| + {
|
| + if (!is_static_defined (sda))
|
| + {
|
| + unresolved_reloc = TRUE;
|
| + break;
|
| + }
|
| + }
|
| +
|
| + value = sda->root.u.def.section->output_section->vma
|
| + + sda->root.u.def.section->output_offset;
|
| +
|
| + if (r_type == R_PPC_VLE_SDAREL_LO16A)
|
| + {
|
| + value = (value + addend) & 0xffff;
|
| + ppc_elf_vle_split16 (output_bfd, contents, rel->r_offset,
|
| + value, split16a_type);
|
| + }
|
| + else if (r_type == R_PPC_VLE_SDAREL_LO16D)
|
| + {
|
| + value = (value + addend) & 0xffff;
|
| + ppc_elf_vle_split16 (output_bfd, contents, rel->r_offset,
|
| + value, split16d_type);
|
| + }
|
| + else if (r_type == R_PPC_VLE_SDAREL_HI16A)
|
| + {
|
| + value = ((value + addend) >> 16) & 0xffff;
|
| + ppc_elf_vle_split16 (output_bfd, contents, rel->r_offset,
|
| + value, split16a_type);
|
| + }
|
| + else if (r_type == R_PPC_VLE_SDAREL_HI16D)
|
| + {
|
| + value = ((value + addend) >> 16) & 0xffff;
|
| + ppc_elf_vle_split16 (output_bfd, contents, rel->r_offset,
|
| + value, split16d_type);
|
| + }
|
| + else if (r_type == R_PPC_VLE_SDAREL_HA16A)
|
| + {
|
| + value += addend;
|
| + value = (((value >> 16) + ((value & 0x8000) ? 1 : 0)) & 0xffff);
|
| + ppc_elf_vle_split16 (output_bfd, contents, rel->r_offset,
|
| + value, split16a_type);
|
| + }
|
| + else if (r_type == R_PPC_VLE_SDAREL_HA16D)
|
| + {
|
| + value += addend;
|
| + value = (((value >> 16) + ((value & 0x8000) ? 1 : 0)) & 0xffff);
|
| + ppc_elf_vle_split16 (output_bfd, contents, rel->r_offset,
|
| + value, split16d_type);
|
| + }
|
| + }
|
| + continue;
|
| +
|
| /* Relocate against the beginning of the section. */
|
| case R_PPC_SECTOFF:
|
| case R_PPC_SECTOFF_LO:
|
| @@ -8555,14 +9200,6 @@ ppc_elf_finish_dynamic_symbol (bfd *output_bfd,
|
| fprintf (stderr, "\n");
|
| #endif
|
|
|
| - /* Mark some specially defined symbols as absolute. */
|
| - if (strcmp (h->root.root.string, "_DYNAMIC") == 0
|
| - || (!htab->is_vxworks
|
| - && (h == htab->elf.hgot
|
| - || strcmp (h->root.root.string,
|
| - "_PROCEDURE_LINKAGE_TABLE_") == 0)))
|
| - sym->st_shndx = SHN_ABS;
|
| -
|
| return TRUE;
|
| }
|
|
|
| @@ -8603,9 +9240,9 @@ ppc_elf_finish_dynamic_sections (bfd *output_bfd,
|
|
|
| htab = ppc_elf_hash_table (info);
|
| dynobj = elf_hash_table (info)->dynobj;
|
| - sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
|
| + sdyn = bfd_get_linker_section (dynobj, ".dynamic");
|
| if (htab->is_vxworks)
|
| - splt = bfd_get_section_by_name (dynobj, ".plt");
|
| + splt = bfd_get_linker_section (dynobj, ".plt");
|
| else
|
| splt = NULL;
|
|
|
| @@ -8997,17 +9634,10 @@ ppc_elf_finish_dynamic_sections (bfd *output_bfd,
|
| unsigned char *p = htab->glink_eh_frame->contents;
|
| bfd_vma val;
|
|
|
| - memcpy (p, glink_eh_frame_cie, sizeof (glink_eh_frame_cie));
|
| - /* CIE length (rewrite in case little-endian). */
|
| - bfd_put_32 (htab->elf.dynobj, sizeof (glink_eh_frame_cie) - 4, p);
|
| p += sizeof (glink_eh_frame_cie);
|
| /* FDE length. */
|
| - val = htab->glink_eh_frame->size - 4 - sizeof (glink_eh_frame_cie);
|
| - bfd_put_32 (htab->elf.dynobj, val, p);
|
| p += 4;
|
| /* CIE pointer. */
|
| - val = p - htab->glink_eh_frame->contents;
|
| - bfd_put_32 (htab->elf.dynobj, val, p);
|
| p += 4;
|
| /* Offset to .glink. */
|
| val = (htab->glink->output_section->vma
|
| @@ -9016,47 +9646,8 @@ ppc_elf_finish_dynamic_sections (bfd *output_bfd,
|
| + htab->glink_eh_frame->output_offset);
|
| val -= p - htab->glink_eh_frame->contents;
|
| bfd_put_32 (htab->elf.dynobj, val, p);
|
| - p += 4;
|
| - /* .glink size. */
|
| - bfd_put_32 (htab->elf.dynobj, htab->glink->size, p);
|
| - p += 4;
|
| - /* Augmentation. */
|
| - p += 1;
|
| -
|
| - if (info->shared
|
| - && htab->elf.dynamic_sections_created)
|
| - {
|
| - bfd_vma adv = (htab->glink->size - GLINK_PLTRESOLVE + 8) >> 2;
|
| - if (adv < 64)
|
| - *p++ = DW_CFA_advance_loc + adv;
|
| - else if (adv < 256)
|
| - {
|
| - *p++ = DW_CFA_advance_loc1;
|
| - *p++ = adv;
|
| - }
|
| - else if (adv < 65536)
|
| - {
|
| - *p++ = DW_CFA_advance_loc2;
|
| - bfd_put_16 (htab->elf.dynobj, adv, p);
|
| - p += 2;
|
| - }
|
| - else
|
| - {
|
| - *p++ = DW_CFA_advance_loc4;
|
| - bfd_put_32 (htab->elf.dynobj, adv, p);
|
| - p += 4;
|
| - }
|
| - *p++ = DW_CFA_register;
|
| - *p++ = 65;
|
| - p++;
|
| - *p++ = DW_CFA_advance_loc + 4;
|
| - *p++ = DW_CFA_restore_extended;
|
| - *p++ = 65;
|
| - }
|
| - BFD_ASSERT ((bfd_vma) ((p + 3 - htab->glink_eh_frame->contents) & -4)
|
| - == htab->glink_eh_frame->size);
|
|
|
| - if (htab->glink_eh_frame->sec_info_type == ELF_INFO_TYPE_EH_FRAME
|
| + if (htab->glink_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME
|
| && !_bfd_elf_write_section_eh_frame (output_bfd, info,
|
| htab->glink_eh_frame,
|
| htab->glink_eh_frame->contents))
|
| @@ -9099,7 +9690,7 @@ ppc_elf_finish_dynamic_sections (bfd *output_bfd,
|
| #define bfd_elf32_bfd_merge_private_bfd_data ppc_elf_merge_private_bfd_data
|
| #define bfd_elf32_bfd_relax_section ppc_elf_relax_section
|
| #define bfd_elf32_bfd_reloc_type_lookup ppc_elf_reloc_type_lookup
|
| -#define bfd_elf32_bfd_reloc_name_lookup ppc_elf_reloc_name_lookup
|
| +#define bfd_elf32_bfd_reloc_name_lookup ppc_elf_reloc_name_lookup
|
| #define bfd_elf32_bfd_set_private_flags ppc_elf_set_private_flags
|
| #define bfd_elf32_bfd_link_hash_table_create ppc_elf_link_hash_table_create
|
| #define bfd_elf32_get_synthetic_symtab ppc_elf_get_synthetic_symtab
|
| @@ -9120,6 +9711,7 @@ ppc_elf_finish_dynamic_sections (bfd *output_bfd,
|
| #define elf_backend_finish_dynamic_sections ppc_elf_finish_dynamic_sections
|
| #define elf_backend_fake_sections ppc_elf_fake_sections
|
| #define elf_backend_additional_program_headers ppc_elf_additional_program_headers
|
| +#define elf_backend_modify_segment_map ppc_elf_modify_segment_map
|
| #define elf_backend_grok_prstatus ppc_elf_grok_prstatus
|
| #define elf_backend_grok_psinfo ppc_elf_grok_psinfo
|
| #define elf_backend_write_core_note ppc_elf_write_core_note
|
| @@ -9132,6 +9724,8 @@ ppc_elf_finish_dynamic_sections (bfd *output_bfd,
|
| #define elf_backend_action_discarded ppc_elf_action_discarded
|
| #define elf_backend_init_index_section _bfd_elf_init_1_index_section
|
| #define elf_backend_post_process_headers _bfd_elf_set_osabi
|
| +#define elf_backend_lookup_section_flags_hook ppc_elf_lookup_section_flags
|
| +#define elf_backend_section_processing ppc_elf_section_processing
|
|
|
| #include "elf32-target.h"
|
|
|
|
|