gps/GPSResources/tcpmpVerOld/cross-compile/binutils-2.14.palmos.diff

1732 lines
55 KiB
Diff
Raw Normal View History

2019-05-01 12:32:35 +00:00
diff -urN orig-binutils-2.14/ChangeLogs.palmos binutils-2.14/ChangeLogs.palmos
--- orig-binutils-2.14/ChangeLogs.palmos 1970-01-01 01:00:00.000000000 +0100
+++ binutils-2.14/ChangeLogs.palmos 2005-05-31 16:30:00.343750000 +0200
@@ -0,0 +1,81 @@
+Collect all the changelog entries here for use on the eventual submission
+to the FSF:
+
+(Many of these log entries no longer relate to the current form of the
+patches. But at the moment they are still of historical interest to us.)
+
+bfd/ChangeLog
+=============
+
+2002-01-09 John Marshall <johnm@falch.net>
+
+ * cofflink.c (_bfd_coff_generic_relocate_section): Removed handling
+ of R_RELENDWORD from here...
+ * coff-m68k.c (m68kcoff_rtype_to_howto): ...handling it here instead.
+ (m68kcoff_global_data_size): New helper function.
+
+Tue Feb 1 21:54:44 2000 John Marshall <john_w_marshall@palm.com>
+
+ * coff-m68k.c (_bfd_m68kcoff_create_embedded_relocs,
+ coff_m68k_bfd_print_private_bfd_data), emultempl/m68kcoff.em:
+ Pad the .reloc records to 12 bytes.
+ * coffcode.h (coff_new_section_hook): Don't try to change .reloc's
+ alignment.
+
+Thu Sep 24 14:24:36 1998 John Marshall <jmarshall@acm.org>
+
+ * coff-m68k.c (m68k_rtype2howto, m68k_howto2rtype,
+ m68k_reloc_type_lookup): New reloc type R_RELENDWORD.
+ * cofflink.c (_bfd_coff_generic_relocate_section): Likewise.
+
+Sat Sep 5 14:10:23 1998 John Marshall <jmarshall@acm.org>
+
+ * cofflink.c (_bfd_coff_generic_relocate_section): Fill in .dreloc
+ section, somewhat similarly to base file.
+
+
+gas/ChangeLog
+=============
+
+2002-01-09 John Marshall <johnm@falch.net>
+
+ * config/obj-elf.h, config/tc-m68k.h: Reorganised the setting of
+ NEED_FX_R_TYPE and SPECIAL_PIC_RELOC (now renamed COFF_RELEND_RELOC)
+ so as to avoid touching these two files.
+
+Tue Oct 13 01:30:47 1998 John Marshall <jmarshall@acm.org>
+
+ * config/m68k-parse.h, config/m68k-parse.y, config/tc-m68k.c: Use
+ SPECIAL_PIC_RELOC instead of OBJ_ELF to activate special PIC
+ relocation code.
+ * config/obj-elf.h, config/obj-coff.h: Define SPECIAL_PIC_RELOC.
+ * config/tc-m68k.h [SPECIAL_PIC_RELOC]: Define NEED_FX_R_TYPE.
+
+ * config/m68k-parse.h: New pic_relocation type pic_endrel.
+ * config/m68k-parse.y: Encode `symbol@END' as pic_endrel.
+
+ * config/tc-m68k.c (get_reloc_code) [SPECIAL_PIC_RELOC]: Set
+ fx_r_type if the reloc has a special pic type.
+ (tc_coff_fix2rtype) [SPECIAL_PIC_RELOC]: Use fx_r_type if set.
+
+
+include/coff/ChangeLog
+======================
+
+Sat Sep 5 21:38:15 1998 John Marshall <jmarshall@acm.org>
+
+ * internal.h (R_RELENDWORD): Define.
+
+
+ld/ChangeLog
+============
+
+Sat Sep 5 14:10:23 1998 John Marshall <jmarshall@acm.org>
+
+ * emultempl/m68kcoff.em: New file, based on generic.em, with a
+ custom gld${EMULATION_NAME}_after_open that creates a .dreloc
+ section for input bfds which need it, if --embedded-relocs is used.
+ * emulparams/m68kcoff.sh (TEMPLATE_NAME): Set to m68kcoff.
+ * Makefile.am (em68kcoff.c): Depend upon m68kcoff.em rather than
+ generic.em.
+ * Makefile.in (em68kcoff.c): Likewise.
diff -urN orig-binutils-2.14/Makefile.in binutils-2.14/Makefile.in
--- orig-binutils-2.14/Makefile.in 2005-05-31 16:27:00.953125000 +0200
+++ binutils-2.14/Makefile.in 2005-05-31 16:30:00.343750000 +0200
@@ -1089,7 +1089,7 @@
.PHONY: info installcheck dvi install-info
.PHONY: clean distclean mostlyclean maintainer-clean realclean
.PHONY: local-clean local-distclean local-maintainer-clean
-info: do-info
+info: configure-host do-info
installcheck: do-installcheck
dvi: do-dvi
diff -urN orig-binutils-2.14/bfd/Makefile.am binutils-2.14/bfd/Makefile.am
--- orig-binutils-2.14/bfd/Makefile.am 2005-05-31 16:25:55.234375000 +0200
+++ binutils-2.14/bfd/Makefile.am 2005-05-31 16:30:00.375000000 +0200
@@ -305,6 +305,9 @@
pei-mips.lo \
peigen.lo \
ppcboot.lo \
+ prc-arm.lo \
+ prc-m68k.lo \
+ prc.lo \
reloc16.lo \
riscix.lo \
sparclinux.lo \
@@ -467,6 +470,9 @@
pe-mips.c \
pei-mips.c \
ppcboot.c \
+ prc-arm.c \
+ prc-m68k.c \
+ prc.c \
reloc16.c \
riscix.c \
sparclinux.c \
@@ -1465,6 +1471,9 @@
$(INCDIR)/coff/pe.h libcoff.h $(INCDIR)/bfdlink.h coffcode.h \
peicode.h libpei.h
ppcboot.lo: ppcboot.c $(INCDIR)/safe-ctype.h $(INCDIR)/filenames.h
+prc-arm.lo: prc-arm.c prc.h
+prc-m68k.lo: prc-m68k.c prc.h
+prc.lo: prc.c prc.h $(INCDIR)/safe-ctype.h
reloc16.lo: reloc16.c $(INCDIR)/filenames.h $(INCDIR)/bfdlink.h \
genlink.h $(INCDIR)/coff/internal.h libcoff.h
riscix.lo: riscix.c $(INCDIR)/filenames.h libaout.h \
diff -urN orig-binutils-2.14/bfd/Makefile.in binutils-2.14/bfd/Makefile.in
--- orig-binutils-2.14/bfd/Makefile.in 2005-05-31 16:25:55.234375000 +0200
+++ binutils-2.14/bfd/Makefile.in 2005-05-31 16:30:00.406250000 +0200
@@ -432,6 +432,9 @@
pei-mips.lo \
peigen.lo \
ppcboot.lo \
+ prc-arm.lo \
+ prc-m68k.lo \
+ prc.lo \
reloc16.lo \
riscix.lo \
sparclinux.lo \
@@ -595,6 +598,9 @@
pe-mips.c \
pei-mips.c \
ppcboot.c \
+ prc-arm.c \
+ prc-m68k.c \
+ prc.c \
reloc16.c \
riscix.c \
sparclinux.c \
@@ -1998,6 +2004,9 @@
$(INCDIR)/coff/pe.h libcoff.h $(INCDIR)/bfdlink.h coffcode.h \
peicode.h libpei.h
ppcboot.lo: ppcboot.c $(INCDIR)/safe-ctype.h $(INCDIR)/filenames.h
+prc-arm.lo: prc-arm.c prc.h
+prc-m68k.lo: prc-m68k.c prc.h
+prc.lo: prc.c prc.h $(INCDIR)/safe-ctype.h
reloc16.lo: reloc16.c $(INCDIR)/filenames.h $(INCDIR)/bfdlink.h \
genlink.h $(INCDIR)/coff/internal.h libcoff.h
riscix.lo: riscix.c $(INCDIR)/filenames.h libaout.h \
diff -urN orig-binutils-2.14/bfd/coff-m68k.c binutils-2.14/bfd/coff-m68k.c
--- orig-binutils-2.14/bfd/coff-m68k.c 2005-05-31 16:25:51.546875000 +0200
+++ binutils-2.14/bfd/coff-m68k.c 2005-05-31 16:30:00.421875000 +0200
@@ -67,6 +67,8 @@
#define RELOC_SPECIAL_FN m68kcoff_common_addend_special_fn
#endif
+static bfd_boolean coff_m68k_bfd_print_private_bfd_data
+ PARAMS ((bfd *, PTR));
static bfd_boolean m68k_coff_is_local_label_name
PARAMS ((bfd *, const char *));
@@ -108,6 +110,7 @@
HOWTO (R_PCRWORD, 0, 1, 16, TRUE, 0, complain_overflow_signed, RELOC_SPECIAL_FN, "DISP16", TRUE, 0x0000ffff,0x0000ffff, FALSE),
HOWTO (R_PCRLONG, 0, 2, 32, TRUE, 0, complain_overflow_signed, RELOC_SPECIAL_FN, "DISP32", TRUE, 0xffffffff,0xffffffff, FALSE),
HOWTO (R_RELLONG_NEG, 0, -2, 32, FALSE, 0, complain_overflow_bitfield, RELOC_SPECIAL_FN, "-32", TRUE, 0xffffffff,0xffffffff, FALSE),
+ HOWTO (R_RELENDWORD, 0, 1, 16, FALSE, 0, complain_overflow_bitfield, RELOC_SPECIAL_FN, "END16", TRUE, 0x0000ffff,0x0000ffff, FALSE),
};
#endif /* not ONLY_DECLARE_RELOCS */
@@ -150,6 +153,7 @@
case R_PCRWORD: internal->howto = m68kcoff_howto_table + 4; break;
case R_PCRLONG: internal->howto = m68kcoff_howto_table + 5; break;
case R_RELLONG_NEG: internal->howto = m68kcoff_howto_table + 6; break;
+ case R_RELENDWORD: internal->howto = m68kcoff_howto_table + 7; break;
}
}
@@ -157,6 +161,9 @@
m68k_howto2rtype (internal)
reloc_howto_type *internal;
{
+ if (internal->type == R_RELENDWORD)
+ return R_RELENDWORD;
+
if (internal->pc_relative)
{
switch (internal->bitsize)
@@ -194,6 +201,7 @@
case BFD_RELOC_16_PCREL: return m68kcoff_howto_table + 4;
case BFD_RELOC_32_PCREL: return m68kcoff_howto_table + 5;
/* FIXME: There doesn't seem to be a code for R_RELLONG_NEG. */
+ /* FIXME: Nor for R_RELENDWORD. */
}
/*NOTREACHED*/
}
@@ -208,6 +216,46 @@
#define coff_bfd_reloc_type_lookup m68k_reloc_type_lookup
+#ifndef coff_rtype_to_howto
+/* If this is not yet defined, one of the following definitions will be
+ used. Both need this helper function. */
+
+static bfd_vma m68kcoff_global_data_size
+ PARAMS ((bfd *, asection *, struct internal_reloc *,
+ struct coff_link_hash_entry *));
+
+static bfd_vma
+m68kcoff_global_data_size (abfd, sec, rel, h)
+ bfd *abfd;
+ asection *sec;
+ struct internal_reloc *rel;
+ struct coff_link_hash_entry *h;
+{
+ struct bfd_link_info *info;
+ struct coff_link_hash_entry *edata;
+
+ info = coff_data (sec->output_section->owner)->link_info;
+
+ edata = coff_link_hash_lookup (coff_hash_table (info), "edata",
+ FALSE, FALSE, TRUE);
+
+ if (edata && (edata->root.type == bfd_link_hash_defined
+ || edata->root.type == bfd_link_hash_defweak))
+ {
+ return edata->root.u.def.value;
+ }
+ else
+ {
+ (*info->callbacks->warning) (info,
+ "END16 relocation failed without `edata'",
+ h? h->root.root.string : NULL, abfd, sec,
+ rel->r_vaddr - sec->vma);
+ return 0;
+ }
+}
+
+#endif
+
#ifndef COFF_COMMON_ADDEND
#ifndef coff_rtype_to_howto
@@ -220,10 +268,10 @@
static reloc_howto_type *
m68kcoff_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
- bfd *abfd ATTRIBUTE_UNUSED;
+ bfd *abfd;
asection *sec;
struct internal_reloc *rel;
- struct coff_link_hash_entry *h ATTRIBUTE_UNUSED;
+ struct coff_link_hash_entry *h;
struct internal_syment *sym ATTRIBUTE_UNUSED;
bfd_vma *addendp;
{
@@ -237,6 +285,9 @@
if (howto->pc_relative)
*addendp += sec->vma;
+ if (rel->r_type == R_RELENDWORD)
+ *addendp -= m68kcoff_global_data_size (abfd, sec, rel, h);
+
return howto;
}
@@ -380,7 +431,7 @@
static reloc_howto_type *
m68kcoff_common_addend_rtype_to_howto (abfd, sec, rel, h, sym, addendp)
- bfd *abfd ATTRIBUTE_UNUSED;
+ bfd *abfd;
asection *sec;
struct internal_reloc *rel;
struct coff_link_hash_entry *h;
@@ -397,6 +448,9 @@
if (howto->pc_relative)
*addendp += sec->vma;
+ if (rel->r_type == R_RELENDWORD)
+ *addendp -= m68kcoff_global_data_size (abfd, sec, rel, h);
+
if (sym != NULL && sym->n_scnum == 0 && sym->n_value != 0)
{
/* This is a common symbol. The section contents include the
@@ -506,21 +560,194 @@
targetsec = NULL;
}
+ bfd_put_16 (abfd, 1, p);
+ bfd_put_16 (abfd, datasec->output_section->index, p + 2);
bfd_put_32 (abfd,
- (irel->r_vaddr - datasec->vma + datasec->output_offset), p);
- memset (p + 4, 0, 8);
+ (irel->r_vaddr - datasec->vma + datasec->output_offset),
+ p + 4);
if (targetsec != NULL)
- strncpy (p + 4, targetsec->output_section->name, 8);
+ bfd_put_16 (abfd, targetsec->output_section->index, p + 8);
+ else
+ {
+ /* Probably can't happen, but let's try to be compatible with the
+ previous version. */
+ p -= 12;
+ }
+ bfd_put_16 (abfd, 0, p + 10);
}
return TRUE;
}
#endif /* neither ONLY_DECLARE_RELOCS not STATIC_RELOCS */
+/* Print the contents of ABFD's `.reloc' section to the file PTR. */
+static bfd_boolean
+coff_m68k_bfd_print_private_bfd_data (abfd, ptr)
+ bfd *abfd;
+ PTR ptr;
+{
+ FILE *f = (FILE *) ptr;
+ asection *relocs_sec, *held_relsec;
+ bfd_byte *relocs, *rel, *relsec_contents;
+ bfd_size_type relocs_size, relsec_size = 0;
+
+ relocs_sec = bfd_get_section_by_name (abfd, ".reloc");
+ if (relocs_sec == NULL)
+ return TRUE;
+
+ fprintf (f, "\nEMBEDDED RELOCATION RECORDS:");
+
+ relocs_size = bfd_section_size (abfd, relocs_sec);
+ if (relocs_size == 0)
+ {
+ fprintf (f, " (none)\n\n");
+ return TRUE;
+ }
+ else
+ fprintf (f, "\n");
+
+ relocs = (bfd_byte *) bfd_malloc ((size_t) relocs_size);
+ bfd_get_section_contents (abfd, relocs_sec, (PTR) relocs, 0, relocs_size);
+
+ /* Get column headers lined up reasonably. */
+ {
+ static int width;
+ if (width == 0)
+ {
+ char buf[30];
+ sprintf_vma (buf, (bfd_vma) -1);
+ width = strlen (buf) - 7;
+ }
+ fprintf (f, "SECTION+OFFSET %*s TYPE %*s VALUE \n", width, "", 12, "");
+ }
+
+ held_relsec = NULL;
+ relsec_contents = NULL;
+
+ for (rel = relocs; rel < relocs + relocs_size; rel += 12)
+ {
+ bfd_vma type, reloffset, value;
+ int relsecndx, symsecndx;
+ reloc_howto_type *howto;
+ asection *sec, *relsec, *symsec;
+ CONST char *relsecname, *symsecname;
+ char relbuffer[32], symbuffer[32];
+
+ type = bfd_get_16 (abfd, rel);
+ relsecndx = bfd_get_16 (abfd, rel+2);
+ reloffset = bfd_get_32 (abfd, rel+4);
+ symsecndx = bfd_get_16 (abfd, rel+8);
+
+ /* Decode the embedded relocation type. See also the corresponding
+ encoding table in _bfd_m68kcoff_create_embedded_relocs(). */
+ switch (type)
+ {
+ case 1:
+ type = BFD_RELOC_32;
+ break;
+
+ default:
+ type = BFD_RELOC_UNUSED; /* Something definitely unknown. */
+ break;
+ }
+
+ relsec = symsec = NULL;
+ for (sec = abfd->sections; sec; sec = sec->next)
+ {
+ if (sec->index == relsecndx)
+ relsec = sec;
+ if (sec->index == symsecndx)
+ symsec = sec;
+ }
+
+ sprintf (relbuffer, "[%d?]", (int) relsecndx);
+ relsecname = (relsec)? bfd_section_name (abfd, relsec) : relbuffer;
+
+ sprintf (symbuffer, "[%d?]", (int) symsecndx);
+ symsecname = (symsec)? bfd_section_name (abfd, symsec) : symbuffer;
+
+ fprintf (f, "%s+0x", relsecname);
+ fprintf_vma (f, reloffset);
+ fprintf (f, "%*s", (int) (9 - strlen (relsecname)), "");
+
+ howto = (relsec)? bfd_reloc_type_lookup (abfd, type) : NULL;
+ if (howto == NULL)
+ {
+ char buf[32];
+ sprintf (buf, "[0x%x]", (unsigned int) type);
+ fprintf (f, "%-18.18s%s+?? (%s unknown)\n", buf, symsecname,
+ (relsec)? "type" : "relocation section");
+ continue;
+ }
+
+ fprintf (f, "%-18.18s", howto->name);
+
+ if (relsec == NULL)
+ {
+ fprintf (f, "%s+?? (relocation section unknown)\n", symsecname);
+ continue;
+ }
+
+ if (held_relsec != relsec)
+ {
+ free (relsec_contents);
+ held_relsec = relsec;
+ relsec_size = bfd_section_size (abfd, relsec);
+ relsec_contents = (bfd_byte *) bfd_malloc ((size_t) relsec_size);
+ bfd_get_section_contents (abfd, relsec, (PTR) relsec_contents,
+ 0, relsec_size);
+ }
+
+ if (reloffset > relsec_size - bfd_get_reloc_size (howto))
+ {
+ fprintf (f, "%s+?? (offset out of range)\n", symsecname);
+ continue;
+ }
+
+ switch (bfd_get_reloc_size (howto))
+ {
+ default:
+ case 0:
+ abort ();
+ case 1:
+ value = bfd_get_8 (abfd, &relsec_contents[reloffset]);
+ break;
+ case 2:
+ value = bfd_get_16 (abfd, &relsec_contents[reloffset]);
+ break;
+ case 4:
+ value = bfd_get_32 (abfd, &relsec_contents[reloffset]);
+ break;
+ case 8:
+#ifdef BFD64
+ value = bfd_get_64 (abfd, &relsec_contents[reloffset]);
+#else
+ abort ();
+#endif
+ break;
+ }
+
+ value &= howto->dst_mask;
+ value >>= howto->bitpos;
+ value <<= howto->rightshift;
+
+ fprintf (f, "%s+0x", symsecname);
+ fprintf_vma (f, value - bfd_section_vma (abfd, symsec));
+ fprintf (f, "\n");
+ }
+
+ free (relocs);
+ free (relsec_contents);
+
+ return TRUE;
+}
+
#define coff_bfd_is_local_label_name m68k_coff_is_local_label_name
#define coff_relocate_section _bfd_coff_generic_relocate_section
+#define coff_bfd_print_private_bfd_data coff_m68k_bfd_print_private_bfd_data
+
#include "coffcode.h"
#ifndef TARGET_SYM
diff -urN orig-binutils-2.14/bfd/config.bfd binutils-2.14/bfd/config.bfd
--- orig-binutils-2.14/bfd/config.bfd 2005-05-31 16:25:52.281250000 +0200
+++ binutils-2.14/bfd/config.bfd 2005-05-31 16:30:00.437500000 +0200
@@ -219,6 +219,10 @@
targ_defvec=bfd_elf32_littlearm_oabi_vec
targ_selvecs=bfd_elf32_bigarm_oabi_vec
;;
+ arm-*-palmos*)
+ targ_defvec=bfd_elf32_littlearm_vec
+ targ_selvecs="bfd_elf32_bigarm_vec prc_littlearm_vec"
+ ;;
thumb-*-coff)
targ_defvec=armcoff_little_vec
@@ -696,6 +700,10 @@
targ_selvecs=ieee_vec
targ_underscore=yes
;;
+ m68*-*-palmos*)
+ targ_defvec=m68kcoff_vec
+ targ_selvecs=prc_m68k_vec
+ ;;
m88*-harris-cxux* | m88*-*-dgux* | m88*-*-sysv4*)
targ_defvec=bfd_elf32_m88k_vec
diff -urN orig-binutils-2.14/bfd/configure binutils-2.14/bfd/configure
--- orig-binutils-2.14/bfd/configure 2005-05-31 16:25:52.312500000 +0200
+++ binutils-2.14/bfd/configure 2005-05-31 16:30:00.484375000 +0200
@@ -6275,6 +6275,8 @@
pdp11_aout_vec) tb="$tb pdp11.lo" ;;
pmac_xcoff_vec) tb="$tb coff-rs6000.lo xcofflink.lo" ;;
ppcboot_vec) tb="$tb ppcboot.lo" ;;
+ prc_littlearm_vec) tb="$tb prc-arm.lo prc.lo" ;;
+ prc_m68k_vec) tb="$tb prc-m68k.lo prc.lo" ;;
riscix_vec) tb="$tb aout32.lo riscix.lo" ;;
rs6000coff64_vec) tb="$tb coff64-rs6000.lo xcofflink.lo aix5ppc-core.lo"; target_size=64 ;;
rs6000coff_vec) tb="$tb coff-rs6000.lo xcofflink.lo" ;;
diff -urN orig-binutils-2.14/bfd/configure.in binutils-2.14/bfd/configure.in
--- orig-binutils-2.14/bfd/configure.in 2005-05-31 16:25:52.312500000 +0200
+++ binutils-2.14/bfd/configure.in 2005-05-31 16:30:00.453125000 +0200
@@ -737,6 +737,8 @@
pdp11_aout_vec) tb="$tb pdp11.lo" ;;
pmac_xcoff_vec) tb="$tb coff-rs6000.lo xcofflink.lo" ;;
ppcboot_vec) tb="$tb ppcboot.lo" ;;
+ prc_littlearm_vec) tb="$tb prc-arm.lo prc.lo" ;;
+ prc_m68k_vec) tb="$tb prc-m68k.lo prc.lo" ;;
riscix_vec) tb="$tb aout32.lo riscix.lo" ;;
rs6000coff64_vec) tb="$tb coff64-rs6000.lo xcofflink.lo aix5ppc-core.lo"; target_size=64 ;;
rs6000coff_vec) tb="$tb coff-rs6000.lo xcofflink.lo" ;;
diff -urN orig-binutils-2.14/bfd/prc-arm.c binutils-2.14/bfd/prc-arm.c
--- orig-binutils-2.14/bfd/prc-arm.c 1970-01-01 01:00:00.000000000 +0100
+++ binutils-2.14/bfd/prc-arm.c 2005-05-31 16:30:00.484375000 +0200
@@ -0,0 +1,50 @@
+/* BFD back-end for the Palm OS PRC resource database format.
+ Copyright 2002 John Marshall. (For now.)
+ Contributed by Falch.net as.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#include "bfd.h"
+#include "sysdep.h"
+#include "libbfd.h"
+#include "prc.h"
+
+static flagword secflags
+ PARAMS ((const struct palmos_prc_header *header, const char *secname));
+
+static flagword
+secflags (header, secname)
+ const struct palmos_prc_header *header ATTRIBUTE_UNUSED;
+ const char *secname;
+{
+ flagword flags = 0;
+
+ if (strncmp (secname, "armc", 4) == 0)
+ flags |= SEC_CODE;
+
+ return flags;
+}
+
+static const struct palmos_prc_backend_data arm_backend_data =
+{
+ bfd_arch_arm, bfd_mach_arm_4T, secflags
+};
+
+const bfd_target prc_littlearm_vec =
+ PRC_TARGET_VECTOR ("prc-littlearm", BFD_ENDIAN_LITTLE,
+ bfd_getl64, bfd_getl_signed_64, bfd_putl64,
+ bfd_getl32, bfd_getl_signed_32, bfd_putl32,
+ bfd_getl16, bfd_getl_signed_16, bfd_putl16,
+ &arm_backend_data);
diff -urN orig-binutils-2.14/bfd/prc-m68k.c binutils-2.14/bfd/prc-m68k.c
--- orig-binutils-2.14/bfd/prc-m68k.c 1970-01-01 01:00:00.000000000 +0100
+++ binutils-2.14/bfd/prc-m68k.c 2005-05-31 16:30:00.500000000 +0200
@@ -0,0 +1,64 @@
+/* BFD back-end for the Palm OS PRC resource database format.
+ Copyright 2002 John Marshall. (For now.)
+ Contributed by Falch.net as.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#include "bfd.h"
+#include "sysdep.h"
+#include "libbfd.h"
+#include "prc.h"
+
+static flagword secflags
+ PARAMS ((const struct palmos_prc_header *header, const char *secname));
+
+static flagword
+secflags (header, secname)
+ const struct palmos_prc_header *header;
+ const char *secname;
+{
+ flagword flags = 0;
+
+ if (strncmp (secname, "libr", 4) == 0
+ || strncmp (secname, "GLib", 4) == 0
+ || strncmp (secname, "HACK", 4) == 0
+ || (strncmp (secname, "code", 4) == 0
+ && (strcmp (secname, "code.0") != 0
+ || strcmp (header->type, "appl") != 0)))
+ flags |= SEC_CODE;
+
+ if (strncmp (secname, "data", 4) == 0)
+ flags |= SEC_DATA;
+
+ if (strncmp (secname, "gdbS", 4) == 0)
+ flags |= SEC_DEBUGGING;
+
+ return flags;
+}
+
+/* FIXME Crazy scheme: we could synthesize symbols from MacsBug symbols
+ in the code resources. */
+
+static const struct palmos_prc_backend_data m68k_backend_data =
+{
+ bfd_arch_m68k, bfd_mach_m68000, secflags
+};
+
+const bfd_target prc_m68k_vec =
+ PRC_TARGET_VECTOR ("prc-m68k", BFD_ENDIAN_BIG,
+ bfd_getb64, bfd_getb_signed_64, bfd_putb64,
+ bfd_getb32, bfd_getb_signed_32, bfd_putb32,
+ bfd_getb16, bfd_getb_signed_16, bfd_putb16,
+ &m68k_backend_data);
diff -urN orig-binutils-2.14/bfd/prc.c binutils-2.14/bfd/prc.c
--- orig-binutils-2.14/bfd/prc.c 1970-01-01 01:00:00.000000000 +0100
+++ binutils-2.14/bfd/prc.c 2005-05-31 16:30:00.515625000 +0200
@@ -0,0 +1,407 @@
+/* BFD back-end for the Palm OS PRC resource database format.
+ Copyright 2002 John Marshall. (For now.)
+ Contributed by Falch.net as.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#include "bfd.h"
+#include "sysdep.h"
+#include "safe-ctype.h"
+#include "libbfd.h"
+#include "prc.h"
+
+static bfd_boolean swap_in_header
+ PARAMS ((bfd *abfd, asection *sec, struct palmos_prc_header *header));
+static bfd_boolean swap_in_resource_headers
+ PARAMS ((bfd *abfd, unsigned int n,
+ struct palmos_prc_resource_header *headers));
+
+static void add_section
+ PARAMS ((bfd *abfd, struct palmos_prc_header *header, const char *secname,
+ flagword basic_flags, unsigned long offset,
+ unsigned long lim_offset));
+static file_ptr tie_down_section
+ PARAMS ((bfd *abfd, asection *sec, file_ptr offset));
+static void compute_section_file_positions
+ PARAMS ((bfd *abfd, file_ptr offset));
+
+/* The PRC file format is documented in the "Palm File Format Specification",
+ available from <URL:http://www.palmos.com/dev/support/docs/>. */
+
+#define HEADER_SIZE 0x4e
+#define RSRCENTRY_SIZE 10
+
+/* Read from SEC if non-NULL, otherwise directly from the start of ABFD. */
+static bfd_boolean
+swap_in_header (abfd, sec, header)
+ bfd *abfd;
+ asection *sec;
+ struct palmos_prc_header *header;
+{
+ char raw[HEADER_SIZE];
+
+ if (sec)
+ {
+ if (! bfd_get_section_contents (abfd, sec, raw, 0, sizeof raw))
+ return FALSE;
+ }
+ else
+ {
+ if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
+ || bfd_bread (raw, sizeof raw, abfd) != sizeof raw)
+ return FALSE;
+ }
+
+ memcpy (header->name, &raw[0], 32);
+ header->name[32] = '\0';
+
+ header->flags = bfd_h_get_16 (abfd, &raw[0x20]);
+ header->version = bfd_h_get_16 (abfd, &raw[0x22]);
+ header->create_time = bfd_h_get_32 (abfd, &raw[0x24]);
+ header->mod_time = bfd_h_get_32 (abfd, &raw[0x28]);
+ header->backup_time = bfd_h_get_32 (abfd, &raw[0x2c]);
+
+ header->appinfo_offset = bfd_h_get_32 (abfd, &raw[0x34]);
+ header->sortinfo_offset = bfd_h_get_32 (abfd, &raw[0x38]);
+
+ memcpy (header->type, &raw[0x3c], 4);
+ header->type[4] = '\0';
+
+ memcpy (header->creator, &raw[0x40], 4);
+ header->creator[4] = '\0';
+
+ header->nextlist_offset = bfd_h_get_32 (abfd, &raw[0x48]);
+ header->nresources = bfd_h_get_16 (abfd, &raw[0x4c]);
+
+ return TRUE;
+}
+
+static bfd_boolean
+swap_in_resource_headers (abfd, n, headers)
+ bfd *abfd;
+ unsigned int n;
+ struct palmos_prc_resource_header *headers;
+{
+ unsigned int i;
+
+ if (bfd_seek (abfd, (file_ptr) HEADER_SIZE, SEEK_SET) != 0)
+ return FALSE;
+
+ for (i = 0; i < n; i++)
+ {
+ char raw[RSRCENTRY_SIZE];
+ if (bfd_bread (raw, sizeof raw, abfd) != sizeof raw)
+ return FALSE;
+
+ memcpy (headers[i].type, &raw[0], 4);
+ headers[i].type[4] = '\0';
+ headers[i].id = bfd_h_get_16 (abfd, &raw[4]);
+ headers[i].offset = bfd_h_get_32 (abfd, &raw[6]);
+ }
+
+ return TRUE;
+}
+
+static bfd_boolean
+printable_string_p (const char *s)
+{
+ while (*s)
+ if (! ISPRINT (*s++))
+ return FALSE;
+ return TRUE;
+}
+
+/* We use SEC_LINKER_CREATED to signify arcane processing; namely a section,
+ such as header information or appinfo, which does not correspond to a
+ real resource. */
+
+static void
+add_section (abfd, header, secname, basic_flags, offset, lim_offset)
+ bfd *abfd;
+ struct palmos_prc_header *header;
+ const char *secname;
+ flagword basic_flags;
+ unsigned long offset, lim_offset;
+{
+ asection *sec = bfd_make_section (abfd, secname);
+ if (sec == NULL)
+ return;
+
+ sec->vma = sec->lma = 0;
+ sec->filepos = offset;
+ bfd_set_section_size (abfd, sec, lim_offset - offset);
+ /* FIXME?? sec->_raw_size = lim_offset - offset; */
+
+ sec->flags = (SEC_HAS_CONTENTS | basic_flags
+ | (*(backend_data (abfd)->secflags)) (header, secname));
+
+ if (header->flags & 0x0002)
+ sec->flags |= SEC_READONLY;
+}
+
+bfd_boolean
+_bfd_prc_mkobject (abfd)
+ bfd *abfd ATTRIBUTE_UNUSED;
+{
+ return TRUE;
+}
+
+const bfd_target *
+_bfd_prc_object_p (abfd)
+ bfd *abfd;
+{
+ struct palmos_prc_header h;
+ struct palmos_prc_resource_header *resource = NULL;
+ unsigned int i;
+ struct stat statbuf;
+
+ if (! swap_in_header (abfd, NULL, &h))
+ goto invalid_prc;
+
+ resource = bfd_malloc ((h.nresources + 1)
+ * sizeof (struct palmos_prc_resource_header));
+ if (resource == NULL)
+ goto failed;
+
+ if (! swap_in_resource_headers (abfd, h.nresources, resource))
+ goto invalid_prc;
+
+ if (bfd_stat (abfd, &statbuf) < 0)
+ goto failed;
+
+ resource[h.nresources].offset = statbuf.st_size;
+
+ /* The PRC format has no useful magic numbers, so checking that a file
+ is a valid .prc is a black art. We check that:
+ - name, type, creator, and resource types are all printable ASCII;
+ - flags includes 0x1;
+ - next_record_list is 0;
+ - app_info, sort_info (when they are non-zero), section pointers are
+ strictly ascending. */
+
+ if (! (printable_string_p (h.name)
+ && (h.flags & 0x0001)
+ && printable_string_p (h.type)
+ && printable_string_p (h.creator)
+ && h.nextlist_offset == 0
+ && (h.appinfo_offset == 0 || h.sortinfo_offset == 0
+ || h.appinfo_offset < h.sortinfo_offset)
+ && (h.sortinfo_offset == 0 || h.sortinfo_offset < resource[0].offset)))
+ goto invalid_prc;
+
+ for (i = 0; i < h.nresources; i++)
+ if (! (printable_string_p (resource[i].type)
+ && resource[i].offset < resource[i + 1].offset))
+ goto invalid_prc;
+
+ add_section (abfd, &h, ".header", SEC_LINKER_CREATED, 0, HEADER_SIZE);
+
+ if (h.appinfo_offset)
+ add_section (abfd, &h, ".appinfo",
+ SEC_LINKER_CREATED | SEC_ALLOC | SEC_LOAD, h.appinfo_offset,
+ h.sortinfo_offset? h.sortinfo_offset : resource[0].offset);
+
+ if (h.sortinfo_offset)
+ add_section (abfd, &h, ".sortinfo",
+ SEC_LINKER_CREATED | SEC_ALLOC | SEC_LOAD, h.sortinfo_offset,
+ resource[0].offset);
+
+ for (i = 0; i < h.nresources; i++)
+ {
+ char secnamebuf[32];
+ char *secname;
+
+ sprintf (secnamebuf, "%s.%u", resource[i].type, resource[i].id);
+
+ /* FIXME: If this ever fails, it'll leak the previous names. */
+ secname = bfd_alloc (abfd, strlen (secnamebuf) + 1);
+ if (secname == NULL)
+ goto failed;
+
+ strcpy (secname, secnamebuf);
+ add_section (abfd, &h, secname, SEC_ALLOC | SEC_LOAD,
+ resource[i].offset, resource[i + 1].offset);
+ }
+
+ if (strcmp (h.type, "appl") == 0)
+ abfd->flags |= EXEC_P;
+ else if (strcmp (h.type, "libr") == 0 || strcmp (h.type, "GLib") == 0)
+ abfd->flags |= DYNAMIC;
+
+ bfd_default_set_arch_mach (abfd,
+ backend_data (abfd)->arch,
+ backend_data (abfd)->mach);
+
+ /* FIXME */
+ abfd->symcount = 0;
+
+ return abfd->xvec;
+
+ /* Otherwise ABFD was not recognized as being in PRC format. Jumps to
+ <invalid_prc> are asking for a wrong_format error; jumps to <failed>
+ imply that something major has just failed and has already set a
+ suitable error code. */
+
+invalid_prc:
+ bfd_set_error (bfd_error_wrong_format);
+
+failed:
+ if (resource)
+ free (resource);
+
+ return NULL;
+}
+
+static file_ptr
+tie_down_section (abfd, sec, offset)
+ bfd *abfd ATTRIBUTE_UNUSED;
+ asection *sec;
+ file_ptr offset;
+{
+ sec->filepos = offset;
+ return offset + bfd_section_size (abfd, sec);
+}
+
+static void
+compute_section_file_positions (abfd, offset)
+ bfd *abfd;
+ file_ptr offset;
+{
+ asection *sec;
+
+ sec = bfd_get_section_by_name (abfd, ".appinfo");
+ if (sec)
+ offset = tie_down_section (abfd, sec, offset);
+
+ sec = bfd_get_section_by_name (abfd, ".sortinfo");
+ if (sec)
+ offset = tie_down_section (abfd, sec, offset);
+
+ for (sec = abfd->sections; sec != NULL; sec = sec->next)
+ if (! (sec->flags & SEC_LINKER_CREATED))
+ offset = tie_down_section (abfd, sec, offset);
+}
+
+bfd_boolean
+_bfd_prc_write_object_contents (abfd)
+ bfd *abfd;
+{
+ /* FIXME This is not yet implemented. */
+ compute_section_file_positions (abfd, HEADER_SIZE);
+ return TRUE;
+}
+
+asymbol *
+_bfd_prc_make_empty_symbol (abfd)
+ bfd *abfd;
+{
+ asymbol *sym = (asymbol *) bfd_zalloc (abfd, sizeof (asymbol));
+ if (sym)
+ sym->the_bfd = abfd;
+ return sym;
+}
+
+long
+_bfd_prc_get_symtab_upper_bound (abfd)
+ bfd *abfd;
+{
+ return (bfd_get_symcount (abfd) + 1) * sizeof (asymbol *);
+}
+
+long
+_bfd_prc_get_symtab (abfd, alocation)
+ bfd *abfd ATTRIBUTE_UNUSED;
+ asymbol **alocation ATTRIBUTE_UNUSED;
+{
+ return 0;
+}
+
+void
+_bfd_prc_get_symbol_info (abfd, symbol, ret)
+ bfd *abfd ATTRIBUTE_UNUSED;
+ asymbol *symbol;
+ symbol_info *ret;
+{
+ bfd_symbol_info (symbol, ret);
+}
+
+struct flag_meaning
+{
+ unsigned int mask;
+ const char *name;
+};
+
+/* xgettext: These names should not be translated, because they correspond
+ to constants defined in Palm OS SDKs. */
+
+static const struct flag_meaning meanings[] =
+{
+ { 0x0001, "RESOURCE" },
+ { 0x0002, "READONLY" },
+ { 0x0004, "APPINFO-DIRTY" },
+ { 0x0008, "BACKUP" },
+ { 0x0010, "OK-TO-INSTALL-NEWER" },
+ { 0x0020, "RESET-AFTER-INSTALL" },
+ { 0x0040, "COPY-PREVENTION" },
+ { 0x0080, "STREAM" },
+ { 0x0100, "HIDDEN" },
+ { 0x0200, "LAUNCHABLE-DATA" },
+ { 0x0400, "RECYCLABLE" },
+ { 0x0800, "BUNDLE" },
+ { 0x8000, "OPEN" },
+ { 0, NULL }
+};
+
+/* FIXME: internationalise me! */
+
+bfd_boolean
+_bfd_prc_bfd_print_private_bfd_data (abfd, ptr)
+ bfd *abfd;
+ PTR ptr;
+{
+ FILE *f = (FILE *) ptr;
+ struct palmos_prc_header header;
+ unsigned int flags;
+ const struct flag_meaning *meaning;
+
+ swap_in_header (abfd, bfd_get_section_by_name (abfd, ".header"), &header);
+ flags = header.flags;
+
+ fprintf (f, "\nDatabase Header:\n");
+
+ fprintf (f, " Name: %s\n", header.name);
+ fprintf (f, " Flags: ");
+
+ for (meaning = meanings; meaning->name; meaning++)
+ if (flags & meaning->mask)
+ {
+ fprintf (f, " %s", meaning->name);
+ flags &= ~meaning->mask;
+ }
+
+ if (flags != 0)
+ fprintf (f, " 0x%x", flags);
+
+ fprintf (f, "\n");
+
+ fprintf (f, " Type: %s\n", header.type);
+ fprintf (f, " Creator: %s\n", header.creator);
+ fprintf (f, " Version: %u\n", header.version);
+
+ /* FIXME: Output the dates too, if we can be bothered converting from
+ Palm OS's seconds-since-1904-01-01T00:00:00 format. */
+
+ return TRUE;
+}
diff -urN orig-binutils-2.14/bfd/prc.h binutils-2.14/bfd/prc.h
--- orig-binutils-2.14/bfd/prc.h 1970-01-01 01:00:00.000000000 +0100
+++ binutils-2.14/bfd/prc.h 2005-05-31 16:30:00.531250000 +0200
@@ -0,0 +1,134 @@
+/* BFD back-end for the Palm OS PRC resource database format.
+ Copyright 2002 John Marshall. (For now.)
+ Contributed by Falch.net as.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#include "bfd.h"
+#include "sysdep.h"
+
+struct palmos_prc_header
+{
+ char name[33];
+ unsigned int flags, version;
+ unsigned long create_time, mod_time, backup_time;
+ char type[5], creator[5];
+ unsigned long appinfo_offset, sortinfo_offset, nextlist_offset;
+ unsigned int nresources;
+};
+
+struct palmos_prc_resource_header
+{
+ char type[5];
+ unsigned int id;
+ unsigned long offset;
+};
+
+#define backend_data(abfd) \
+ ((const struct palmos_prc_backend_data *) (abfd)->xvec->backend_data)
+
+struct palmos_prc_backend_data
+{
+ enum bfd_architecture arch;
+ unsigned long mach;
+ flagword (*secflags)
+ PARAMS ((const struct palmos_prc_header *, const char *));
+};
+
+extern bfd_boolean _bfd_prc_mkobject PARAMS ((bfd *));
+extern const bfd_target *_bfd_prc_object_p PARAMS ((bfd *));
+extern bfd_boolean _bfd_prc_write_object_contents PARAMS ((bfd *));
+
+#define _bfd_prc_bfd_copy_private_bfd_data \
+ _bfd_generic_bfd_copy_private_bfd_data
+#define _bfd_prc_bfd_merge_private_bfd_data \
+ _bfd_generic_bfd_merge_private_bfd_data
+#define _bfd_prc_bfd_copy_private_section_data \
+ _bfd_generic_bfd_copy_private_section_data
+#define _bfd_prc_bfd_copy_private_symbol_data \
+ _bfd_generic_bfd_copy_private_symbol_data
+#define _bfd_prc_bfd_set_private_flags _bfd_generic_bfd_set_private_flags
+extern bfd_boolean _bfd_prc_bfd_print_private_bfd_data PARAMS ((bfd *, PTR));
+
+extern long _bfd_prc_get_symtab_upper_bound PARAMS ((bfd *));
+extern long _bfd_prc_get_symtab PARAMS ((bfd *, asymbol **));
+extern asymbol *_bfd_prc_make_empty_symbol PARAMS ((bfd *));
+#define _bfd_prc_print_symbol _bfd_nosymbols_print_symbol
+extern void _bfd_prc_get_symbol_info PARAMS ((bfd *, asymbol *, symbol_info *));
+#define _bfd_prc_bfd_is_local_label_name bfd_generic_is_local_label_name
+#define _bfd_prc_get_lineno _bfd_nosymbols_get_lineno
+#define _bfd_prc_find_nearest_line _bfd_nosymbols_find_nearest_line
+#define _bfd_prc_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
+#define _bfd_prc_read_minisymbols _bfd_generic_read_minisymbols
+#define _bfd_prc_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
+
+#define PRC_TARGET_VECTOR(name, body_endianness, \
+ getu64, gets64, put64, \
+ getu32, gets32, put32, \
+ getu16, gets16, put16, \
+ backend_data) \
+ { \
+ (name), \
+ bfd_target_unknown_flavour, \
+ (body_endianness), \
+ BFD_ENDIAN_BIG, /* All PRC headers are big endian. */ \
+ EXEC_P | DYNAMIC, /* plausible BFD flags */ \
+ (SEC_HAS_CONTENTS | SEC_LINKER_CREATED | SEC_ALLOC \
+ | SEC_LOAD | SEC_READONLY | SEC_CODE | SEC_DATA \
+ | SEC_DEBUGGING), /* plausible section flags */ \
+ 0, /* symbol prefix */ \
+ ' ', /* archive pad character */ \
+ 16, /* archive member name length */ \
+ /* Body swapping. */ \
+ (getu64), (gets64), (put64), \
+ (getu32), (gets32), (put32), \
+ (getu16), (gets16), (put16), \
+ /* Header swapping. */ \
+ bfd_getb64, bfd_getb_signed_64, bfd_putb64, \
+ bfd_getb32, bfd_getb_signed_32, bfd_putb32, \
+ bfd_getb16, bfd_getb_signed_16, bfd_putb16, \
+ /* bfd_check_format */ \
+ { \
+ _bfd_dummy_target, \
+ _bfd_prc_object_p, \
+ _bfd_dummy_target, \
+ _bfd_dummy_target \
+ }, \
+ /* bfd_set_format */ \
+ { \
+ bfd_false, \
+ _bfd_prc_mkobject, \
+ bfd_false, \
+ bfd_false \
+ }, \
+ /* bfd_write_contents */ \
+ { \
+ bfd_false, \
+ _bfd_prc_write_object_contents, \
+ bfd_false, \
+ bfd_false \
+ }, \
+ BFD_JUMP_TABLE_GENERIC (_bfd_generic), \
+ BFD_JUMP_TABLE_COPY (_bfd_prc), \
+ BFD_JUMP_TABLE_CORE (_bfd_nocore), \
+ BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive), \
+ BFD_JUMP_TABLE_SYMBOLS (_bfd_prc), \
+ BFD_JUMP_TABLE_RELOCS (_bfd_norelocs), \
+ BFD_JUMP_TABLE_WRITE (_bfd_generic), \
+ BFD_JUMP_TABLE_LINK (_bfd_nolink), \
+ BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic), \
+ NULL, /* No alternative endianness backend. */ \
+ (PTR) (backend_data) \
+ }
diff -urN orig-binutils-2.14/bfd/targets.c binutils-2.14/bfd/targets.c
--- orig-binutils-2.14/bfd/targets.c 2005-05-31 16:25:57.953125000 +0200
+++ binutils-2.14/bfd/targets.c 2005-05-31 16:30:00.562500000 +0200
@@ -678,6 +678,8 @@
extern const bfd_target pef_xlib_vec;
extern const bfd_target pmac_xcoff_vec;
extern const bfd_target ppcboot_vec;
+extern const bfd_target prc_littlearm_vec;
+extern const bfd_target prc_m68k_vec;
extern const bfd_target riscix_vec;
extern const bfd_target rs6000coff64_vec;
extern const bfd_target rs6000coff_vec;
@@ -1015,6 +1017,11 @@
#endif
&ppcboot_vec,
#if 0
+ /* Palm OS PRC format has no useful magic numbers. */
+ &prc_littlearm_vec,
+ &prc_m68k_vec,
+#endif
+#if 0
/* We have no way of distinguishing these from other a.out variants. */
&riscix_vec,
#endif
diff -urN orig-binutils-2.14/config.sub binutils-2.14/config.sub
--- orig-binutils-2.14/config.sub 2005-05-31 16:26:02.828125000 +0200
+++ binutils-2.14/config.sub 2005-05-31 16:30:00.562500000 +0200
@@ -287,6 +287,10 @@
echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
exit 1
;;
+ m68k-palmos)
+ basic_machine=m68k-unknown
+ os=-palmos
+ ;;
# Recognize the basic CPU types with company name.
580-* \
| a29k-* \
diff -urN orig-binutils-2.14/gas/config/m68k-parse.h binutils-2.14/gas/config/m68k-parse.h
--- orig-binutils-2.14/gas/config/m68k-parse.h 2005-05-31 16:26:04.015625000 +0200
+++ binutils-2.14/gas/config/m68k-parse.h 2005-05-31 16:30:00.593750000 +0200
@@ -240,12 +240,13 @@
int scale;
};
-#ifdef OBJ_ELF
+#if defined OBJ_ELF || defined COFF_RELEND_RELOC
/* The type of a PIC expression. */
enum pic_relocation
{
pic_none, /* not pic */
+ pic_endrel, /* @END (for COFF_RELEND_RELOC) */
pic_plt_pcrel, /* @PLTPC */
pic_got_pcrel, /* @GOTPC */
pic_plt_off, /* @PLT */
@@ -260,7 +261,7 @@
/* The size to use. */
enum m68k_size size;
-#ifdef OBJ_ELF
+#if defined OBJ_ELF || defined COFF_RELEND_RELOC
/* The type of pic relocation if any. */
enum pic_relocation pic_reloc;
#endif
diff -urN orig-binutils-2.14/gas/config/m68k-parse.y binutils-2.14/gas/config/m68k-parse.y
--- orig-binutils-2.14/gas/config/m68k-parse.y 2005-05-31 16:26:04.031250000 +0200
+++ binutils-2.14/gas/config/m68k-parse.y 2005-05-31 16:30:00.609375000 +0200
@@ -974,7 +974,7 @@
tail = 2;
}
-#ifdef OBJ_ELF
+#if defined OBJ_ELF || defined COFF_RELEND_RELOC
{
/* Look for @PLTPC, etc. */
char *cp;
@@ -1006,6 +1006,11 @@
yylval.exp.pic_reloc = pic_got_off;
tail += 4;
}
+ else if (strncmp (cp - 4, "@END", 4) == 0)
+ {
+ yylval.exp.pic_reloc = pic_endrel;
+ tail += 4;
+ }
}
}
#endif
diff -urN orig-binutils-2.14/gas/config/obj-coff.h binutils-2.14/gas/config/obj-coff.h
--- orig-binutils-2.14/gas/config/obj-coff.h 2005-05-31 16:26:04.140625000 +0200
+++ binutils-2.14/gas/config/obj-coff.h 2005-05-31 16:30:00.640625000 +0200
@@ -25,6 +25,9 @@
#define OBJ_COFF 1
+#define COFF_RELEND_RELOC
+#define NEED_FX_R_TYPE
+
#ifndef BFD_ASSEMBLER
#define WORKING_DOT_WORD
diff -urN orig-binutils-2.14/gas/config/tc-arm.c binutils-2.14/gas/config/tc-arm.c
--- orig-binutils-2.14/gas/config/tc-arm.c 2005-05-31 16:26:05.031250000 +0200
+++ binutils-2.14/gas/config/tc-arm.c 2005-05-31 16:35:39.828125000 +0200
@@ -10219,7 +10219,7 @@
|| (cpu_variant & FPU_ANY) == FPU_ARCH_VFP) /* VFP layout only. */
flags |= F_SOFT_FLOAT;
/* Using VFP conventions (even if soft-float). */
- if (cpu_variant & FPU_VFP_EXT_NONE) flags |= F_VFP_FLOAT;
+ /*if (cpu_variant & FPU_VFP_EXT_NONE) flags |= F_VFP_FLOAT;*/
#if defined OBJ_ELF
if (cpu_variant & ARM_CEXT_MAVERICK)
diff -urN orig-binutils-2.14/gas/config/tc-m68k.c binutils-2.14/gas/config/tc-m68k.c
--- orig-binutils-2.14/gas/config/tc-m68k.c 2005-05-31 16:26:06.390625000 +0200
+++ binutils-2.14/gas/config/tc-m68k.c 2005-05-31 16:30:00.671875000 +0200
@@ -216,7 +216,7 @@
significance of some values (in the branch instruction, for
example). */
int pcrel_fix;
-#ifdef OBJ_ELF
+#if defined OBJ_ELF || defined COFF_RELEND_RELOC
/* Whether this expression needs special pic relocation, and if
so, which. */
enum pic_relocation pic_reloc;
@@ -284,7 +284,7 @@
the_ins.reloc[the_ins.nrel].exp = exp->exp;
the_ins.reloc[the_ins.nrel].wid = width;
the_ins.reloc[the_ins.nrel].pcrel_fix = pc_fix;
-#ifdef OBJ_ELF
+#if defined OBJ_ELF || defined COFF_RELEND_RELOC
the_ins.reloc[the_ins.nrel].pic_reloc = exp->pic_reloc;
#endif
the_ins.reloc[the_ins.nrel++].pcrel = pc_rel;
@@ -692,6 +692,11 @@
tc_coff_fix2rtype (fixP)
fixS *fixP;
{
+#ifdef COFF_RELEND_RELOC
+ if (fixP->fx_r_type != NO_RELOC)
+ return fixP->fx_r_type;
+#endif
+
if (fixP->fx_tcbit && fixP->fx_size == 4)
return R_RELLONG_NEG;
#ifdef NO_PCREL_RELOCS
@@ -871,8 +876,12 @@
}
#else /* !OBJ_ELF */
-
+#ifdef COFF_RELEND_RELOC
+#define get_reloc_code(SIZE,PCREL,PIC) \
+ (((PIC) == pic_endrel && (SIZE) == 2)? R_RELENDWORD : NO_RELOC)
+#else
#define get_reloc_code(SIZE,PCREL,OTHER) NO_RELOC
+#endif /* COFF_RELEND_RELOC */
#define relaxable_symbol(symbol) 1
diff -urN orig-binutils-2.14/gas/configure binutils-2.14/gas/configure
--- orig-binutils-2.14/gas/configure 2005-05-31 16:26:08.062500000 +0200
+++ binutils-2.14/gas/configure 2005-05-31 16:30:00.718750000 +0200
@@ -2411,6 +2411,7 @@
arm-*-pe | thumb-*-pe) fmt=coff em=pe ;;
arm-*-riscix*) fmt=aout em=riscix ;;
arm-*-vxworks) fmt=coff ;;
+ arm-*-palmos*) fmt=elf ;;
avr-*-*) fmt=elf ;;
@@ -2557,6 +2558,7 @@
m68k-*-openbsd*) fmt=aout em=nbsd bfd_gas=yes ;;
m68k-apple-aux*) fmt=coff em=aux ;;
m68k-*-psos*) fmt=elf em=psos;;
+ m68k-*-palmos*) fmt=coff ;;
m88k-motorola-sysv3*) fmt=coff em=delt88 ;;
m88k-*-coff*) fmt=coff ;;
diff -urN orig-binutils-2.14/gas/configure.in binutils-2.14/gas/configure.in
--- orig-binutils-2.14/gas/configure.in 2005-05-31 16:26:08.078125000 +0200
+++ binutils-2.14/gas/configure.in 2005-05-31 16:30:00.687500000 +0200
@@ -205,6 +205,7 @@
arm-*-pe | thumb-*-pe) fmt=coff em=pe ;;
arm-*-riscix*) fmt=aout em=riscix ;;
arm-*-vxworks) fmt=coff ;;
+ arm-*-palmos*) fmt=elf ;;
avr-*-*) fmt=elf ;;
@@ -347,6 +348,7 @@
m68k-*-openbsd*) fmt=aout em=nbsd bfd_gas=yes ;;
m68k-apple-aux*) fmt=coff em=aux ;;
m68k-*-psos*) fmt=elf em=psos;;
+ m68k-*-palmos*) fmt=coff ;;
m88k-motorola-sysv3*) fmt=coff em=delt88 ;;
m88k-*-coff*) fmt=coff ;;
diff -urN orig-binutils-2.14/gas/m68k-parse.c binutils-2.14/gas/m68k-parse.c
--- orig-binutils-2.14/gas/m68k-parse.c 2005-05-31 16:26:09.921875000 +0200
+++ binutils-2.14/gas/m68k-parse.c 2005-05-31 16:30:00.734375000 +0200
@@ -2175,7 +2175,7 @@
tail = 2;
}
-#ifdef OBJ_ELF
+#if defined OBJ_ELF || defined COFF_RELEND_RELOC
{
/* Look for @PLTPC, etc. */
char *cp;
@@ -2207,6 +2207,11 @@
yylval.exp.pic_reloc = pic_got_off;
tail += 4;
}
+ else if (strncmp (cp - 4, "@END", 4) == 0)
+ {
+ yylval.exp.pic_reloc = pic_endrel;
+ tail += 4;
+ }
}
}
#endif
diff -urN orig-binutils-2.14/include/coff/internal.h binutils-2.14/include/coff/internal.h
--- orig-binutils-2.14/include/coff/internal.h 2005-05-31 16:26:51.875000000 +0200
+++ binutils-2.14/include/coff/internal.h 2005-05-31 16:30:00.734375000 +0200
@@ -626,6 +626,10 @@
#define R_LVRT16 132
#define R_VRT32 133
+/* This (m68k) reloc evaluates to a 16bit offset, just like R_RELWORD, but
+ also implicitly subtracts the value of `edata', so that effectively the
+ origin is at the end of the memory region intead of the start. */
+#define R_RELENDWORD 21
/* This reloc identifies mov.b instructions with a 16bit absolute
address. The linker tries to turn insns with this reloc into
diff -urN orig-binutils-2.14/ld/Makefile.am binutils-2.14/ld/Makefile.am
--- orig-binutils-2.14/ld/Makefile.am 2005-05-31 16:26:54.515625000 +0200
+++ binutils-2.14/ld/Makefile.am 2005-05-31 16:30:00.750000000 +0200
@@ -125,6 +125,7 @@
earmelf_oabi.o \
earmnto.o \
earmnbsd.o \
+ earmpalmos.o \
earmpe.o \
eavr1200.o \
eavr23xx.o \
@@ -242,6 +243,7 @@
em68klinux.o \
em68klynx.o \
em68knbsd.o \
+ em68kpalmos.o \
em68kpsos.o \
em88kbcs.o \
emcorepe.o \
@@ -502,6 +504,9 @@
earmpe.c: $(srcdir)/emulparams/armpe.sh \
$(srcdir)/emultempl/pe.em $(srcdir)/scripttempl/pe.sc ${GEN_DEPENDS}
${GENSCRIPTS} armpe "$(tdir_armpe)"
+earmpalmos.c: $(srcdir)/emulparams/armpalmos.sh $(srcdir)/emulparams/armelf.sh \
+ $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/armpalmos.sc ${GEN_DEPENDS}
+ ${GENSCRIPTS} armpalmos "$(tdir_armpalmos)"
eavr85xx.c: $(srcdir)/emulparams/avr85xx.sh \
$(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32avr.sc \
${GEN_DEPENDS}
@@ -981,6 +986,9 @@
em68knbsd.c: $(srcdir)/emulparams/m68knbsd.sh \
$(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/aout.sc ${GEN_DEPENDS}
${GENSCRIPTS} m68knbsd "$(tdir_m68knbsd)"
+em68kpalmos.c: $(srcdir)/emulparams/m68kpalmos.sh \
+ $(srcdir)/emultempl/m68kcoff.em $(srcdir)/scripttempl/m68kpalmos.sc ${GEN_DEPENDS}
+ ${GENSCRIPTS} m68kpalmos "$(tdir_m68kpalmos)"
em68kpsos.c: $(srcdir)/emulparams/m68kpsos.sh \
$(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/psos.sc ${GEN_DEPENDS}
${GENSCRIPTS} m68kpsos "$(tdir_m68kpsos)"
diff -urN orig-binutils-2.14/ld/Makefile.in binutils-2.14/ld/Makefile.in
--- orig-binutils-2.14/ld/Makefile.in 2005-05-31 16:26:54.515625000 +0200
+++ binutils-2.14/ld/Makefile.in 2005-05-31 16:30:00.765625000 +0200
@@ -239,6 +239,7 @@
earmelf_oabi.o \
earmnto.o \
earmnbsd.o \
+ earmpalmos.o \
earmpe.o \
eavr1200.o \
eavr23xx.o \
@@ -356,6 +357,7 @@
em68klinux.o \
em68klynx.o \
em68knbsd.o \
+ em68kpalmos.o \
em68kpsos.o \
em88kbcs.o \
emcorepe.o \
@@ -1228,6 +1230,9 @@
earmpe.c: $(srcdir)/emulparams/armpe.sh \
$(srcdir)/emultempl/pe.em $(srcdir)/scripttempl/pe.sc ${GEN_DEPENDS}
${GENSCRIPTS} armpe "$(tdir_armpe)"
+earmpalmos.c: $(srcdir)/emulparams/armpalmos.sh $(srcdir)/emulparams/armelf.sh \
+ $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/armpalmos.sc ${GEN_DEPENDS}
+ ${GENSCRIPTS} armpalmos "$(tdir_armpalmos)"
eavr85xx.c: $(srcdir)/emulparams/avr85xx.sh \
$(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/elf32avr.sc \
${GEN_DEPENDS}
@@ -1707,6 +1712,9 @@
em68knbsd.c: $(srcdir)/emulparams/m68knbsd.sh \
$(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/aout.sc ${GEN_DEPENDS}
${GENSCRIPTS} m68knbsd "$(tdir_m68knbsd)"
+em68kpalmos.c: $(srcdir)/emulparams/m68kpalmos.sh \
+ $(srcdir)/emultempl/m68kcoff.em $(srcdir)/scripttempl/m68kpalmos.sc ${GEN_DEPENDS}
+ ${GENSCRIPTS} m68kpalmos "$(tdir_m68kpalmos)"
em68kpsos.c: $(srcdir)/emulparams/m68kpsos.sh \
$(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/psos.sc ${GEN_DEPENDS}
${GENSCRIPTS} m68kpsos "$(tdir_m68kpsos)"
diff -urN orig-binutils-2.14/ld/configure.tgt binutils-2.14/ld/configure.tgt
--- orig-binutils-2.14/ld/configure.tgt 2005-05-31 16:26:53.312500000 +0200
+++ binutils-2.14/ld/configure.tgt 2005-05-31 16:30:00.765625000 +0200
@@ -247,6 +247,7 @@
arm*-*-linux-gnu*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;;
arm*-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;;
arm*-*-conix*) targ_emul=armelf ;;
+arm*-*-palmos*) targ_emul=armpalmos; targ_extra_emuls=armelf ;;
thumb-*-linux-gnu* | thumb-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;;
strongarm-*-coff) targ_emul=armcoff ;;
strongarm-*-elf) targ_emul=armelf ;;
@@ -364,6 +365,7 @@
m68*-*-psos*) targ_emul=m68kpsos ;;
m68*-*-rtemscoff*) targ_emul=m68kcoff ;;
m68*-*-rtems*) targ_emul=m68kelf ;;
+m68*-*-palmos*) targ_emul=m68kpalmos ;;
hppa*64*-*-linux-gnu*) targ_emul=hppa64linux ;;
hppa*64*-*) targ_emul=elf64hppa ;;
hppa*-*-linux-gnu*) targ_emul=hppalinux ;;
diff -urN orig-binutils-2.14/ld/emulparams/armpalmos.sh binutils-2.14/ld/emulparams/armpalmos.sh
--- orig-binutils-2.14/ld/emulparams/armpalmos.sh 1970-01-01 01:00:00.000000000 +0100
+++ binutils-2.14/ld/emulparams/armpalmos.sh 2005-05-31 16:30:00.765625000 +0200
@@ -0,0 +1,6 @@
+. ${srcdir}/emulparams/armelf.sh
+SCRIPT_NAME=armpalmos
+
+GENERATE_COMBRELOC_SCRIPT=yes
+unset GENERATE_SHLIB_SCRIPT
+unset ENTRY
diff -urN orig-binutils-2.14/ld/emulparams/m68kpalmos.sh binutils-2.14/ld/emulparams/m68kpalmos.sh
--- orig-binutils-2.14/ld/emulparams/m68kpalmos.sh 1970-01-01 01:00:00.000000000 +0100
+++ binutils-2.14/ld/emulparams/m68kpalmos.sh 2005-05-31 16:30:00.781250000 +0200
@@ -0,0 +1,4 @@
+SCRIPT_NAME=m68kpalmos
+OUTPUT_FORMAT="coff-m68k"
+ARCH=m68k
+TEMPLATE_NAME=m68kcoff
diff -urN orig-binutils-2.14/ld/emultempl/m68kcoff.em binutils-2.14/ld/emultempl/m68kcoff.em
--- orig-binutils-2.14/ld/emultempl/m68kcoff.em 2005-05-31 16:26:53.718750000 +0200
+++ binutils-2.14/ld/emultempl/m68kcoff.em 2005-05-31 16:30:00.796875000 +0200
@@ -88,22 +88,25 @@
{
asection *relsec;
- relsec = bfd_make_section (abfd, ".emreloc");
+ relsec = bfd_make_section (abfd, ".reloc");
if (relsec == NULL
|| ! bfd_set_section_flags (abfd, relsec,
- (SEC_ALLOC
- | SEC_LOAD
- | SEC_HAS_CONTENTS
+ (SEC_HAS_CONTENTS
| SEC_IN_MEMORY))
|| ! bfd_set_section_alignment (abfd, relsec, 2)
|| ! bfd_set_section_size (abfd, relsec,
datasec->reloc_count * 12))
- einfo ("%F%B: can not create .emreloc section: %E\n");
+ einfo ("%F%B: can not create .reloc section: %E\n");
}
/* Double check that all other data sections are empty, as is
required for embedded PIC code. */
+#if 0
+ /* This is NOT required for embedded PIC. In fact, since we have
+ sections like [be]hook which can be data sections on input but
+ are output in the .text section, this is wrong wrong wrong. */
bfd_map_over_sections (abfd, check_sections, (PTR) datasec);
+#endif
}
}
@@ -146,7 +149,7 @@
if (datasec == NULL || datasec->reloc_count == 0)
continue;
- relsec = bfd_get_section_by_name (abfd, ".emreloc");
+ relsec = bfd_get_section_by_name (abfd, ".reloc");
ASSERT (relsec != NULL);
if (! bfd_m68k_coff_create_embedded_relocs (abfd, &link_info,
diff -urN orig-binutils-2.14/ld/scripttempl/armpalmos.sc binutils-2.14/ld/scripttempl/armpalmos.sc
--- orig-binutils-2.14/ld/scripttempl/armpalmos.sc 1970-01-01 01:00:00.000000000 +0100
+++ binutils-2.14/ld/scripttempl/armpalmos.sc 2005-05-31 16:30:00.796875000 +0200
@@ -0,0 +1,22 @@
+cat <<EOF
+OUTPUT_FORMAT ("${OUTPUT_FORMAT}", "${BIG_OUTPUT_FORMAT}",
+ "${LITTLE_OUTPUT_FORMAT}")
+OUTPUT_ARCH ("${ARCH}")
+
+${RELOCATING+${LIB_SEARCH_DIRS}}
+
+/* This is a pathetically simple linker script that is only of use for
+ building Palm OS 5 armlets, namely stand-alone code that has no global
+ data or other complications. */
+
+SECTIONS
+{
+ .text :
+ {
+ *(.text .rodata)
+ ${RELOCATING+${OTHER_TEXT_SECTIONS}}
+ }
+
+ .disposn : { *(.disposn) }
+}
+EOF
diff -urN orig-binutils-2.14/ld/scripttempl/m68kpalmos.sc binutils-2.14/ld/scripttempl/m68kpalmos.sc
--- orig-binutils-2.14/ld/scripttempl/m68kpalmos.sc 1970-01-01 01:00:00.000000000 +0100
+++ binutils-2.14/ld/scripttempl/m68kpalmos.sc 2005-05-31 16:30:00.812500000 +0200
@@ -0,0 +1,76 @@
+# Note that genscripts.sh strips blank lines, but converts lines
+# matching ^\t$ into blank lines on output. So we use the latter here.
+
+cat <<EOF
+OUTPUT_FORMAT ("${OUTPUT_FORMAT}")
+
+${LIB_SEARCH_DIRS}
+
+/* The LENGTH of coderes determines how large the .text section (which winds
+ up as the final database's main 'code' resource) may be before producing
+ linker errors. Typical values on Palm OS are "about 32K" and "about 64K":
+
+ 32770 is the largest .text section whose start and end can be reached from
+ each other via a 16 bit signed m68k jump (although only the first 32K can
+ be called from other sections, that's enough because no function can start
+ beyond there because it must end in rts);
+
+ 64720 is the largest resource allowable all the way back to Palm OS 1.0;
+
+ 65505 is the largest resource allowable on Palm OS 3.0 and higher. */
+
+MEMORY
+{
+ coderes : ORIGIN = 0x0, LENGTH = 32770
+ datares : ORIGIN = 0x0, LENGTH = 32767
+
+ trap_region : ORIGIN = 0x1000000, LENGTH = 2
+ disposition_region : ORIGIN = 0x1000010, LENGTH = 6
+}
+
+SECTIONS
+{
+ .text :
+ {
+ *(.text)
+ . = ALIGN(4);
+ bhook_start = .;
+ *(bhook)
+ bhook_end = .;
+ . = ALIGN(4);
+ ehook_start = .;
+ *(ehook)
+ ehook_end = .;
+EOF
+if [ -n "${CONSTRUCTING}" ]; then cat <<EOF
+ . = ALIGN(4);
+ ctors_start = .;
+ *(.ctors)
+ ctors_end = .;
+ . = ALIGN(4);
+ dtors_start = .;
+ *(.dtors)
+ dtors_end = .;
+EOF
+fi
+cat <<EOF
+ } > coderes
+ .data :
+ {
+ data_start = .;
+ *(.data)
+ *(.gcc_exc)
+ } > datares
+ .bss :
+ {
+ bss_start = .;
+ *(.bss)
+ *(COMMON)
+ } > datares
+ end = ALIGN( 4 );
+ edata = ALIGN( 4 );
+
+ .trap : { *(.trap) } > trap_region
+ .disposn : { *(.disposn) } > disposition_region
+}
+EOF
diff -urN orig-binutils-2.14/libiberty/fnmatch.c binutils-2.14/libiberty/fnmatch.c
--- orig-binutils-2.14/libiberty/fnmatch.c 2005-05-31 16:27:00.562500000 +0200
+++ binutils-2.14/libiberty/fnmatch.c 2005-05-31 16:30:00.812500000 +0200
@@ -55,7 +55,9 @@
program understand `configure --with-gnu-libc' and omit the object files,
it is simpler to just do this in the source for each such file. */
-#if defined (_LIBC) || !defined (__GNU_LIBRARY__)
+/* [PRC-TOOLS-LOCAL] It's not a waste when you're trying to avoid the New!
+ Improved! glibc-2.2.4 fnmatch GLIBC@2.2.3 dependency. Hack on, dude. */
+#if defined (_LIBC) || !defined (__GNU_LIBRARY__) || 1
#if !defined(__GNU_LIBRARY__) && !defined(STDC_HEADERS)