summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ppc-amigaos/recipes/patches/binutils/0001-Changes-for-various-Amiga-targets.p779
1 files changed, 0 insertions, 779 deletions
diff --git a/ppc-amigaos/recipes/patches/binutils/0001-Changes-for-various-Amiga-targets.p b/ppc-amigaos/recipes/patches/binutils/0001-Changes-for-various-Amiga-targets.p
index 559e6ac..ccc8a07 100644
--- a/ppc-amigaos/recipes/patches/binutils/0001-Changes-for-various-Amiga-targets.p
+++ b/ppc-amigaos/recipes/patches/binutils/0001-Changes-for-various-Amiga-targets.p
@@ -9509,785 +9509,6 @@ index 0000000000000000000000000000000000000000..cf6c6cb9efdd15c786932adedd2476ec
+#define elf_backend_reloc_type_class ppc_elf_reloc_type_class
+
+#include "elf32-target.h"
-diff --git a/bfd/elf32-ppc.c b/bfd/elf32-amigaos.c
-similarity index 97%
-copy from bfd/elf32-ppc.c
-copy to bfd/elf32-amigaos.c
-index 6454a8350da35adf6ed1e2209d9e4774ab7c50e3..9bf9535888f2345d60a8f802680ae03f41f67a5f 100644
---- bfd/elf32-ppc.c
-+++ bfd/elf32-amigaos.c
-@@ -31,32 +31,50 @@
- #include <stdarg.h>
- #include "bfd.h"
- #include "bfdlink.h"
- #include "libbfd.h"
- #include "elf-bfd.h"
- #include "elf/ppc.h"
-+#include "elf/amigaos.h"
- #include "elf32-ppc.h"
- #include "elf-vxworks.h"
- #include "dwarf2.h"
-
-+#undef DEBUG
-+
- typedef enum split16_format_type
- {
- split16a_type = 0,
- split16d_type
- }
- split16_format_type;
-
- /* RELA relocations are used here. */
-+#define USE_RELA
-+#define USE_REL 0
-
- 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);
-
-+int ppc_elf_amigaos_select_plt_layout (bfd *, struct bfd_link_info *,
-+ enum ppc_elf_plt_type, int);
-+
-+bfd_boolean ppc_elf_amigaos_section_processing (bfd *abfd, Elf_Internal_Shdr *shdr);
-+bfd_boolean ppc_elf_amigaos_modify_segment_map (bfd *abfd,
-+ struct bfd_link_info *info ATTRIBUTE_UNUSED);
-+asection *ppc_elf_amigaos_tls_setup (bfd *obfd, struct bfd_link_info *info,
-+ int no_tls_get_addr_opt);
-+bfd_boolean ppc_elf_amigaos_tls_optimize (bfd *obfd ATTRIBUTE_UNUSED,
-+ struct bfd_link_info *info);
-+unsigned int _bfd_elf_amigaos_ppc_at_tls_transform (unsigned int insn, unsigned int reg);
-+unsigned int _bfd_elf_amigaos_ppc_at_tprel_transform (unsigned int insn, unsigned int reg);
-+
- /* Branch prediction bit for branch taken relocs. */
- #define BRANCH_PREDICT_BIT 0x200000
- /* Mask to set RA in memory instructions. */
- #define RA_REGISTER_MASK 0x001f0000
- /* Value to shift register by to insert RA. */
- #define RA_REGISTER_SHIFT 16
-@@ -1381,12 +1399,74 @@ static reloc_howto_type ppc_elf_howto_raw[] = {
- /* Relocation not handled: R_PPC_EMB_RELSEC16 */
- /* Relocation not handled: R_PPC_EMB_RELST_LO */
- /* Relocation not handled: R_PPC_EMB_RELST_HI */
- /* Relocation not handled: R_PPC_EMB_RELST_HA */
- /* Relocation not handled: R_PPC_EMB_BIT_FLD */
-
-+
-+ /* A standard 32 bit base relative relocation. */
-+ HOWTO (R_PPC_AMIGAOS_BREL, /* 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_AMIGAOS_BREL", /* name */
-+ FALSE, /* partial_inplace */
-+ 0, /* src_mask */
-+ 0xffffffff, /* dst_mask */
-+ FALSE), /* pcrel_offset */
-+
-+ /* A 16 bit base relative relocation without overflow. */
-+ HOWTO (R_PPC_AMIGAOS_BREL_LO, /* type */
-+ 0, /* rightshift */
-+ 1, /* size (0 = byte, 1 = short, 2 = long) */
-+ 16, /* bitsize */
-+ FALSE, /* pc_relative */
-+ 0, /* bitpos */
-+ complain_overflow_dont,/* complain_on_overflow */
-+ bfd_elf_generic_reloc, /* special_function */
-+ "R_PPC_AMIGAOS_BREL_LO",/* name */
-+ FALSE, /* partial_inplace */
-+ 0, /* src_mask */
-+ 0xffff, /* dst_mask */
-+ FALSE), /* pcrel_offset */
-+
-+ /* The high order 16 bits of a base relative address. */
-+ HOWTO (R_PPC_AMIGAOS_BREL_HI, /* type */
-+ 16, /* rightshift */
-+ 1, /* size (0 = byte, 1 = short, 2 = long) */
-+ 16, /* bitsize */
-+ FALSE, /* pc_relative */
-+ 0, /* bitpos */
-+ complain_overflow_dont, /* complain_on_overflow */
-+ bfd_elf_generic_reloc, /* special_function */
-+ "R_PPC_AMIGAOS_BREL_HI",/* name */
-+ FALSE, /* partial_inplace */
-+ 0, /* src_mask */
-+ 0xffff, /* dst_mask */
-+ FALSE), /* pcrel_offset */
-+
-+ /* The high order 16 bits of a base relative address, plus 1 if the contents
-+ of the low 16 bits, treated as a signed number, is negative. */
-+ HOWTO (R_PPC_AMIGAOS_BREL_HA, /* type */
-+ 16, /* rightshift */
-+ 1, /* size (0 = byte, 1 = short, 2 = long) */
-+ 16, /* bitsize */
-+ FALSE, /* pc_relative */
-+ 0, /* bitpos */
-+ complain_overflow_dont, /* complain_on_overflow */
-+ ppc_elf_addr16_ha_reloc, /* special_function */
-+ "R_PPC_AMIGAOS_BREL_HA",/* name */
-+ FALSE, /* partial_inplace */
-+ 0, /* src_mask */
-+ 0xffff, /* dst_mask */
-+ FALSE), /* pcrel_offset */
-+
- /* PC relative relocation against either _SDA_BASE_ or _SDA2_BASE_, filling
- in the 16 bit signed offset from the appropriate base, and filling in the
- register field with the appropriate register (0, 2, or 13). */
- HOWTO (R_PPC_EMB_RELSDA, /* type */
- 0, /* rightshift */
- 1, /* size (0 = byte, 1 = short, 2 = long) */
-@@ -1935,12 +2015,16 @@ ppc_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
- 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;
- case BFD_RELOC_HI16_S_PCREL: r = R_PPC_REL16_HA; break;
-+ case BFD_RELOC_PPC_AMIGAOS_BREL: r = R_PPC_AMIGAOS_BREL; break;
-+ case BFD_RELOC_PPC_AMIGAOS_BREL_LO: r = R_PPC_AMIGAOS_BREL_LO; break;
-+ case BFD_RELOC_PPC_AMIGAOS_BREL_HI: r = R_PPC_AMIGAOS_BREL_HI; break;
-+ case BFD_RELOC_PPC_AMIGAOS_BREL_HA: r = R_PPC_AMIGAOS_BREL_HA; break;
- case BFD_RELOC_VTABLE_INHERIT: r = R_PPC_GNU_VTINHERIT; break;
- case BFD_RELOC_VTABLE_ENTRY: r = R_PPC_GNU_VTENTRY; break;
- }
-
- return ppc_elf_howto_table[r];
- };
-@@ -2268,13 +2352,13 @@ ppc_elf_lookup_section_flags (char *flag_name)
- return 0;
- }
-
- /* Add the VLE flag if required. */
-
- bfd_boolean
--ppc_elf_section_processing (bfd *abfd, Elf_Internal_Shdr *shdr)
-+ppc_elf_amigaos_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;
-@@ -2285,12 +2369,15 @@ ppc_elf_section_processing (bfd *abfd, Elf_Internal_Shdr *shdr)
-
- static bfd_vma
- ppc_elf_plt_sym_val (bfd_vma i ATTRIBUTE_UNUSED,
- const asection *plt ATTRIBUTE_UNUSED,
- const arelent *rel)
- {
-+#ifdef DEBUG
-+ fprintf (stderr, "ppc_elf_plt_sym_cal (0x%08x)\n", (unsigned int)rel->address);
-+#endif
- return rel->address;
- }
-
- /* Handle a PowerPC specific section when reading an object file. This
- is called when bfd_section_from_shdr finds a section with an unknown
- type. */
-@@ -2337,13 +2424,14 @@ ppc_elf_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
-
- static int
- ppc_elf_additional_program_headers (bfd *abfd,
- struct bfd_link_info *info ATTRIBUTE_UNUSED)
- {
- asection *s;
-- int ret = 0;
-+// int ret = 0;
-+ int ret = 1;
-
- s = bfd_get_section_by_name (abfd, ".sbss2");
- if (s != NULL && (s->flags & SEC_ALLOC) != 0)
- ++ret;
-
- s = bfd_get_section_by_name (abfd, ".PPC.EMB.sbss0");
-@@ -2353,13 +2441,13 @@ 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,
-+ppc_elf_amigaos_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;
-@@ -2546,13 +2634,13 @@ apuinfo_list_finish (void)
- #define APUINFO_LABEL "APUinfo"
-
- /* Scan the input BFDs and create a linked list of
- the APUinfo values that will need to be emitted. */
-
- static void
--ppc_elf_begin_write_processing (bfd *abfd, struct bfd_link_info *link_info)
-+ppc_elf_amigaos_begin_write_processing (bfd *abfd, struct bfd_link_info *link_info)
- {
- bfd *ibfd;
- asection *asec;
- char *buffer = NULL;
- bfd_size_type largest_input_size = 0;
- unsigned i;
-@@ -2646,24 +2734,24 @@ ppc_elf_begin_write_processing (bfd *abfd, struct bfd_link_info *link_info)
- }
-
- /* Prevent the output section from accumulating the input sections'
- contents. We have already stored this in our linked list structure. */
-
- static bfd_boolean
--ppc_elf_write_section (bfd *abfd ATTRIBUTE_UNUSED,
-+ppc_elf_amigaos_write_section (bfd *abfd ATTRIBUTE_UNUSED,
- struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
- asection *asec,
- bfd_byte *contents ATTRIBUTE_UNUSED)
- {
- return apuinfo_set && strcmp (asec->name, APUINFO_SECTION_NAME) == 0;
- }
-
- /* Finally we can generate the output section. */
-
- static void
--ppc_elf_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED)
-+ppc_elf_amigaos_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED)
- {
- bfd_byte *buffer;
- asection *asec;
- unsigned i;
- unsigned num_entries;
- bfd_size_type length;
-@@ -3232,13 +3320,13 @@ ppc_elf_create_got (bfd *abfd, struct bfd_link_info *info)
- abort ();
- }
- else
- {
- /* The powerpc .got has a blrl instruction in it. Mark it
- executable. */
-- flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS
-+ flags = (SEC_ALLOC | SEC_LOAD | /*SEC_CODE |*/ SEC_HAS_CONTENTS
- | SEC_IN_MEMORY | SEC_LINKER_CREATED);
- if (!bfd_set_section_flags (abfd, s, flags))
- return FALSE;
- }
-
- htab->relgot = bfd_get_linker_section (abfd, ".rela.got");
-@@ -3340,13 +3428,13 @@ ppc_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
-
- htab->relplt = bfd_get_linker_section (abfd, ".rela.plt");
- htab->plt = s = bfd_get_linker_section (abfd, ".plt");
- if (s == NULL)
- abort ();
-
-- flags = SEC_ALLOC | SEC_CODE | SEC_LINKER_CREATED;
-+ flags = SEC_ALLOC | SEC_CODE | SEC_LINKER_CREATED | SEC_READONLY;
- if (htab->plt_type == PLT_VXWORKS)
- /* The VxWorks PLT is a loaded section with contents. */
- flags |= SEC_HAS_CONTENTS | SEC_LOAD | SEC_READONLY;
- return bfd_set_section_flags (abfd, s, flags);
- }
-
-@@ -3410,13 +3498,13 @@ ppc_elf_copy_indirect_symbol (struct bfd_link_info *info,
- eind->dyn_relocs = NULL;
- }
-
- /* If we were called to copy over info for a weak sym, that's all.
- You might think dyn_relocs need not be copied over; After all,
- both syms will be dynamic or both non-dynamic so we're just
-- moving reloc accounting around. However, ELIMINATE_COPY_RELOCS
-+ moving reloc accounting around. However, ELIMINATE_COPY_RELOCS
- code in ppc_elf_adjust_dynamic_symbol needs to check for
- dyn_relocs in read-only sections, and it does so on what is the
- DIR sym here. */
- if (eind->elf.root.type != bfd_link_hash_indirect)
- return;
-
-@@ -4186,12 +4274,19 @@ ppc_elf_check_relocs (bfd *abfd,
- case R_PPC_EMB_RELST_LO:
- case R_PPC_EMB_RELST_HI:
- case R_PPC_EMB_RELST_HA:
- case R_PPC_EMB_BIT_FLD:
- break;
-
-+ /* These don't work with a GOT */
-+ case R_PPC_AMIGAOS_BREL:
-+ case R_PPC_AMIGAOS_BREL_HI:
-+ case R_PPC_AMIGAOS_BREL_LO:
-+ case R_PPC_AMIGAOS_BREL_HA:
-+ break;
-+
- /* This refers only to functions defined in the shared library. */
- case R_PPC_LOCAL24PC:
- if (h != NULL && h == htab->elf.hgot && htab->plt_type == PLT_UNSET)
- {
- htab->plt_type = PLT_OLD;
- htab->old_bfd = abfd;
-@@ -4679,13 +4774,13 @@ ppc_elf_vle_split16 (bfd *output_bfd, bfd_byte *contents,
- }
-
-
- /* Choose which PLT scheme to use, and set .plt flags appropriately.
- Returns -1 on error, 0 for old PLT, 1 for new PLT. */
- int
--ppc_elf_select_plt_layout (bfd *output_bfd ATTRIBUTE_UNUSED,
-+ppc_elf_amigaos_select_plt_layout (bfd *output_bfd ATTRIBUTE_UNUSED,
- struct bfd_link_info *info,
- enum ppc_elf_plt_type plt_style,
- int emit_stub_syms)
- {
- struct ppc_elf_link_hash_table *htab;
- flagword flags;
-@@ -4976,13 +5071,13 @@ ppc_elf_gc_sweep_hook (bfd *abfd,
- }
-
- /* Set plt output section type, htab->tls_get_addr, and call the
- generic ELF tls_setup function. */
-
- asection *
--ppc_elf_tls_setup (bfd *obfd,
-+ppc_elf_amigaos_tls_setup (bfd *obfd,
- struct bfd_link_info *info,
- int no_tls_get_addr_opt)
- {
- struct ppc_elf_link_hash_table *htab;
-
- htab = ppc_elf_hash_table (info);
-@@ -5075,13 +5170,13 @@ branch_reloc_hash_match (const bfd *ibfd,
- }
-
- /* Run through all the TLS relocs looking for optimization
- opportunities. */
-
- bfd_boolean
--ppc_elf_tls_optimize (bfd *obfd ATTRIBUTE_UNUSED,
-+ppc_elf_amigaos_tls_optimize (bfd *obfd ATTRIBUTE_UNUSED,
- struct bfd_link_info *info)
- {
- bfd *ibfd;
- asection *sec;
- struct ppc_elf_link_hash_table *htab;
- int pass;
-@@ -6008,12 +6103,16 @@ ppc_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
- fprintf (stderr, "ppc_elf_size_dynamic_sections called\n");
- #endif
-
- htab = ppc_elf_hash_table (info);
- BFD_ASSERT (htab->elf.dynobj != NULL);
-
-+#ifdef DEBUG
-+ fprintf (stderr, "ppc_elf_size_dynamic_sections: dynamic_sections_created = %d\n", elf_hash_table (info)->dynamic_sections_created);
-+#endif
-+
- if (elf_hash_table (info)->dynamic_sections_created)
- {
- /* Set the contents of the .interp section to the interpreter. */
- if (info->executable)
- {
- s = bfd_get_linker_section (htab->elf.dynobj, ".interp");
-@@ -6037,12 +6136,16 @@ ppc_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
- struct plt_entry **local_plt;
- struct plt_entry **end_local_plt;
- char *lgot_masks;
- bfd_size_type locsymcount;
- Elf_Internal_Shdr *symtab_hdr;
-
-+#ifdef DEBUG
-+ fprintf (stderr, "ppc_elf_size_dynamic_sections: is_ppc_elf() = %d (flavour = %d)\n", is_ppc_elf (ibfd), bfd_get_flavour (ibfd));
-+#endif
-+
- if (!is_ppc_elf (ibfd))
- continue;
-
- for (s = ibfd->sections; s != NULL; s = s->next)
- {
- struct elf_dyn_relocs *p;
-@@ -6400,12 +6503,16 @@ ppc_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
- if (!add_dynamic_entry (DT_TEXTREL, 0))
- return FALSE;
- }
- if (htab->is_vxworks
- && !elf_vxworks_add_dynamic_entries (output_bfd, info))
- return FALSE;
-+
-+ /* Flag it as a version 2 dynamic binary */
-+ if (!add_dynamic_entry(DT_AMIGAOS_DYNVERSION, 2))
-+ return FALSE;
- }
- #undef add_dynamic_entry
-
- if (htab->glink_eh_frame != NULL
- && htab->glink_eh_frame->contents != NULL)
- {
-@@ -7172,13 +7279,13 @@ is_static_defined (struct elf_link_hash_entry *h)
-
- /* If INSN is an opcode that may be used with an @tls operand, return
- the transformed insn for TLS optimisation, otherwise return 0. If
- REG is non-zero only match an insn with RB or RA equal to REG. */
-
- unsigned int
--_bfd_elf_ppc_at_tls_transform (unsigned int insn, unsigned int reg)
-+_bfd_elf_amigaos_ppc_at_tls_transform (unsigned int insn, unsigned int reg)
- {
- unsigned int rtra;
-
- if ((insn & (0x3f << 26)) != 31 << 26)
- return 0;
-
-@@ -7212,13 +7319,13 @@ _bfd_elf_ppc_at_tls_transform (unsigned int insn, unsigned int reg)
-
- /* If INSN is an opcode that may be used with an @tprel operand, return
- the transformed insn for an undefined weak symbol, ie. with the
- thread pointer REG operand removed. Otherwise return 0. */
-
- unsigned int
--_bfd_elf_ppc_at_tprel_transform (unsigned int insn, unsigned int reg)
-+_bfd_elf_amigaos_ppc_at_tprel_transform (unsigned int insn, unsigned int reg)
- {
- if ((insn & (0x1f << 16)) == reg << 16
- && ((insn & (0x3f << 26)) == 14u << 26 /* addi */
- || (insn & (0x3f << 26)) == 15u << 26 /* addis */
- || (insn & (0x3f << 26)) == 32u << 26 /* lwz */
- || (insn & (0x3f << 26)) == 34u << 26 /* lbz */
-@@ -8076,13 +8183,13 @@ ppc_elf_relocate_section (bfd *output_bfd,
- /* Make this relocation against an undefined weak symbol
- resolve to zero. This is really just a tweak, since
- code using weak externs ought to check that they are
- defined before using them. */
- bfd_byte *p = contents + rel->r_offset - d_offset;
- unsigned int insn = bfd_get_32 (output_bfd, p);
-- insn = _bfd_elf_ppc_at_tprel_transform (insn, 2);
-+ insn = _bfd_elf_amigaos_ppc_at_tprel_transform (insn, 2);
- if (insn != 0)
- bfd_put_32 (output_bfd, insn, p);
- break;
- }
- addend -= htab->elf.tls_sec->vma + TP_OFFSET;
- /* The TPREL16 relocs shouldn't really be used in shared
-@@ -8502,13 +8609,47 @@ ppc_elf_relocate_section (bfd *output_bfd,
- sym_name,
- howto->name,
- name);
- }
- }
- break;
-+#if 0
-+ case R_PPC_AMIGAOS_BREL:
-+ case R_PPC_AMIGAOS_BREL_HI:
-+ case R_PPC_AMIGAOS_BREL_LO:
-+ case R_PPC_AMIGAOS_BREL_HA:
-+ {
-+ if (data_section == NULL)
-+ data_section = bfd_get_section_by_name (output_bfd, ".data");
-+
-+ if (sec)
-+ {
-+ const char *name = bfd_get_section_name (abfd, sec->output_section);
-+ if (strcmp (name, ".sdata") != 0
-+ && strcmp (name, ".sbss") != 0
-+ && strcmp (name, ".data") != 0
-+ && strcmp (name, ".bss") != 0
-+ && strncmp (name, ".ctors", 6) != 0
-+ && strncmp (name, ".dtors", 6) != 0)
-+ {
-+ (*_bfd_error_handler) (_("%s: The target (%s) of a %s relocation is in the wrong output section (%s)"),
-+ input_bfd,
-+ sym_name,
-+ howto->name,
-+ name);
-+ }
-+ }
-+
-+ addend = addend - data_section->vma;
-+
-+ if (r_type == R_PPC_AMIGAOS_BREL_HA)
-+ addend += ((relocation + addend) & 0x8000) << 1;
-
-+ }
-+ break;
-+#endif
- case R_PPC_VLE_LO16A:
- relocation = (relocation + addend) & 0xffff;
- ppc_elf_vle_split16 (output_bfd, contents, rel->r_offset,
- relocation, split16a_type);
- continue;
-
-@@ -8899,12 +9040,15 @@ ppc_elf_relocate_section (bfd *output_bfd,
- input_section,
- contents,
- rel->r_offset,
- relocation,
- addend);
-
-+#ifdef DEBUG
-+ fprintf (stderr, "%p %p %p\n", (void *)rel->r_offset, (void *)relocation, (void *)addend);
-+#endif
- if (r != bfd_reloc_ok)
- {
- if (r == bfd_reloc_overflow)
- {
- if (warned)
- continue;
-@@ -9124,18 +9268,24 @@ ppc_elf_finish_dynamic_symbol (bfd *output_bfd,
- || h->dynindx == -1)
- splt = htab->iplt;
-
- rela.r_offset = (splt->output_section->vma
- + splt->output_offset
- + ent->plt.offset);
-+#ifdef DEBUG
-+ fprintf (stderr, " r_offset = %p ", (void *)rela.r_offset);
-+#endif
- if (htab->plt_type == PLT_OLD
- || !htab->elf.dynamic_sections_created
- || h->dynindx == -1)
- {
- /* We don't need to fill in the .plt. The ppc dynamic
- linker will fill it in. */
-+#ifdef DEBUG
-+ fprintf (stderr, " not filling in .plt ");
-+#endif
- }
- else
- {
- bfd_vma val = (htab->glink_pltresolve + ent->plt.offset
- + htab->glink->output_section->vma
- + htab->glink->output_offset);
-@@ -9166,24 +9316,34 @@ ppc_elf_finish_dynamic_symbol (bfd *output_bfd,
- * sizeof (Elf32_External_Rela)));
- else
- loc = (htab->relplt->contents
- + reloc_index * sizeof (Elf32_External_Rela));
- bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
-
-+#ifdef DEBUG
-+ fprintf (stderr, " r_offset = %p r_addednd = %p, r_info = 0x%08x, h->def_regular = %d", (void *)rela.r_offset, (void *)rela.r_addend, (unsigned int)rela.r_info, (int)h->def_regular);
-+#endif
- if (!h->def_regular)
- {
- /* Mark the symbol as undefined, rather than as
- defined in the .plt section. Leave the value if
- there were any relocations where pointer equality
- matters (this is a clue for the dynamic linker, to
- make function pointer comparisons work between an
- application and shared library), otherwise set it
- to zero. */
- sym->st_shndx = SHN_UNDEF;
- if (!h->pointer_equality_needed)
-- sym->st_value = 0;
-+ {
-+ /* THF: This is peculiar. The compiler generates a R_PPC_REL24 for externally referenced
-+ * symbols impoted from libc.so. Relocation in elf.library requires the symbol to have it's .plt
-+ * stub value, but the linker specifically clears the value to 0, resulting in run-time
-+ * errors when the binary tries to call libc functions.
-+ */
-+ // sym->st_value = 0;
-+ }
- else if (!h->ref_regular_nonweak)
- {
- /* This breaks function pointer comparisons, but
- that is better than breaking tests for a NULL
- function pointer. */
- sym->st_value = 0;
-@@ -9275,12 +9435,15 @@ ppc_elf_finish_dynamic_symbol (bfd *output_bfd,
- rela.r_addend = 0;
- loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
- bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
- }
-
- #ifdef DEBUG
-+ fprintf (stderr, " SYM_VAL(%p) ", (void *)SYM_VAL(h));
-+#endif
-+#ifdef DEBUG
- fprintf (stderr, "\n");
- #endif
-
- return TRUE;
- }
-
-@@ -9735,16 +9898,14 @@ ppc_elf_finish_dynamic_sections (bfd *output_bfd,
- return FALSE;
- }
-
- return ret;
- }
-
--#define TARGET_LITTLE_SYM bfd_elf32_powerpcle_vec
--#define TARGET_LITTLE_NAME "elf32-powerpcle"
--#define TARGET_BIG_SYM bfd_elf32_powerpc_vec
--#define TARGET_BIG_NAME "elf32-powerpc"
-+#define TARGET_BIG_SYM bfd_elf32_amigaos_vec
-+#define TARGET_BIG_NAME "elf32-amigaos"
- #define ELF_ARCH bfd_arch_powerpc
- #define ELF_TARGET_ID PPC32_ELF_DATA
- #define ELF_MACHINE_CODE EM_PPC
- #ifdef __QNXTARGET__
- #define ELF_MAXPAGESIZE 0x1000
- #else
-@@ -9789,153 +9950,23 @@ ppc_elf_finish_dynamic_sections (bfd *output_bfd,
- #define elf_backend_size_dynamic_sections ppc_elf_size_dynamic_sections
- #define elf_backend_hash_symbol ppc_elf_hash_symbol
- #define elf_backend_finish_dynamic_symbol ppc_elf_finish_dynamic_symbol
- #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_modify_segment_map ppc_elf_amigaos_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
- #define elf_backend_reloc_type_class ppc_elf_reloc_type_class
--#define elf_backend_begin_write_processing ppc_elf_begin_write_processing
--#define elf_backend_final_write_processing ppc_elf_final_write_processing
--#define elf_backend_write_section ppc_elf_write_section
-+#define elf_backend_begin_write_processing ppc_elf_amigaos_begin_write_processing
-+#define elf_backend_final_write_processing ppc_elf_amigaos_final_write_processing
-+#define elf_backend_write_section ppc_elf_amigaos_write_section
- #define elf_backend_get_sec_type_attr ppc_elf_get_sec_type_attr
- #define elf_backend_plt_sym_val ppc_elf_plt_sym_val
- #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"
--
--/* FreeBSD Target */
--
--#undef TARGET_LITTLE_SYM
--#undef TARGET_LITTLE_NAME
--
--#undef TARGET_BIG_SYM
--#define TARGET_BIG_SYM bfd_elf32_powerpc_freebsd_vec
--#undef TARGET_BIG_NAME
--#define TARGET_BIG_NAME "elf32-powerpc-freebsd"
--
--#undef ELF_OSABI
--#define ELF_OSABI ELFOSABI_FREEBSD
--
--#undef elf32_bed
--#define elf32_bed elf32_powerpc_fbsd_bed
--
--#include "elf32-target.h"
--
--/* VxWorks Target */
--
--#undef TARGET_LITTLE_SYM
--#undef TARGET_LITTLE_NAME
--
--#undef TARGET_BIG_SYM
--#define TARGET_BIG_SYM bfd_elf32_powerpc_vxworks_vec
--#undef TARGET_BIG_NAME
--#define TARGET_BIG_NAME "elf32-powerpc-vxworks"
--
--#undef ELF_OSABI
--
--/* VxWorks uses the elf default section flags for .plt. */
--static const struct bfd_elf_special_section *
--ppc_elf_vxworks_get_sec_type_attr (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
--{
-- if (sec->name == NULL)
-- return NULL;
--
-- if (strcmp (sec->name, ".plt") == 0)
-- return _bfd_elf_get_sec_type_attr (abfd, sec);
--
-- return ppc_elf_get_sec_type_attr (abfd, sec);
--}
--
--/* Like ppc_elf_link_hash_table_create, but overrides
-- appropriately for VxWorks. */
--static struct bfd_link_hash_table *
--ppc_elf_vxworks_link_hash_table_create (bfd *abfd)
--{
-- struct bfd_link_hash_table *ret;
--
-- ret = ppc_elf_link_hash_table_create (abfd);
-- if (ret)
-- {
-- struct ppc_elf_link_hash_table *htab
-- = (struct ppc_elf_link_hash_table *)ret;
-- htab->is_vxworks = 1;
-- htab->plt_type = PLT_VXWORKS;
-- htab->plt_entry_size = VXWORKS_PLT_ENTRY_SIZE;
-- htab->plt_slot_size = VXWORKS_PLT_ENTRY_SIZE;
-- htab->plt_initial_entry_size = VXWORKS_PLT_INITIAL_ENTRY_SIZE;
-- }
-- return ret;
--}
--
--/* Tweak magic VxWorks symbols as they are loaded. */
--static bfd_boolean
--ppc_elf_vxworks_add_symbol_hook (bfd *abfd,
-- struct bfd_link_info *info,
-- Elf_Internal_Sym *sym,
-- const char **namep ATTRIBUTE_UNUSED,
-- flagword *flagsp ATTRIBUTE_UNUSED,
-- asection **secp,
-- bfd_vma *valp)
--{
-- if (!elf_vxworks_add_symbol_hook(abfd, info, sym,namep, flagsp, secp,
-- valp))
-- return FALSE;
--
-- return ppc_elf_add_symbol_hook(abfd, info, sym,namep, flagsp, secp, valp);
--}
--
--static void
--ppc_elf_vxworks_final_write_processing (bfd *abfd, bfd_boolean linker)
--{
-- ppc_elf_final_write_processing(abfd, linker);
-- elf_vxworks_final_write_processing(abfd, linker);
--}
--
--/* On VxWorks, we emit relocations against _PROCEDURE_LINKAGE_TABLE_, so
-- define it. */
--#undef elf_backend_want_plt_sym
--#define elf_backend_want_plt_sym 1
--#undef elf_backend_want_got_plt
--#define elf_backend_want_got_plt 1
--#undef elf_backend_got_symbol_offset
--#define elf_backend_got_symbol_offset 0
--#undef elf_backend_plt_not_loaded
--#define elf_backend_plt_not_loaded 0
--#undef elf_backend_plt_readonly
--#define elf_backend_plt_readonly 1
--#undef elf_backend_got_header_size
--#define elf_backend_got_header_size 12
--
--#undef bfd_elf32_get_synthetic_symtab
--
--#undef bfd_elf32_bfd_link_hash_table_create
--#define bfd_elf32_bfd_link_hash_table_create \
-- ppc_elf_vxworks_link_hash_table_create
--#undef elf_backend_add_symbol_hook
--#define elf_backend_add_symbol_hook \
-- ppc_elf_vxworks_add_symbol_hook
--#undef elf_backend_link_output_symbol_hook
--#define elf_backend_link_output_symbol_hook \
-- elf_vxworks_link_output_symbol_hook
--#undef elf_backend_final_write_processing
--#define elf_backend_final_write_processing \
-- ppc_elf_vxworks_final_write_processing
--#undef elf_backend_get_sec_type_attr
--#define elf_backend_get_sec_type_attr \
-- ppc_elf_vxworks_get_sec_type_attr
--#undef elf_backend_emit_relocs
--#define elf_backend_emit_relocs \
-- elf_vxworks_emit_relocs
--
--#undef elf32_bed
--#define elf32_bed ppc_elf_vxworks_bed
--#undef elf_backend_post_process_headers
-+#define elf_backend_section_processing ppc_elf_amigaos_section_processing
-
- #include "elf32-target.h"
diff --git a/bfd/elf32-i386-amithlon.c b/bfd/elf32-i386-amithlon.c
new file mode 100644
index 0000000000000000000000000000000000000000..4e029a5e90187a96013ed97e078fba920d95db28