diff options
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 7 | ||||
-rw-r--r-- | bfd/elf32-ppc.c | 71 | ||||
-rw-r--r-- | bfd/hash.c | 2 | ||||
-rw-r--r-- | bfd/linker.c | 2 |
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 @@ -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. |