aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog7
-rw-r--r--bfd/elf32-ppc.c71
-rw-r--r--bfd/hash.c2
-rw-r--r--bfd/linker.c2
4 files changed, 47 insertions, 35 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index d1e1af2..3dc61ec 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,10 @@
+1999-06-04 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
+
+ * elf32-ppc.c (ppc_elf_relocate_section): Don't barf on out of
+ range undefweak symbols.
+ * hash.c: Add missing comma after @xref{}
+ * linker.c: Likewise.
+
1999-06-04 Nick Clifton <nickc@cygnus.com>
* elfxx-target.h (ELF_MAXPAGESIZE): Produce an error message
diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c
index 25bb24a..b84b863 100644
--- a/bfd/elf32-ppc.c
+++ b/bfd/elf32-ppc.c
@@ -3751,47 +3751,52 @@ ppc_elf_relocate_section (output_bfd, info, input_bfd, input_section,
relocation,
addend);
- if (r != bfd_reloc_ok)
+ if (r == bfd_reloc_ok)
+ ;
+ else if (r == bfd_reloc_overflow)
{
- ret = false;
- switch (r)
+ const char *name;
+
+ if (h != NULL)
{
- default:
- break;
+ if (h->root.type == bfd_link_hash_undefweak
+ && howto->pc_relative)
+ {
+ /* Assume this is a call protected by other code that
+ detect the symbol is undefined. If this is the case,
+ we can safely ignore the overflow. If not, the
+ program is hosed anyway, and a little warning isn't
+ going to help. */
- case bfd_reloc_overflow:
- {
- const char *name;
-
- if (h != NULL)
- name = h->root.root.string;
- else
- {
- name = bfd_elf_string_from_elf_section (input_bfd,
- symtab_hdr->sh_link,
- sym->st_name);
- if (name == NULL)
- break;
-
- if (*name == '\0')
- name = bfd_section_name (input_bfd, sec);
- }
-
- (*info->callbacks->reloc_overflow)(info,
- name,
- howto->name,
- (bfd_vma) 0,
- input_bfd,
- input_section,
- offset);
- }
- break;
+ continue;
+ }
+ name = h->root.root.string;
+ }
+ else
+ {
+ name = bfd_elf_string_from_elf_section (input_bfd,
+ symtab_hdr->sh_link,
+ sym->st_name);
+ if (name == NULL)
+ continue;
+ if (*name == '\0')
+ name = bfd_section_name (input_bfd, sec);
}
+
+ (*info->callbacks->reloc_overflow)(info,
+ name,
+ howto->name,
+ (bfd_vma) 0,
+ input_bfd,
+ input_section,
+ offset);
+ ret = false;
}
+ else
+ ret = false;
}
-
#ifdef DEBUG
fprintf (stderr, "\n");
#endif
diff --git a/bfd/hash.c b/bfd/hash.c
index 4c6e987..0973040 100644
--- a/bfd/hash.c
+++ b/bfd/hash.c
@@ -73,7 +73,7 @@ SUBSECTION
The function <<bfd_hash_table_init>> take as an argument a
function to use to create new entries. For a basic hash
table, use the function <<bfd_hash_newfunc>>. @xref{Deriving
- a New Hash Table Type} for why you would want to use a
+ a New Hash Table Type}, for why you would want to use a
different value for this argument.
@findex bfd_hash_allocate
diff --git a/bfd/linker.c b/bfd/linker.c
index 947514c..b1fb621 100644
--- a/bfd/linker.c
+++ b/bfd/linker.c
@@ -74,7 +74,7 @@ SUBSECTION
@cindex target vector (_bfd_link_hash_table_create)
The linker routines must create a hash table, which must be
derived from <<struct bfd_link_hash_table>> described in
- <<bfdlink.c>>. @xref{Hash Tables} for information on how to
+ <<bfdlink.c>>. @xref{Hash Tables}, for information on how to
create a derived hash table. This entry point is called using
the target vector of the linker output file.