summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog8
-rw-r--r--bfd/coff-h8300.c62
2 files changed, 50 insertions, 20 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index ebddfde18e3..14a8d77d31e 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,11 @@
+2002-12-19 Alan Modra <amodra@bigpond.net.au>
+
+ * coff-h8300.c: Include libiberty.h.
+ (h8300_reloc16_extra_cases): Check the hash table creator before
+ referencing h8300 specific fields. Stash the hash table pointer
+ in a local var. Comment typo fixes.
+ (h8300_bfd_link_add_symbols): Likewise.
+
2002-12-17 Roger Sayle <roger@eyesopen.com>
* configure.host (ia64-*-hpux*): Support 64 bit targets using
diff --git a/bfd/coff-h8300.c b/bfd/coff-h8300.c
index d078d9114f8..7e5da521595 100644
--- a/bfd/coff-h8300.c
+++ b/bfd/coff-h8300.c
@@ -28,6 +28,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "coff/h8300.h"
#include "coff/internal.h"
#include "libcoff.h"
+#include "libiberty.h"
#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (1)
@@ -1083,7 +1084,25 @@ h8300_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_ptr,
const char *name;
struct funcvec_hash_table *ftab;
struct funcvec_hash_entry *h;
- asection *vectors_sec = h8300_coff_hash_table (link_info)->vectors_sec;
+ struct h8300_coff_link_hash_table *htab;
+ asection *vectors_sec;
+
+ if (link_info->hash->creator != abfd->xvec)
+ {
+ (*_bfd_error_handler)
+ (_("cannot handle R_MEM_INDIRECT reloc when using %s output"),
+ link_info->hash->creator->name);
+
+ /* What else can we do? This function doesn't allow return
+ of an error, and we don't want to call abort as that
+ indicates an internal error. */
+#ifndef EXIT_FAILURE
+#define EXIT_FAILURE 1
+#endif
+ xexit (EXIT_FAILURE);
+ }
+ htab = h8300_coff_hash_table (link_info);
+ vectors_sec = htab->vectors_sec;
/* First see if this is a reloc against the absolute symbol
or against a symbol with a nonnegative value <= 0xff. */
@@ -1132,12 +1151,12 @@ h8300_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_ptr,
name = new_name;
}
- ftab = h8300_coff_hash_table (link_info)->funcvec_hash_table;
+ ftab = htab->funcvec_hash_table;
h = funcvec_hash_lookup (ftab, name, false, false);
/* This shouldn't ever happen. If it does that means we've got
data corruption of some kind. Aborting seems like a reasonable
- think to do here. */
+ thing to do here. */
if (h == NULL || vectors_sec == NULL)
abort ();
@@ -1206,24 +1225,30 @@ h8300_bfd_link_add_symbols (abfd, info)
asection *sec;
struct funcvec_hash_table *funcvec_hash_table;
bfd_size_type amt;
+ struct h8300_coff_link_hash_table *htab;
+
+ /* Add the symbols using the generic code. */
+ _bfd_generic_link_add_symbols (abfd, info);
+
+ if (info->hash->creator != abfd->xvec)
+ return true;
+
+ htab = h8300_coff_hash_table (info);
/* If we haven't created a vectors section, do so now. */
- if (!h8300_coff_hash_table (info)->vectors_sec)
+ if (!htab->vectors_sec)
{
flagword flags;
/* Make sure the appropriate flags are set, including SEC_IN_MEMORY. */
flags = (SEC_ALLOC | SEC_LOAD
| SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_READONLY);
- h8300_coff_hash_table (info)->vectors_sec = bfd_make_section (abfd,
- ".vectors");
+ htab->vectors_sec = bfd_make_section (abfd, ".vectors");
/* If the section wasn't created, or we couldn't set the flags,
- quit quickly now, rather than dieing a painful death later. */
- if (! h8300_coff_hash_table (info)->vectors_sec
- || ! bfd_set_section_flags (abfd,
- h8300_coff_hash_table(info)->vectors_sec,
- flags))
+ quit quickly now, rather than dying a painful death later. */
+ if (! htab->vectors_sec
+ || ! bfd_set_section_flags (abfd, htab->vectors_sec, flags))
return false;
/* Also create the vector hash table. */
@@ -1242,14 +1267,11 @@ h8300_bfd_link_add_symbols (abfd, info)
}
/* Store away a pointer to the funcvec hash table. */
- h8300_coff_hash_table (info)->funcvec_hash_table = funcvec_hash_table;
+ htab->funcvec_hash_table = funcvec_hash_table;
}
/* Load up the function vector hash table. */
- funcvec_hash_table = h8300_coff_hash_table (info)->funcvec_hash_table;
-
- /* Add the symbols using the generic code. */
- _bfd_generic_link_add_symbols (abfd, info);
+ funcvec_hash_table = htab->funcvec_hash_table;
/* Now scan the relocs for all the sections in this bfd; create
additional space in the .vectors section as needed. */
@@ -1314,7 +1336,7 @@ h8300_bfd_link_add_symbols (abfd, info)
}
/* Look this symbol up in the function vector hash table. */
- ftab = h8300_coff_hash_table (info)->funcvec_hash_table;
+ ftab = htab->funcvec_hash_table;
h = funcvec_hash_lookup (ftab, name, false, false);
/* If this symbol isn't already in the hash table, add
@@ -1331,10 +1353,10 @@ h8300_bfd_link_add_symbols (abfd, info)
/* Bump the size of the vectors section. Each vector
takes 2 bytes on the h8300 and 4 bytes on the h8300h. */
if (bfd_get_mach (abfd) == bfd_mach_h8300)
- h8300_coff_hash_table (info)->vectors_sec->_raw_size += 2;
+ htab->vectors_sec->_raw_size += 2;
else if (bfd_get_mach (abfd) == bfd_mach_h8300h
|| bfd_get_mach (abfd) == bfd_mach_h8300s)
- h8300_coff_hash_table (info)->vectors_sec->_raw_size += 4;
+ htab->vectors_sec->_raw_size += 4;
}
}
}
@@ -1345,7 +1367,7 @@ h8300_bfd_link_add_symbols (abfd, info)
/* Now actually allocate some space for the function vector. It's
wasteful to do this more than once, but this is easier. */
- sec = h8300_coff_hash_table (info)->vectors_sec;
+ sec = htab->vectors_sec;
if (sec->_raw_size != 0)
{
/* Free the old contents. */