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" |