mirror of
https://github.com/autc04/Retro68.git
synced 2026-10-25 18:02:46 +00:00
433 lines
13 KiB
Diff
433 lines
13 KiB
Diff
diff --git a/binutils/bfd/coff-rs6000.c b/binutils/bfd/coff-rs6000.c
|
|
index 6ad77ba77c..5ffcd2dbf6 100644
|
|
--- a/binutils/bfd/coff-rs6000.c
|
|
+++ b/binutils/bfd/coff-rs6000.c
|
|
@@ -494,7 +494,18 @@ _bfd_xcoff_swap_aux_in (bfd *abfd, void * ext1, int type ATTRIBUTE_UNUSED,
|
|
H_GET_32 (abfd, ext->x_file.x_n.x_n.x_offset);
|
|
}
|
|
else
|
|
- memcpy (in->x_file.x_n.x_fname, ext->x_file.x_n.x_fname, FILNMLEN);
|
|
+ {
|
|
+ if (numaux > 1)
|
|
+ {
|
|
+ if (indx == 0)
|
|
+ memcpy (in->x_file.x_n.x_fname, ext->x_file.x_n.x_fname,
|
|
+ numaux * sizeof (AUXENT));
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ memcpy (in->x_file.x_n.x_fname, ext->x_file.x_n.x_fname, FILNMLEN);
|
|
+ }
|
|
+ }
|
|
in->x_file.x_ftype = H_GET_8 (abfd, ext->x_file.x_ftype);
|
|
break;
|
|
|
|
@@ -3753,7 +3764,8 @@ xcoff_ppc_relocate_section (bfd *output_bfd,
|
|
else
|
|
{
|
|
if (info->unresolved_syms_in_objects != RM_IGNORE
|
|
- && (h->flags & XCOFF_WAS_UNDEFINED) != 0)
|
|
+ && (h->flags & XCOFF_WAS_UNDEFINED) != 0
|
|
+ && h->root.type != bfd_link_hash_undefweak)
|
|
(*info->callbacks->undefined_symbol)
|
|
(info, h->root.root.string,
|
|
input_bfd, input_section,
|
|
@@ -3769,13 +3781,18 @@ xcoff_ppc_relocate_section (bfd *output_bfd,
|
|
+ sec->output_section->vma
|
|
+ sec->output_offset);
|
|
}
|
|
- else if (h->root.type == bfd_link_hash_common)
|
|
- {
|
|
- sec = h->root.u.c.p->section;
|
|
- val = (sec->output_section->vma
|
|
- + sec->output_offset);
|
|
-
|
|
- }
|
|
+ else if (h->root.type == bfd_link_hash_common)
|
|
+ {
|
|
+ sec = h->root.u.c.p->section;
|
|
+ val = (sec->output_section->vma
|
|
+ + sec->output_offset);
|
|
+
|
|
+ }
|
|
+ else if (h->root.type == bfd_link_hash_undefweak)
|
|
+ {
|
|
+ sec = 0;
|
|
+ val = 0;
|
|
+ }
|
|
else
|
|
{
|
|
BFD_ASSERT (bfd_link_relocatable (info)
|
|
diff --git a/binutils/bfd/coffcode.h b/binutils/bfd/coffcode.h
|
|
index 6de6ecdea3..d6e79377a4 100644
|
|
--- a/binutils/bfd/coffcode.h
|
|
+++ b/binutils/bfd/coffcode.h
|
|
@@ -2487,6 +2487,21 @@ coff_print_aux (bfd *abfd ATTRIBUTE_UNUSED,
|
|
BFD_ASSERT (symbol->is_sym);
|
|
BFD_ASSERT (! aux->is_sym);
|
|
#ifdef RS6000COFF_C
|
|
+ if (symbol->u.syment.n_sclass == C_FILE)
|
|
+ {
|
|
+ if (aux->u.auxent.x_file.x_n.x_n.x_zeroes)
|
|
+ {
|
|
+ fprintf (file, "File \"%s\"", aux->u.auxent.x_file.x_n.x_fname);
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ const char * string_table = obj_coff_strings(abfd);
|
|
+
|
|
+ fprintf (file, "File \"%s\"", string_table + aux->u.auxent.x_file.x_n.x_n.x_offset);
|
|
+ }
|
|
+ return true;
|
|
+ }
|
|
+
|
|
if (CSECT_SYM_P (symbol->u.syment.n_sclass)
|
|
&& indaux + 1 == symbol->u.syment.n_numaux)
|
|
{
|
|
diff --git a/binutils/bfd/config.bfd b/binutils/bfd/config.bfd
|
|
index a4c6c8e885..e9135e2113 100644
|
|
--- a/binutils/bfd/config.bfd
|
|
+++ b/binutils/bfd/config.bfd
|
|
@@ -1163,6 +1163,8 @@ case "${targ}" in
|
|
targ_archs="$targ_archs bfd_i386_arch"
|
|
;;
|
|
powerpc-*-macos*)
|
|
+ targ_cflags=-DAIX_WEAK_SUPPORT
|
|
+ targ_selvecs=powerpc_xcoff_vec
|
|
targ_defvec=powerpc_xcoff_vec
|
|
;;
|
|
powerpc-*-lynxos*)
|
|
diff --git a/binutils/bfd/elflink.c b/binutils/bfd/elflink.c
|
|
index 2b1450fa4e..db296093f9 100644
|
|
--- a/binutils/bfd/elflink.c
|
|
+++ b/binutils/bfd/elflink.c
|
|
@@ -13789,6 +13789,23 @@ _bfd_elf_gc_mark (struct bfd_link_info *info,
|
|
if (!_bfd_elf_gc_mark (info, group_sec, gc_mark_hook))
|
|
return false;
|
|
|
|
+ { /* keep macsbug sections */
|
|
+ asection *next_sec = sec->next;
|
|
+ if(next_sec)
|
|
+ {
|
|
+ const char *p = sec->name, *q = next_sec->name;
|
|
+
|
|
+ while(*p && *q && *p == *q)
|
|
+ p++, q++;
|
|
+
|
|
+ if(*p == 0 && strcmp(q, ".macsbug") == 0)
|
|
+ if(!next_sec->gc_mark)
|
|
+ if (!_bfd_elf_gc_mark (info, next_sec, gc_mark_hook))
|
|
+ return false;
|
|
+
|
|
+ }
|
|
+ }
|
|
+
|
|
/* Look through the section relocs. */
|
|
ret = true;
|
|
eh_frame = elf_eh_frame_section (sec->owner);
|
|
diff --git a/binutils/bfd/targets.c b/binutils/bfd/targets.c
|
|
index 3284bb88aa..f4043efaa6 100644
|
|
--- a/binutils/bfd/targets.c
|
|
+++ b/binutils/bfd/targets.c
|
|
@@ -1233,7 +1233,7 @@ static const bfd_target * const _bfd_target_vector[] =
|
|
&powerpc_elf64_fbsd_vec,
|
|
&powerpc_elf64_fbsd_le_vec,
|
|
#endif
|
|
-#if 0
|
|
+#if 1
|
|
/* This has the same magic number as RS/6000. */
|
|
&powerpc_xcoff_vec,
|
|
#endif
|
|
diff --git a/binutils/bfd/xcofflink.c b/binutils/bfd/xcofflink.c
|
|
index 8346977520..8b55e09c37 100644
|
|
--- a/binutils/bfd/xcofflink.c
|
|
+++ b/binutils/bfd/xcofflink.c
|
|
@@ -1903,6 +1903,12 @@ xcoff_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
|
|
}
|
|
csect = section;
|
|
value = sym.n_value - csect->vma;
|
|
+
|
|
+ // RetroPPC: keep constructors & exception tables
|
|
+ if(strncmp(name, "_GLOBAL__", 9) == 0)
|
|
+ {
|
|
+ csect->flags |= SEC_KEEP;
|
|
+ }
|
|
}
|
|
break;
|
|
|
|
@@ -1959,7 +1965,9 @@ xcoff_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
|
|
if (xcoff_link_add_symbols_to_hash_table (sym, aux))
|
|
{
|
|
csect->flags |= SEC_IS_COMMON;
|
|
- csect->size = 0;
|
|
+ // Retro68: see AutomatedTests/LocalStatic.cc
|
|
+ if (sym.n_sclass != C_AIX_WEAKEXT)
|
|
+ csect->size = 0;
|
|
section = csect;
|
|
value = aux.x_csect.x_scnlen.l;
|
|
}
|
|
@@ -2166,8 +2174,12 @@ xcoff_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
|
|
{
|
|
if ((*sym_hash)->root.type != bfd_link_hash_common
|
|
|| (*sym_hash)->root.u.c.p->section != csect)
|
|
- /* We don't need the common csect we just created. */
|
|
- csect->size = 0;
|
|
+ {
|
|
+ // Retro68: see AutomatedTests/LocalStatic.cc
|
|
+ if ((*sym_hash)->root.type != bfd_link_hash_defweak)
|
|
+ /* We don't need the common csect we just created. */
|
|
+ csect->size = 0;
|
|
+ }
|
|
else
|
|
(*sym_hash)->root.u.c.p->alignment_power
|
|
= csect->alignment_power;
|
|
@@ -2935,8 +2947,10 @@ xcoff_mark_symbol (struct bfd_link_info *info, struct xcoff_link_hash_entry *h)
|
|
|
|
/* Treat this symbol as undefined if the descriptor was. */
|
|
if ((hds->flags & XCOFF_WAS_UNDEFINED) != 0)
|
|
- h->flags |= XCOFF_WAS_UNDEFINED;
|
|
-
|
|
+ {
|
|
+ if(h->root.type != bfd_link_hash_undefweak)
|
|
+ h->flags |= XCOFF_WAS_UNDEFINED;
|
|
+ }
|
|
/* Allocate room for the global linkage code itself. */
|
|
sec = xcoff_hash_table (info)->linkage_section;
|
|
h->root.type = bfd_link_hash_defined;
|
|
@@ -3924,6 +3938,10 @@ bfd_xcoff_size_dynamic_sections (bfd *output_bfd,
|
|
}
|
|
}
|
|
}
|
|
+ // mark entry point, the XCOFF_ENTRY flag is needed later
|
|
+ if (entry != NULL
|
|
+ && !xcoff_mark_symbol_by_name (info, entry, XCOFF_ENTRY))
|
|
+ goto error_return;
|
|
}
|
|
else
|
|
{
|
|
@@ -3936,6 +3954,20 @@ bfd_xcoff_size_dynamic_sections (bfd *output_bfd,
|
|
if (info->fini_function != NULL
|
|
&& !xcoff_mark_symbol_by_name (info, info->fini_function, 0))
|
|
goto error_return;
|
|
+
|
|
+ // RetroPPC: mark sections with SEC_KEEP flag set
|
|
+ for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
|
|
+ {
|
|
+ asection *o;
|
|
+
|
|
+ for (o = sub->sections; o != NULL; o = o->next)
|
|
+ {
|
|
+ if (o->flags & SEC_KEEP)
|
|
+ xcoff_mark(info, o);
|
|
+ }
|
|
+ }
|
|
+
|
|
+
|
|
if (auto_export_flags != 0)
|
|
{
|
|
xcoff_link_hash_traverse (xcoff_hash_table (info),
|
|
diff --git a/binutils/binutils/configure b/binutils/binutils/configure
|
|
index 0270c7b9c1..49d3019e5b 100755
|
|
--- a/binutils/binutils/configure
|
|
+++ b/binutils/binutils/configure
|
|
@@ -14718,7 +14718,8 @@ do
|
|
;;
|
|
powerpc*-aix5.[01])
|
|
;;
|
|
- powerpc*-aix[5-9].*)
|
|
+ powerpc*-aix[5-9].* \
|
|
+ | powerpc-*-macos)
|
|
OBJDUMP_DEFS="-DAIX_WEAK_SUPPORT"
|
|
;;
|
|
powerpc*-*-linux* | powerpc*-*-elf* | powerpc*-*-eabi*)
|
|
diff --git a/binutils/binutils/configure.ac b/binutils/binutils/configure.ac
|
|
index e204a201a0..e351b4767f 100644
|
|
--- a/binutils/binutils/configure.ac
|
|
+++ b/binutils/binutils/configure.ac
|
|
@@ -401,8 +401,9 @@ changequote(,)dnl
|
|
changequote([,])dnl
|
|
;;
|
|
changequote(,)dnl
|
|
- powerpc*-aix[5-9].*)
|
|
+ powerpc*-aix[5-9].* \
|
|
changequote([,])dnl
|
|
+ | powerpc-*-macos)
|
|
OBJDUMP_DEFS="-DAIX_WEAK_SUPPORT"
|
|
;;
|
|
powerpc*-*-linux* | powerpc*-*-elf* | powerpc*-*-eabi*)
|
|
diff --git a/binutils/configure b/binutils/configure
|
|
index be433ef6d5..0090a06bf3 100755
|
|
--- a/binutils/configure
|
|
+++ b/binutils/configure
|
|
@@ -2792,7 +2792,7 @@ host_libs="intl libiberty opcodes bfd readline tcl tk itcl libgui zlib libbacktr
|
|
# binutils, gas and ld appear in that order because it makes sense to run
|
|
# "make check" in that particular order.
|
|
# If --enable-gold is used, "gold" may replace "ld".
|
|
-host_tools="texinfo flex bison binutils gas ld fixincludes gcc cgen sid sim gdb gdbserver gprof etc expect dejagnu m4 utils guile fastjar gnattools libcc1 gotools"
|
|
+host_tools="texinfo flex bison binutils gas ld fixincludes gcc cgen sid sim gdb gprof etc expect dejagnu m4 utils guile fastjar gnattools libcc1 gotools"
|
|
|
|
# these libraries are built for the target environment, and are built after
|
|
# the host libraries and the host tools (which may be a cross compiler)
|
|
diff --git a/binutils/gas/configure b/binutils/gas/configure
|
|
index 1c614b469d..169b44fc16 100755
|
|
--- a/binutils/gas/configure
|
|
+++ b/binutils/gas/configure
|
|
@@ -12057,7 +12057,8 @@ $as_echo "#define STRICTCOFF 1" >>confdefs.h
|
|
microblaze*)
|
|
;;
|
|
|
|
- ppc-*-aix[5-9].*)
|
|
+ ppc-*-aix[5-9].* \
|
|
+ | ppc-*-macos*)
|
|
|
|
$as_echo "#define AIX_WEAK_SUPPORT 1" >>confdefs.h
|
|
|
|
diff --git a/binutils/gas/configure.ac b/binutils/gas/configure.ac
|
|
index 21795a82bd..3728ec34dc 100644
|
|
--- a/binutils/gas/configure.ac
|
|
+++ b/binutils/gas/configure.ac
|
|
@@ -264,8 +264,9 @@ for this_target in $target $canon_targets ; do
|
|
;;
|
|
|
|
changequote(,)dnl
|
|
- ppc-*-aix[5-9].*)
|
|
+ ppc-*-aix[5-9].* \
|
|
changequote([,])dnl
|
|
+ | ppc-*-macos*)
|
|
AC_DEFINE(AIX_WEAK_SUPPORT, 1,
|
|
[Define if using AIX 5.2 value for C_WEAKEXT.])
|
|
;;
|
|
diff --git a/binutils/gas/configure.tgt b/binutils/gas/configure.tgt
|
|
index 62f806bdfe..6e26a0d089 100644
|
|
--- a/binutils/gas/configure.tgt
|
|
+++ b/binutils/gas/configure.tgt
|
|
@@ -290,6 +290,7 @@ case ${generic_target} in
|
|
m68hc12-*-* | m6812-*-*) fmt=elf ;;
|
|
|
|
m68k-*-elf*) fmt=elf ;;
|
|
+ m68k-*-macos*) fmt=elf ;;
|
|
m68k-*-sysv4*) fmt=elf em=svr4 ;;
|
|
m68k-*-linux-*) fmt=elf em=linux ;;
|
|
m68k-*-uclinux*) fmt=elf em=uclinux ;;
|
|
@@ -357,7 +358,7 @@ case ${generic_target} in
|
|
ppc-*-aix5.[01]) fmt=coff em=aix5 ;;
|
|
ppc-*-aix[5-9].*) fmt=coff em=aix5 ;;
|
|
ppc-*-aix*) fmt=coff em=aix ;;
|
|
- ppc-*-beos*) fmt=coff ;;
|
|
+ ppc-*-beos*) fmt=coff ;;
|
|
ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;;
|
|
ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;;
|
|
ppc-*-haiku*) fmt=elf em=haiku ;;
|
|
diff --git a/binutils/ld/emulparams/ppcmacos.sh b/binutils/ld/emulparams/ppcmacos.sh
|
|
index 9f02af404f..12e437ddd5 100644
|
|
--- a/binutils/ld/emulparams/ppcmacos.sh
|
|
+++ b/binutils/ld/emulparams/ppcmacos.sh
|
|
@@ -1,5 +1,5 @@
|
|
TEMPLATE_NAME=aix
|
|
-SCRIPT_NAME=aix
|
|
+SCRIPT_NAME=ppcmacos
|
|
OUTPUT_FORMAT="xcoff-powermac"
|
|
OUTPUT_FORMAT_32BIT="xcoff-powermac"
|
|
OUTPUT_FORMAT_64BIT="xcoff-powermac"
|
|
diff --git a/binutils/ld/scripttempl/ppcmacos.sc b/binutils/ld/scripttempl/ppcmacos.sc
|
|
new file mode 100644
|
|
index 0000000000..5dd1f66d5e
|
|
--- /dev/null
|
|
+++ b/binutils/ld/scripttempl/ppcmacos.sc
|
|
@@ -0,0 +1,75 @@
|
|
+# AIX linker script.
|
|
+# AIX always uses shared libraries. The section VMA appears to be
|
|
+# unimportant. The native linker aligns the sections on boundaries
|
|
+# specified by the -H option.
|
|
+#
|
|
+# Copyright (C) 2014 Free Software Foundation, Inc.
|
|
+#
|
|
+# Copying and distribution of this file, with or without modification,
|
|
+# are permitted in any medium without royalty provided the copyright
|
|
+# notice and this notice are preserved.
|
|
+
|
|
+cat <<EOF
|
|
+/* Copyright (C) 2014 Free Software Foundation, Inc.
|
|
+
|
|
+ Copying and distribution of this script, with or without modification,
|
|
+ are permitted in any medium without royalty provided the copyright
|
|
+ notice and this notice are preserved. */
|
|
+
|
|
+OUTPUT_ARCH(${ARCH})
|
|
+${RELOCATING+${LIB_SEARCH_DIRS}}
|
|
+${RELOCATING+ENTRY (__start)}
|
|
+SECTIONS
|
|
+{
|
|
+ .pad 0 : { *(.pad) }
|
|
+
|
|
+ . = ALIGN (0x10000000 + SIZEOF_HEADERS, 32);
|
|
+ .text 0 : {
|
|
+ ${RELOCATING+PROVIDE (_text = .);}
|
|
+ *(.text)
|
|
+ *(.pr)
|
|
+ *(.ro)
|
|
+ *(.db)
|
|
+ *(.gl)
|
|
+ *(.xo)
|
|
+ *(.ti)
|
|
+ *(.tb)
|
|
+ ${RELOCATING+PROVIDE (_etext = .);}
|
|
+ }
|
|
+
|
|
+ . = ALIGN (ALIGN (0x10000000) + (. & 0xfff), 32);
|
|
+ .data 0 : {
|
|
+ ${RELOCATING+PROVIDE (_data = .);}
|
|
+ *(.data)
|
|
+ *(.rw)
|
|
+ *(.sv)
|
|
+ *(.sv64)
|
|
+ *(.sv3264)
|
|
+ *(.ua)
|
|
+ . = ALIGN(4);
|
|
+ ${CONSTRUCTING+CONSTRUCTORS}
|
|
+ *(.ds)
|
|
+ *(.tc0)
|
|
+ *(.tc)
|
|
+ *(.td)
|
|
+ ${RELOCATING+PROVIDE (_edata = .);}
|
|
+ }
|
|
+ .bss : {
|
|
+ *(.tocbss)
|
|
+ *(.bss)
|
|
+ *(.bs)
|
|
+ *(.uc)
|
|
+ *(COMMON)
|
|
+ ${RELOCATING+PROVIDE (_end = .);}
|
|
+ ${RELOCATING+PROVIDE (end = .);}
|
|
+ }
|
|
+
|
|
+ .loader : {
|
|
+ *(.loader)
|
|
+ }
|
|
+
|
|
+ .debug : {
|
|
+ *(.debug)
|
|
+ }
|
|
+}
|
|
+EOF
|
|
diff --git a/binutils/zlib/zutil.h b/binutils/zlib/zutil.h
|
|
index d9a20ae1bf..3b9daef749 100644
|
|
--- a/binutils/zlib/zutil.h
|
|
+++ b/binutils/zlib/zutil.h
|
|
@@ -139,15 +139,6 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
|
|
|
|
#if defined(MACOS) || defined(TARGET_OS_MAC)
|
|
# define OS_CODE 7
|
|
-# ifndef Z_SOLO
|
|
-# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
|
|
-# include <unix.h> /* for fdopen */
|
|
-# else
|
|
-# ifndef fdopen
|
|
-# define fdopen(fd,mode) NULL /* No fdopen() */
|
|
-# endif
|
|
-# endif
|
|
-# endif
|
|
#endif
|
|
|
|
#ifdef __acorn
|