aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog12
-rw-r--r--bfd/aoutf1.h117
-rw-r--r--bfd/aoutx.h21
-rw-r--r--bfd/libaout.h5
4 files changed, 66 insertions, 89 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index ba0d2ec..f43cfe8 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,15 @@
+Mon Jun 13 14:20:07 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com)
+
+ * aoutf1.h (aout_32_sunos4_write_object_contents): Handle a
+ machine type of 68000.
+ * aoutx.h (NAME(aout,machine_type)): Add new argument unknown.
+ Set *unknown to true if machine type is really unknown, as opposed
+ to M_UNKNOWN for the 68000.
+ (NAME(aout,set_arch_mach)): Change NAME(aout,machine_type) call
+ accordingly.
+ * libaout.h (NAME(aout,machine_type)): Add new argument to
+ prototype.
+
Sun Jun 12 20:21:03 1994 Jeff Law (law@snake.cs.utah.edu)
* som.c (EXEC_AUX_ID): Define based on availablity of HPUX_AUX_ID
diff --git a/bfd/aoutf1.h b/bfd/aoutf1.h
index 167f828..d78de7f 100644
--- a/bfd/aoutf1.h
+++ b/bfd/aoutf1.h
@@ -63,7 +63,7 @@ The name put into the target vector.
/*SUPPRESS558*/
/*SUPPRESS529*/
-void
+static void
#if ARCH_SIZE == 64
sunos_64_set_arch_mach
#else
@@ -170,6 +170,9 @@ aout_32_sunos4_write_object_contents
case bfd_arch_m68k:
switch (bfd_get_mach (abfd))
{
+ case 68000:
+ N_SET_MACHTYPE (*execp, M_UNKNOWN);
+ break;
case 68010:
N_SET_MACHTYPE (*execp, M_68010);
break;
@@ -194,85 +197,10 @@ aout_32_sunos4_write_object_contents
choose_reloc_size (abfd);
-#if 0
- /* Some tools want this to be 0, some tools want this to be one.
- Today, it seems that 0 is the most important setting (PR1927) */
- N_SET_FLAGS (*execp, 0x0);
-#else
-
- /* Fri Jun 11 14:23:31 PDT 1993
- FIXME
- Today's optimal setting is 1. This is a pain, since it
- reopens 1927. This should be readdressed by creating a new
- target for each each supported, giving perhaps sun3/m68k
- and sun4/sparc a.out formats.
- */
- N_SET_FLAGS (*execp, 1);
-#endif
+ N_SET_FLAGS (*execp, aout_backend_info (abfd)->exec_hdr_flags);
N_SET_DYNAMIC (*execp, bfd_get_file_flags (abfd) & DYNAMIC);
- /* At least for SunOS, the dynamic symbols and relocs are embedded
- in the .text section, and we do not want to write them out with
- the symbol table. FIXME: This may be right if there is any other
- form of a.out shared libraries. */
- if ((bfd_get_file_flags (abfd) & DYNAMIC) != 0
- && bfd_get_outsymbols (abfd) != (asymbol **) NULL)
- {
- bfd_size_type i;
- asymbol **sym_ptr_ptr;
- bfd_size_type count;
- arelent **rel_ptr_ptr;
-
- sym_ptr_ptr = bfd_get_outsymbols (abfd);
- count = bfd_get_symcount (abfd);
- for (i = 0; i < count; i++, sym_ptr_ptr++)
- {
- if (((*sym_ptr_ptr)->flags & BSF_DYNAMIC) != 0)
- {
- /* This assumes that all dynamic symbols follow all
- non-dynamic symbols, which is what slurp_symbol_table
- does. */
- *sym_ptr_ptr = NULL;
- bfd_get_symcount (abfd) = i;
- break;
- }
- }
-
- if (obj_textsec (abfd)->reloc_count > 0)
- {
- rel_ptr_ptr = obj_textsec (abfd)->orelocation;
- count = obj_textsec (abfd)->reloc_count;
- for (i = 0; i < count; i++, rel_ptr_ptr++)
- {
- if (((*(*rel_ptr_ptr)->sym_ptr_ptr)->flags & BSF_DYNAMIC) != 0)
- {
- /* This assumes that all relocs against dynamic
- symbols follow all relocs against other symbols,
- which is what slurp_reloc_table does. */
- *rel_ptr_ptr = NULL;
- obj_textsec (abfd)->reloc_count = i;
- break;
- }
- }
- }
-
- if (obj_datasec (abfd)->reloc_count > 0)
- {
- rel_ptr_ptr = obj_datasec (abfd)->orelocation;
- count = obj_datasec (abfd)->reloc_count;
- for (i = 0; i < count; i++, rel_ptr_ptr++)
- {
- if (((*(*rel_ptr_ptr)->sym_ptr_ptr)->flags & BSF_DYNAMIC) != 0)
- {
- *rel_ptr_ptr = NULL;
- obj_datasec (abfd)->reloc_count = i;
- break;
- }
- }
- }
- }
-
WRITE_HEADERS (abfd, execp);
return true;
@@ -690,22 +618,45 @@ sunos4_set_sizes (abfd)
}
}
-#ifndef MY_read_dynamic_symbols
-#define MY_read_dynamic_symbols 0
+/* We default to setting the toolversion field to 1, as is required by
+ SunOS. */
+#ifndef MY_exec_hdr_flags
+#define MY_exec_hdr_flags 1
+#endif
+
+#ifndef MY_add_dynamic_symbols
+#define MY_add_dynamic_symbols 0
+#endif
+#ifndef MY_add_one_symbol
+#define MY_add_one_symbol 0
+#endif
+#ifndef MY_link_dynamic_object
+#define MY_link_dynamic_object 0
+#endif
+#ifndef MY_write_dynamic_symbol
+#define MY_write_dynamic_symbol 0
+#endif
+#ifndef MY_check_dynamic_reloc
+#define MY_check_dynamic_reloc 0
#endif
-#ifndef MY_read_dynamic_relocs
-#define MY_read_dynamic_relocs 0
+#ifndef MY_finish_dynamic_link
+#define MY_finish_dynamic_link 0
#endif
static CONST struct aout_backend_data sunos4_aout_backend =
{
0, /* zmagic files are not contiguous */
1, /* text includes header */
+ MY_exec_hdr_flags,
0, /* default text vma */
sunos4_set_sizes,
0, /* header is counted in zmagic text */
- MY_read_dynamic_symbols,
- MY_read_dynamic_relocs
+ MY_add_dynamic_symbols,
+ MY_add_one_symbol,
+ MY_link_dynamic_object,
+ MY_write_dynamic_symbol,
+ MY_check_dynamic_reloc,
+ MY_finish_dynamic_link
};
#define MY_core_file_failing_command sunos4_core_file_failing_command
diff --git a/bfd/aoutx.h b/bfd/aoutx.h
index 742f79d..dcee1fa 100644
--- a/bfd/aoutx.h
+++ b/bfd/aoutx.h
@@ -625,13 +625,15 @@ DESCRIPTION
*/
enum machine_type
-NAME(aout,machine_type) (arch, machine)
+NAME(aout,machine_type) (arch, machine, unknown)
enum bfd_architecture arch;
unsigned long machine;
+ boolean *unknown;
{
enum machine_type arch_flags;
arch_flags = M_UNKNOWN;
+ *unknown = true;
switch (arch) {
case bfd_arch_sparc:
@@ -641,7 +643,7 @@ NAME(aout,machine_type) (arch, machine)
case bfd_arch_m68k:
switch (machine) {
case 0: arch_flags = M_68010; break;
- case 68000: arch_flags = M_UNKNOWN; break;
+ case 68000: arch_flags = M_UNKNOWN; *unknown = false; break;
case 68010: arch_flags = M_68010; break;
case 68020: arch_flags = M_68020; break;
default: arch_flags = M_UNKNOWN; break;
@@ -671,6 +673,10 @@ NAME(aout,machine_type) (arch, machine)
default:
arch_flags = M_UNKNOWN;
}
+
+ if (arch_flags != M_UNKNOWN)
+ *unknown = false;
+
return arch_flags;
}
@@ -700,9 +706,14 @@ NAME(aout,set_arch_mach) (abfd, arch, machine)
if (! bfd_default_set_arch_mach (abfd, arch, machine))
return false;
- if (arch != bfd_arch_unknown &&
- NAME(aout,machine_type) (arch, machine) == M_UNKNOWN)
- return false; /* We can't represent this type */
+ if (arch != bfd_arch_unknown)
+ {
+ boolean unknown;
+
+ NAME(aout,machine_type) (arch, machine, &unknown);
+ if (unknown)
+ return false;
+ }
/* Determine the size of a relocation entry */
switch (arch) {
diff --git a/bfd/libaout.h b/bfd/libaout.h
index 8f7222b..71b699e 100644
--- a/bfd/libaout.h
+++ b/bfd/libaout.h
@@ -61,6 +61,8 @@ struct reloc_std_external;
struct aout_link_hash_entry
{
struct bfd_link_hash_entry root;
+ /* Whether this symbol has been written out. */
+ boolean written;
/* Symbol index in output file. */
int indx;
};
@@ -375,7 +377,8 @@ NAME(aout,mkobject) PARAMS ((bfd *abfd));
enum machine_type
NAME(aout,machine_type) PARAMS ((enum bfd_architecture arch,
- unsigned long machine));
+ unsigned long machine,
+ boolean *unknown));
boolean
NAME(aout,set_arch_mach) PARAMS ((bfd *abfd, enum bfd_architecture arch,