aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2004-03-20 23:16:43 +0000
committerH.J. Lu <hjl.tools@gmail.com>2004-03-20 23:16:43 +0000
commit59c2e50f2900f1256ee5b00551afd084a68a900b (patch)
tree7cd2a494803eed6d5a036bb37695fb3dee093066 /bfd
parentdaily update (diff)
downloadbinutils-gdb-59c2e50f2900f1256ee5b00551afd084a68a900b.tar.gz
binutils-gdb-59c2e50f2900f1256ee5b00551afd084a68a900b.tar.bz2
binutils-gdb-59c2e50f2900f1256ee5b00551afd084a68a900b.zip
bfd/
2004-03-20 H.J. Lu <hongjiu.lu@intel.com> * elf-bfd.h (RELOC_FOR_GLOBAL_SYMBOL): Report error if unresolved symbols in objects aren't allowed. * elf-hppa.h (elf_hppa_relocate_section): Properly handle unresolved symbols. (elf_hppa_remark_useless_dynamic_symbols): Likewise. (elf_hppa_unmark_useless_dynamic_symbols): * elf32-frv.c (elf32_frv_relocate_section): Likewise. * elf32-hppa.c (elf32_hppa_size_stubs): Likewise. (elf32_hppa_relocate_section): Likewise. * elf32-i370.c (i370_elf_relocate_section): Likewise. * elf32-m32r.c (m32r_elf_relocate_section): Likewise. * elf32-sh.c (sh_elf_relocate_section): Likewise. * elf64-sh64.c (sh_elf64_relocate_section): Likewise. * elfxx-mips.c (mips_elf_calculate_relocation): Likewise. * elf-m10200.c (mn10200_elf_relocate_section): Use RELOC_FOR_GLOBAL_SYMBOL. * elf32-avr.c (elf32_avr_relocate_section): Likewise. * elf32-d10v.c (elf32_d10v_relocate_section): Likewise. * elf32-fr30.c (fr30_elf_relocate_section): Likewise. * elf32-h8300.c (elf32_h8_relocate_section): Likewise. * elf32-i860.c (elf32_i860_relocate_section): Likewise. * elf32-m68hc1x.c (m68hc11_get_relocation_value): Likewise. * elf32-mcore.c (mcore_elf_relocate_section): Likewise. * elf32-msp430.c (elf32_msp430_relocate_section): Likewise. * elf32-openrisc.c (openrisc_elf_relocate_section): Likewise. * elf32-v850.c (v850_elf_relocate_section): Likewise. * elf32-xstormy16.c (xstormy16_elf_relocate_section): Likewise. * elf64-mmix.c (mmix_elf_relocate_section): Likewise. include/ 2004-03-20 H.J. Lu <hongjiu.lu@intel.com> * bfdlink.h (bfd_link_info): Correct comments for the unresolved_syms_in_objects field. ld/ 2004-03-20 H.J. Lu <hongjiu.lu@intel.com> * lexsup.c (parse_args): Don't set unresolved_syms_in_objects or unresolved_syms_in_shared_libs for -Bdynamic and -Bstatic.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog33
-rw-r--r--bfd/elf-bfd.h6
-rw-r--r--bfd/elf-hppa.h19
-rw-r--r--bfd/elf-m10200.c27
-rw-r--r--bfd/elf32-avr.c31
-rw-r--r--bfd/elf32-d10v.c27
-rw-r--r--bfd/elf32-fr30.c44
-rw-r--r--bfd/elf32-frv.c8
-rw-r--r--bfd/elf32-h8300.c27
-rw-r--r--bfd/elf32-hppa.c10
-rw-r--r--bfd/elf32-i370.c20
-rw-r--r--bfd/elf32-i860.c31
-rw-r--r--bfd/elf32-m32r.c5
-rw-r--r--bfd/elf32-m68hc1x.c53
-rw-r--r--bfd/elf32-mcore.c27
-rw-r--r--bfd/elf32-msp430.c30
-rw-r--r--bfd/elf32-openrisc.c29
-rw-r--r--bfd/elf32-sh.c6
-rw-r--r--bfd/elf32-v850.c40
-rw-r--r--bfd/elf32-xstormy16.c31
-rw-r--r--bfd/elf64-mmix.c36
-rw-r--r--bfd/elf64-sh64.c9
-rw-r--r--bfd/elfxx-mips.c8
23 files changed, 136 insertions, 421 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index a9d5ced9f0c..65a2626e2d3 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,36 @@
+2004-03-20 H.J. Lu <hongjiu.lu@intel.com>
+
+ * elf-bfd.h (RELOC_FOR_GLOBAL_SYMBOL): Report error if
+ unresolved symbols in objects aren't allowed.
+
+ * elf-hppa.h (elf_hppa_relocate_section): Properly handle
+ unresolved symbols.
+ (elf_hppa_remark_useless_dynamic_symbols): Likewise.
+ (elf_hppa_unmark_useless_dynamic_symbols):
+ * elf32-frv.c (elf32_frv_relocate_section): Likewise.
+ * elf32-hppa.c (elf32_hppa_size_stubs): Likewise.
+ (elf32_hppa_relocate_section): Likewise.
+ * elf32-i370.c (i370_elf_relocate_section): Likewise.
+ * elf32-m32r.c (m32r_elf_relocate_section): Likewise.
+ * elf32-sh.c (sh_elf_relocate_section): Likewise.
+ * elf64-sh64.c (sh_elf64_relocate_section): Likewise.
+ * elfxx-mips.c (mips_elf_calculate_relocation): Likewise.
+
+ * elf-m10200.c (mn10200_elf_relocate_section): Use
+ RELOC_FOR_GLOBAL_SYMBOL.
+ * elf32-avr.c (elf32_avr_relocate_section): Likewise.
+ * elf32-d10v.c (elf32_d10v_relocate_section): Likewise.
+ * elf32-fr30.c (fr30_elf_relocate_section): Likewise.
+ * elf32-h8300.c (elf32_h8_relocate_section): Likewise.
+ * elf32-i860.c (elf32_i860_relocate_section): Likewise.
+ * elf32-m68hc1x.c (m68hc11_get_relocation_value): Likewise.
+ * elf32-mcore.c (mcore_elf_relocate_section): Likewise.
+ * elf32-msp430.c (elf32_msp430_relocate_section): Likewise.
+ * elf32-openrisc.c (openrisc_elf_relocate_section): Likewise.
+ * elf32-v850.c (v850_elf_relocate_section): Likewise.
+ * elf32-xstormy16.c (xstormy16_elf_relocate_section): Likewise.
+ * elf64-mmix.c (mmix_elf_relocate_section): Likewise.
+
2004-03-19 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
* elf32-hppa.c (elf32_hppa_check_relocs): Handle R_PARISC_PCREL32.
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index b9dd9b259a8..a5e52abe31e 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -1754,8 +1754,7 @@ extern bfd_boolean _sh_elf_set_mach_from_flags
} \
else if (h->root.type == bfd_link_hash_undefweak) \
; \
- else if (!info->executable \
- && info->unresolved_syms_in_objects == RM_IGNORE \
+ else if (info->unresolved_syms_in_objects == RM_IGNORE \
&& ELF_ST_VISIBILITY (h->other) == STV_DEFAULT) \
; \
else \
@@ -1763,8 +1762,7 @@ extern bfd_boolean _sh_elf_set_mach_from_flags
if (! info->callbacks->undefined_symbol \
(info, h->root.root.string, input_bfd, \
input_section, rel->r_offset, \
- ((info->shared && info->unresolved_syms_in_shared_libs == RM_GENERATE_ERROR) \
- || (!info->shared && info->unresolved_syms_in_objects == RM_GENERATE_ERROR) \
+ (info->unresolved_syms_in_objects == RM_GENERATE_ERROR \
|| ELF_ST_VISIBILITY (h->other)) \
)) \
return FALSE; \
diff --git a/bfd/elf-hppa.h b/bfd/elf-hppa.h
index 5efd808819e..f5aba51e55f 100644
--- a/bfd/elf-hppa.h
+++ b/bfd/elf-hppa.h
@@ -1118,8 +1118,7 @@ elf_hppa_unmark_useless_dynamic_symbols (struct elf_link_hash_entry *h,
Ultimately we should have better controls over the generic ELF BFD
linker code. */
if (! info->relocatable
- && ! (info->shared
- && info->unresolved_syms_in_shared_libs == RM_IGNORE)
+ && info->unresolved_syms_in_shared_libs != RM_IGNORE
&& h->root.type == bfd_link_hash_undefined
&& (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) != 0
&& (h->elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR) == 0)
@@ -1153,8 +1152,7 @@ elf_hppa_remark_useless_dynamic_symbols (struct elf_link_hash_entry *h,
Ultimately we should have better controls over the generic ELF BFD
linker code. */
if (! info->relocatable
- && ! (info->shared
- && info->unresolved_syms_in_shared_libs == RM_IGNORE)
+ && info->unresolved_syms_in_shared_libs != RM_IGNORE
&& h->root.type == bfd_link_hash_undefined
&& (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0
&& (h->elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR) == 0
@@ -1420,16 +1418,9 @@ elf_hppa_relocate_section (bfd *output_bfd,
else
relocation = 0;
}
- /* Allow undefined symbols in shared libraries. */
- else if (info->shared
- && info->unresolved_syms_in_shared_libs == RM_IGNORE
+ else if (info->unresolved_syms_in_objects == RM_IGNORE
&& ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
{
- if (info->symbolic)
- (*info->callbacks->undefined_symbol)
- (info, h->root.root.string, input_bfd,
- input_section, rel->r_offset, FALSE);
-
/* If this symbol has an entry in the PA64 dynamic hash
table, then get it. */
dyn_name = get_dyn_name (input_bfd, h, rel,
@@ -1471,7 +1462,9 @@ elf_hppa_relocate_section (bfd *output_bfd,
{
if (!((*info->callbacks->undefined_symbol)
(info, h->root.root.string, input_bfd,
- input_section, rel->r_offset, TRUE)))
+ input_section, rel->r_offset,
+ (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
+ || ELF_ST_VISIBILITY (h->other)))))
return FALSE;
break;
}
diff --git a/bfd/elf-m10200.c b/bfd/elf-m10200.c
index 133d2a9befb..92cea80dbae 100644
--- a/bfd/elf-m10200.c
+++ b/bfd/elf-m10200.c
@@ -377,28 +377,11 @@ mn10200_elf_relocate_section (output_bfd, info, input_bfd, input_section,
}
else
{
- h = sym_hashes[r_symndx - symtab_hdr->sh_info];
- while (h->root.type == bfd_link_hash_indirect
- || h->root.type == bfd_link_hash_warning)
- h = (struct elf_link_hash_entry *) h->root.u.i.link;
- if (h->root.type == bfd_link_hash_defined
- || h->root.type == bfd_link_hash_defweak)
- {
- sec = h->root.u.def.section;
- relocation = (h->root.u.def.value
- + sec->output_section->vma
- + sec->output_offset);
- }
- else if (h->root.type == bfd_link_hash_undefweak)
- relocation = 0;
- else
- {
- if (! ((*info->callbacks->undefined_symbol)
- (info, h->root.root.string, input_bfd,
- input_section, rel->r_offset, TRUE)))
- return FALSE;
- relocation = 0;
- }
+ bfd_boolean unresolved_reloc, warned;
+
+ RELOC_FOR_GLOBAL_SYMBOL (h, sym_hashes, r_symndx, symtab_hdr,
+ relocation, sec, unresolved_reloc,
+ info, warned);
}
r = mn10200_elf_final_link_relocate (howto, input_bfd, output_bfd,
diff --git a/bfd/elf32-avr.c b/bfd/elf32-avr.c
index 44f2b38167c..7649d456157 100644
--- a/bfd/elf32-avr.c
+++ b/bfd/elf32-avr.c
@@ -758,34 +758,11 @@ elf32_avr_relocate_section (output_bfd, info, input_bfd, input_section,
}
else
{
- h = sym_hashes [r_symndx - symtab_hdr->sh_info];
+ bfd_boolean unresolved_reloc, warned;
- while (h->root.type == bfd_link_hash_indirect
- || h->root.type == bfd_link_hash_warning)
- h = (struct elf_link_hash_entry *) h->root.u.i.link;
-
- name = h->root.root.string;
-
- if (h->root.type == bfd_link_hash_defined
- || h->root.type == bfd_link_hash_defweak)
- {
- sec = h->root.u.def.section;
- relocation = (h->root.u.def.value
- + sec->output_section->vma
- + sec->output_offset);
- }
- else if (h->root.type == bfd_link_hash_undefweak)
- {
- relocation = 0;
- }
- else
- {
- if (! ((*info->callbacks->undefined_symbol)
- (info, h->root.root.string, input_bfd,
- input_section, rel->r_offset, TRUE)))
- return FALSE;
- relocation = 0;
- }
+ RELOC_FOR_GLOBAL_SYMBOL (h, sym_hashes, r_symndx, symtab_hdr,
+ relocation, sec, unresolved_reloc,
+ info, warned);
}
r = avr_final_link_relocate (howto, input_bfd, input_section,
diff --git a/bfd/elf32-d10v.c b/bfd/elf32-d10v.c
index f9454ffe9f3..6d3b02dea21 100644
--- a/bfd/elf32-d10v.c
+++ b/bfd/elf32-d10v.c
@@ -517,28 +517,11 @@ elf32_d10v_relocate_section (output_bfd, info, input_bfd, input_section,
}
else
{
- h = sym_hashes[r_symndx - symtab_hdr->sh_info];
- while (h->root.type == bfd_link_hash_indirect
- || h->root.type == bfd_link_hash_warning)
- h = (struct elf_link_hash_entry *) h->root.u.i.link;
- if (h->root.type == bfd_link_hash_defined
- || h->root.type == bfd_link_hash_defweak)
- {
- sec = h->root.u.def.section;
- relocation = (h->root.u.def.value
- + sec->output_section->vma
- + sec->output_offset);
- }
- else if (h->root.type == bfd_link_hash_undefweak)
- relocation = 0;
- else
- {
- if (!((*info->callbacks->undefined_symbol)
- (info, h->root.root.string, input_bfd,
- input_section, rel->r_offset, TRUE)))
- return FALSE;
- relocation = 0;
- }
+ bfd_boolean unresolved_reloc, warned;
+
+ RELOC_FOR_GLOBAL_SYMBOL (h, sym_hashes, r_symndx, symtab_hdr,
+ relocation, sec, unresolved_reloc,
+ info, warned);
}
if (h != NULL)
diff --git a/bfd/elf32-fr30.c b/bfd/elf32-fr30.c
index 472a07a92b2..aaa90f2d3f2 100644
--- a/bfd/elf32-fr30.c
+++ b/bfd/elf32-fr30.c
@@ -566,47 +566,11 @@ fr30_elf_relocate_section (output_bfd, info, input_bfd, input_section,
}
else
{
- h = sym_hashes [r_symndx - symtab_hdr->sh_info];
+ bfd_boolean unresolved_reloc, warned;
- while (h->root.type == bfd_link_hash_indirect
- || h->root.type == bfd_link_hash_warning)
- h = (struct elf_link_hash_entry *) h->root.u.i.link;
-
- name = h->root.root.string;
-
- if (h->root.type == bfd_link_hash_defined
- || h->root.type == bfd_link_hash_defweak)
- {
- sec = h->root.u.def.section;
- relocation = (h->root.u.def.value
- + sec->output_section->vma
- + sec->output_offset);
-#if 0
- fprintf (stderr,
- "defined: sec: %s, name: %s, value: %x + %x + %x gives: %x\n",
- sec->name, name, h->root.u.def.value,
- sec->output_section->vma, sec->output_offset, relocation);
-#endif
- }
- else if (h->root.type == bfd_link_hash_undefweak)
- {
-#if 0
- fprintf (stderr, "undefined: sec: %s, name: %s\n",
- sec->name, name);
-#endif
- relocation = 0;
- }
- else
- {
- if (! ((*info->callbacks->undefined_symbol)
- (info, h->root.root.string, input_bfd,
- input_section, rel->r_offset, TRUE)))
- return FALSE;
-#if 0
- fprintf (stderr, "unknown: name: %s\n", name);
-#endif
- relocation = 0;
- }
+ RELOC_FOR_GLOBAL_SYMBOL (h, sym_hashes, r_symndx, symtab_hdr,
+ relocation, sec, unresolved_reloc,
+ info, warned);
}
r = fr30_final_link_relocate (howto, input_bfd, input_section,
diff --git a/bfd/elf32-frv.c b/bfd/elf32-frv.c
index de7a1132160..eedc55d6e7d 100644
--- a/bfd/elf32-frv.c
+++ b/bfd/elf32-frv.c
@@ -1958,16 +1958,16 @@ elf32_frv_relocate_section (output_bfd, info, input_bfd, input_section,
{
relocation = 0;
}
- else if ( ! info->executable
- && ! info->symbolic
- && info->unresolved_syms_in_objects == RM_IGNORE
+ else if (info->unresolved_syms_in_objects == RM_IGNORE
&& ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
relocation = 0;
else
{
if (! ((*info->callbacks->undefined_symbol)
(info, h->root.root.string, input_bfd,
- input_section, rel->r_offset, TRUE)))
+ input_section, rel->r_offset,
+ (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
+ || ELF_ST_VISIBILITY (h->other)))))
return FALSE;
relocation = 0;
}
diff --git a/bfd/elf32-h8300.c b/bfd/elf32-h8300.c
index 547adfaa935..c933f40d415 100644
--- a/bfd/elf32-h8300.c
+++ b/bfd/elf32-h8300.c
@@ -439,28 +439,11 @@ elf32_h8_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
}
else
{
- h = sym_hashes[r_symndx - symtab_hdr->sh_info];
- while (h->root.type == bfd_link_hash_indirect
- || h->root.type == bfd_link_hash_warning)
- h = (struct elf_link_hash_entry *) h->root.u.i.link;
- if (h->root.type == bfd_link_hash_defined
- || h->root.type == bfd_link_hash_defweak)
- {
- sec = h->root.u.def.section;
- relocation = (h->root.u.def.value
- + sec->output_section->vma
- + sec->output_offset);
- }
- else if (h->root.type == bfd_link_hash_undefweak)
- relocation = 0;
- else
- {
- if (! ((*info->callbacks->undefined_symbol)
- (info, h->root.root.string, input_bfd,
- input_section, rel->r_offset, TRUE)))
- return FALSE;
- relocation = 0;
- }
+ bfd_boolean unresolved_reloc, warned;
+
+ RELOC_FOR_GLOBAL_SYMBOL (h, sym_hashes, r_symndx, symtab_hdr,
+ relocation, sec, unresolved_reloc,
+ info, warned);
}
r = elf32_h8_final_link_relocate (r_type, input_bfd, output_bfd,
diff --git a/bfd/elf32-hppa.c b/bfd/elf32-hppa.c
index 3e4df2e44ed..cb184f5dd47 100644
--- a/bfd/elf32-hppa.c
+++ b/bfd/elf32-hppa.c
@@ -2793,8 +2793,7 @@ elf32_hppa_size_stubs
}
else if (hash->elf.root.type == bfd_link_hash_undefined)
{
- if (! (info->shared
- && info->unresolved_syms_in_objects == RM_IGNORE
+ if (! (info->unresolved_syms_in_objects == RM_IGNORE
&& (ELF_ST_VISIBILITY (hash->elf.other)
== STV_DEFAULT)
&& hash->elf.type != STT_PARISC_MILLI))
@@ -3443,16 +3442,13 @@ elf32_hppa_relocate_section (bfd *output_bfd,
&& hh->root.type != bfd_link_hash_defweak
&& hh->root.type != bfd_link_hash_undefweak)
{
- if (!info->executable
- && info->unresolved_syms_in_objects == RM_IGNORE
+ if (info->unresolved_syms_in_objects == RM_IGNORE
&& ELF_ST_VISIBILITY (hh->other) == STV_DEFAULT
&& hh->type == STT_PARISC_MILLI)
{
if (! info->callbacks->undefined_symbol
(info, hh->root.root.string, input_bfd,
- input_section, rel->r_offset,
- ((info->shared && info->unresolved_syms_in_shared_libs == RM_GENERATE_ERROR)
- || (!info->shared && info->unresolved_syms_in_objects == RM_GENERATE_ERROR))))
+ input_section, rel->r_offset, FALSE))
return FALSE;
warned_undef = TRUE;
}
diff --git a/bfd/elf32-i370.c b/bfd/elf32-i370.c
index 80c45f6fd1f..57854c88edd 100644
--- a/bfd/elf32-i370.c
+++ b/bfd/elf32-i370.c
@@ -1246,19 +1246,21 @@ i370_elf_relocate_section (output_bfd, info, input_bfd, input_section,
}
else if (h->root.type == bfd_link_hash_undefweak)
relocation = 0;
- else if (info->shared
+ else if (info->unresolved_syms_in_objects == RM_IGNORE
&& ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
relocation = 0;
else
{
- (*info->callbacks->undefined_symbol) (info,
- h->root.root.string,
- input_bfd,
- input_section,
- rel->r_offset,
- TRUE);
- ret = FALSE;
- continue;
+ if ((*info->callbacks->undefined_symbol)
+ (info, h->root.root.string, input_bfd,
+ input_section, rel->r_offset,
+ (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
+ || ELF_ST_VISIBILITY (h->other))))
+ {
+ ret = FALSE;
+ continue;
+ }
+ relocation = 0;
}
}
diff --git a/bfd/elf32-i860.c b/bfd/elf32-i860.c
index 8ab3c9251c4..c545d8c50e6 100644
--- a/bfd/elf32-i860.c
+++ b/bfd/elf32-i860.c
@@ -1112,34 +1112,11 @@ elf32_i860_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
}
else
{
- h = sym_hashes [r_symndx - symtab_hdr->sh_info];
+ bfd_boolean unresolved_reloc, warned;
- while (h->root.type == bfd_link_hash_indirect
- || h->root.type == bfd_link_hash_warning)
- h = (struct elf_link_hash_entry *) h->root.u.i.link;
-
- name = h->root.root.string;
-
- if (h->root.type == bfd_link_hash_defined
- || h->root.type == bfd_link_hash_defweak)
- {
- sec = h->root.u.def.section;
- relocation = (h->root.u.def.value
- + sec->output_section->vma
- + sec->output_offset);
- }
- else if (h->root.type == bfd_link_hash_undefweak)
- {
- relocation = 0;
- }
- else
- {
- if (! ((*info->callbacks->undefined_symbol)
- (info, h->root.root.string, input_bfd,
- input_section, rel->r_offset, TRUE)))
- return FALSE;
- relocation = 0;
- }
+ RELOC_FOR_GLOBAL_SYMBOL (h, sym_hashes, r_symndx, symtab_hdr,
+ relocation, sec, unresolved_reloc,
+ info, warned);
}
switch (r_type)
diff --git a/bfd/elf32-m32r.c b/bfd/elf32-m32r.c
index 3f5fbcaeaa1..e3c6ffb1ca2 100644
--- a/bfd/elf32-m32r.c
+++ b/bfd/elf32-m32r.c
@@ -2773,8 +2773,7 @@ m32r_elf_relocate_section (output_bfd, info, input_bfd, input_section,
}
else if (h->root.type == bfd_link_hash_undefweak)
relocation = 0;
- else if (info->shared
- && (!info->symbolic)
+ else if (info->unresolved_syms_in_objects == RM_IGNORE
&& ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
relocation = 0;
else
@@ -2782,7 +2781,7 @@ m32r_elf_relocate_section (output_bfd, info, input_bfd, input_section,
if (! ((*info->callbacks->undefined_symbol)
(info, h->root.root.string, input_bfd,
input_section, offset,
- (!info->shared
+ (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
|| ELF_ST_VISIBILITY (h->other)))))
return FALSE;
relocation = 0;
diff --git a/bfd/elf32-m68hc1x.c b/bfd/elf32-m68hc1x.c
index 709b8f45edc..24460efadc2 100644
--- a/bfd/elf32-m68hc1x.c
+++ b/bfd/elf32-m68hc1x.c
@@ -47,16 +47,6 @@ static void m68hc11_elf_set_symbol (bfd* abfd, struct bfd_link_info *info,
static bfd_boolean m68hc11_elf_export_one_stub
(struct bfd_hash_entry *gen_entry, void *in_arg);
-static bfd_boolean m68hc11_get_relocation_value
- (bfd* abfd,
- struct bfd_link_info* info,
- asection **local_sections,
- Elf_Internal_Sym* local_syms,
- Elf_Internal_Rela* rel,
- const char** name,
- bfd_vma* relocation,
- bfd_boolean* is_far);
-
static void scan_sections_for_abi (bfd*, asection*, PTR);
struct m68hc11_scan_param
@@ -919,7 +909,8 @@ elf32_m68hc11_check_relocs (bfd *abfd, struct bfd_link_info *info,
}
static bfd_boolean
-m68hc11_get_relocation_value (bfd *abfd, struct bfd_link_info *info,
+m68hc11_get_relocation_value (bfd *input_bfd, struct bfd_link_info *info,
+ asection *input_section,
asection **local_sections,
Elf_Internal_Sym *local_syms,
Elf_Internal_Rela *rel,
@@ -934,8 +925,8 @@ m68hc11_get_relocation_value (bfd *abfd, struct bfd_link_info *info,
Elf_Internal_Sym *sym;
const char* stub_name = 0;
- symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
- sym_hashes = elf_sym_hashes (abfd);
+ symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
+ sym_hashes = elf_sym_hashes (input_bfd);
r_symndx = ELF32_R_SYM (rel->r_info);
@@ -953,33 +944,17 @@ m68hc11_get_relocation_value (bfd *abfd, struct bfd_link_info *info,
*is_far = (sym && (sym->st_other & STO_M68HC12_FAR));
if (*is_far)
stub_name = (bfd_elf_string_from_elf_section
- (abfd, symtab_hdr->sh_link,
+ (input_bfd, symtab_hdr->sh_link,
sym->st_name));
}
else
{
- h = sym_hashes[r_symndx - symtab_hdr->sh_info];
- while (h->root.type == bfd_link_hash_indirect
- || h->root.type == bfd_link_hash_warning)
- h = (struct elf_link_hash_entry *) h->root.u.i.link;
- if (h->root.type == bfd_link_hash_defined
- || h->root.type == bfd_link_hash_defweak)
- {
- sec = h->root.u.def.section;
- *relocation = (h->root.u.def.value
- + sec->output_section->vma
- + sec->output_offset);
- }
- else if (h->root.type == bfd_link_hash_undefweak)
- *relocation = 0;
- else
- {
- if (!((*info->callbacks->undefined_symbol)
- (info, h->root.root.string, abfd,
- sec, rel->r_offset, TRUE)))
- return FALSE;
- *relocation = 0;
- }
+ bfd_boolean unresolved_reloc, warned;
+
+ RELOC_FOR_GLOBAL_SYMBOL (h, sym_hashes, r_symndx, symtab_hdr,
+ *relocation, sec, unresolved_reloc,
+ info, warned);
+
*is_far = (h && (h->other & STO_M68HC12_FAR));
stub_name = h->root.root.string;
}
@@ -989,7 +964,7 @@ m68hc11_get_relocation_value (bfd *abfd, struct bfd_link_info *info,
else
{
*name = (bfd_elf_string_from_elf_section
- (abfd, symtab_hdr->sh_link, sym->st_name));
+ (input_bfd, symtab_hdr->sh_link, sym->st_name));
if (*name == NULL || **name == '\0')
*name = bfd_section_name (input_bfd, sec);
}
@@ -1082,8 +1057,8 @@ elf32_m68hc11_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
(*ebd->elf_info_to_howto_rel) (input_bfd, &arel, rel);
howto = arel.howto;
- m68hc11_get_relocation_value (input_bfd, info,
- local_sections, local_syms,
+ m68hc11_get_relocation_value (input_bfd, info, input_section,
+ local_sections, local_syms,
rel, &name, &relocation, &is_far);
/* Do the memory bank mapping. */
diff --git a/bfd/elf32-mcore.c b/bfd/elf32-mcore.c
index 0fc9768ddd1..4d431f688da 100644
--- a/bfd/elf32-mcore.c
+++ b/bfd/elf32-mcore.c
@@ -472,30 +472,11 @@ mcore_elf_relocate_section (output_bfd, info, input_bfd, input_section,
}
else
{
- h = sym_hashes [r_symndx - symtab_hdr->sh_info];
- if ( h->root.type == bfd_link_hash_defined
- || h->root.type == bfd_link_hash_defweak)
- {
- sec = h->root.u.def.section;
- relocation = (h->root.u.def.value
- + sec->output_section->vma
- + sec->output_offset);
- }
- else if (h->root.type == bfd_link_hash_undefweak)
- relocation = 0;
- else if (info->shared
- && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
- relocation = 0;
- else
- {
- if (! ((*info->callbacks->undefined_symbol)
- (info, h->root.root.string, input_bfd,
- input_section, rel->r_offset, TRUE)))
- return FALSE;
+ bfd_boolean unresolved_reloc, warned;
- ret = FALSE;
- continue;
- }
+ RELOC_FOR_GLOBAL_SYMBOL (h, sym_hashes, r_symndx, symtab_hdr,
+ relocation, sec, unresolved_reloc,
+ info, warned);
}
switch (r_type)
diff --git a/bfd/elf32-msp430.c b/bfd/elf32-msp430.c
index 306a79889bc..ad4779d38d5 100644
--- a/bfd/elf32-msp430.c
+++ b/bfd/elf32-msp430.c
@@ -457,33 +457,11 @@ elf32_msp430_relocate_section (output_bfd, info, input_bfd, input_section,
}
else
{
- h = sym_hashes[r_symndx - symtab_hdr->sh_info];
+ bfd_boolean unresolved_reloc, warned;
- while (h->root.type == bfd_link_hash_indirect
- || h->root.type == bfd_link_hash_warning)
- h = (struct elf_link_hash_entry *) h->root.u.i.link;
-
- name = h->root.root.string;
-
- if (h->root.type == bfd_link_hash_defined
- || h->root.type == bfd_link_hash_defweak)
- {
- sec = h->root.u.def.section;
- relocation = (h->root.u.def.value
- + sec->output_section->vma + sec->output_offset);
- }
- else if (h->root.type == bfd_link_hash_undefweak)
- {
- relocation = 0;
- }
- else
- {
- if (!((*info->callbacks->undefined_symbol)
- (info, h->root.root.string, input_bfd,
- input_section, rel->r_offset, TRUE)))
- return FALSE;
- relocation = 0;
- }
+ RELOC_FOR_GLOBAL_SYMBOL (h, sym_hashes, r_symndx, symtab_hdr,
+ relocation, sec, unresolved_reloc,
+ info, warned);
}
r = msp430_final_link_relocate (howto, input_bfd, input_section,
diff --git a/bfd/elf32-openrisc.c b/bfd/elf32-openrisc.c
index 62f86d419a1..7a4d5ece9d2 100644
--- a/bfd/elf32-openrisc.c
+++ b/bfd/elf32-openrisc.c
@@ -383,33 +383,12 @@ openrisc_elf_relocate_section (output_bfd, info, input_bfd, input_section,
}
else
{
- h = sym_hashes[r_symndx - symtab_hdr->sh_info];
+ bfd_boolean unresolved_reloc, warned;
- while (h->root.type == bfd_link_hash_indirect
- || h->root.type == bfd_link_hash_warning)
- h = (struct elf_link_hash_entry *) h->root.u.i.link;
+ RELOC_FOR_GLOBAL_SYMBOL (h, sym_hashes, r_symndx, symtab_hdr,
+ relocation, sec, unresolved_reloc,
+ info, warned);
- name = h->root.root.string;
-
- if (h->root.type == bfd_link_hash_defined
- || h->root.type == bfd_link_hash_defweak)
- {
- sec = h->root.u.def.section;
- relocation = (h->root.u.def.value
- + sec->output_section->vma + sec->output_offset);
- }
- else if (h->root.type == bfd_link_hash_undefweak)
- {
- relocation = 0;
- }
- else
- {
- if (!((*info->callbacks->undefined_symbol)
- (info, h->root.root.string, input_bfd,
- input_section, rel->r_offset, TRUE)))
- return FALSE;
- relocation = 0;
- }
}
r = openrisc_final_link_relocate (howto, input_bfd, input_section,
diff --git a/bfd/elf32-sh.c b/bfd/elf32-sh.c
index 5ab56bcc141..28a2fcc5ad4 100644
--- a/bfd/elf32-sh.c
+++ b/bfd/elf32-sh.c
@@ -4938,8 +4938,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
}
else if (h->root.type == bfd_link_hash_undefweak)
relocation = 0;
- else if (! info->executable
- && info->unresolved_syms_in_objects == RM_IGNORE
+ else if (info->unresolved_syms_in_objects == RM_IGNORE
&& ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
relocation = 0;
else
@@ -4947,8 +4946,7 @@ sh_elf_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
if (! info->callbacks->undefined_symbol
(info, h->root.root.string, input_bfd,
input_section, rel->r_offset,
- ((info->shared && info->unresolved_syms_in_shared_libs == RM_GENERATE_ERROR)
- || (!info->shared && info->unresolved_syms_in_objects == RM_GENERATE_ERROR)
+ (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
|| ELF_ST_VISIBILITY (h->other))))
return FALSE;
relocation = 0;
diff --git a/bfd/elf32-v850.c b/bfd/elf32-v850.c
index 45bb4f6eb7c..0218ddcb57d 100644
--- a/bfd/elf32-v850.c
+++ b/bfd/elf32-v850.c
@@ -1696,43 +1696,11 @@ v850_elf_relocate_section (output_bfd, info, input_bfd, input_section,
}
else
{
- h = sym_hashes[r_symndx - symtab_hdr->sh_info];
+ bfd_boolean unresolved_reloc, warned;
- while (h->root.type == bfd_link_hash_indirect
- || h->root.type == bfd_link_hash_warning)
- h = (struct elf_link_hash_entry *) h->root.u.i.link;
-
- if (h->root.type == bfd_link_hash_defined
- || h->root.type == bfd_link_hash_defweak)
- {
- sec = h->root.u.def.section;
- relocation = (h->root.u.def.value
- + sec->output_section->vma
- + sec->output_offset);
-#if 0
- fprintf (stderr, "defined: sec: %s, name: %s, value: %x + %x + %x gives: %x\n",
- sec->name, h->root.root.string, h->root.u.def.value, sec->output_section->vma, sec->output_offset, relocation);
-#endif
- }
- else if (h->root.type == bfd_link_hash_undefweak)
- {
-#if 0
- fprintf (stderr, "undefined: sec: %s, name: %s\n",
- sec->name, h->root.root.string);
-#endif
- relocation = 0;
- }
- else
- {
- if (! ((*info->callbacks->undefined_symbol)
- (info, h->root.root.string, input_bfd,
- input_section, rel->r_offset, TRUE)))
- return FALSE;
-#if 0
- fprintf (stderr, "unknown: name: %s\n", h->root.root.string);
-#endif
- relocation = 0;
- }
+ RELOC_FOR_GLOBAL_SYMBOL (h, sym_hashes, r_symndx, symtab_hdr,
+ relocation, sec, unresolved_reloc,
+ info, warned);
}
/* FIXME: We should use the addend, but the COFF relocations don't. */
diff --git a/bfd/elf32-xstormy16.c b/bfd/elf32-xstormy16.c
index 1377ff2517b..b3b40fb1e09 100644
--- a/bfd/elf32-xstormy16.c
+++ b/bfd/elf32-xstormy16.c
@@ -853,34 +853,11 @@ xstormy16_elf_relocate_section (output_bfd, info, input_bfd, input_section,
}
else
{
- h = sym_hashes [r_symndx - symtab_hdr->sh_info];
+ bfd_boolean unresolved_reloc, warned;
- while (h->root.type == bfd_link_hash_indirect
- || h->root.type == bfd_link_hash_warning)
- h = (struct elf_link_hash_entry *) h->root.u.i.link;
-
- name = h->root.root.string;
-
- if (h->root.type == bfd_link_hash_defined
- || h->root.type == bfd_link_hash_defweak)
- {
- sec = h->root.u.def.section;
- relocation = (h->root.u.def.value
- + sec->output_section->vma
- + sec->output_offset);
- }
- else if (h->root.type == bfd_link_hash_undefweak)
- {
- relocation = 0;
- }
- else
- {
- if (! ((*info->callbacks->undefined_symbol)
- (info, h->root.root.string, input_bfd,
- input_section, rel->r_offset, TRUE)))
- return FALSE;
- relocation = 0;
- }
+ RELOC_FOR_GLOBAL_SYMBOL (h, sym_hashes, r_symndx, symtab_hdr,
+ relocation, sec, unresolved_reloc,
+ info, warned);
}
switch (ELF32_R_TYPE (rel->r_info))
diff --git a/bfd/elf64-mmix.c b/bfd/elf64-mmix.c
index ca627ef2c05..3e769d3d8a6 100644
--- a/bfd/elf64-mmix.c
+++ b/bfd/elf64-mmix.c
@@ -1480,39 +1480,11 @@ mmix_elf_relocate_section (output_bfd, info, input_bfd, input_section,
}
else
{
- h = sym_hashes [r_symndx - symtab_hdr->sh_info];
+ bfd_boolean unresolved_reloc;
- while (h->root.type == bfd_link_hash_indirect
- || h->root.type == bfd_link_hash_warning)
- h = (struct elf_link_hash_entry *) h->root.u.i.link;
-
- name = h->root.root.string;
-
- if (h->root.type == bfd_link_hash_defined
- || h->root.type == bfd_link_hash_defweak)
- {
- sec = h->root.u.def.section;
- relocation = (h->root.u.def.value
- + sec->output_section->vma
- + sec->output_offset);
- }
- else if (h->root.type == bfd_link_hash_undefweak)
- relocation = 0;
- else if (info->shared
- && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
- relocation = 0;
- else
- {
- /* The test on undefined_signalled is redundant at the
- moment, but kept for symmetry. */
- if (! undefined_signalled
- && ! ((*info->callbacks->undefined_symbol)
- (info, h->root.root.string, input_bfd,
- input_section, rel->r_offset, TRUE)))
- return FALSE;
- undefined_signalled = TRUE;
- relocation = 0;
- }
+ RELOC_FOR_GLOBAL_SYMBOL (h, sym_hashes, r_symndx, symtab_hdr,
+ relocation, sec, unresolved_reloc,
+ info, undefined_signalled);
}
r = mmix_final_link_relocate (howto, input_section,
diff --git a/bfd/elf64-sh64.c b/bfd/elf64-sh64.c
index 15c29924d96..03196c57d97 100644
--- a/bfd/elf64-sh64.c
+++ b/bfd/elf64-sh64.c
@@ -1703,15 +1703,16 @@ sh_elf64_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
}
else if (h->root.type == bfd_link_hash_undefweak)
relocation = 0;
- else if (info->shared
- && !info->symbolic
- && info->unresolved_syms_in_objects == RM_IGNORE)
+ else if (info->unresolved_syms_in_objects == RM_IGNORE
+ && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
relocation = 0;
else
{
if (! ((*info->callbacks->undefined_symbol)
(info, h->root.root.string, input_bfd,
- input_section, rel->r_offset, TRUE)))
+ input_section, rel->r_offset,
+ (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
+ || ELF_ST_VISIBILITY (h->other)))))
return FALSE;
relocation = 0;
}
diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c
index ff943d694e8..76b37326aba 100644
--- a/bfd/elfxx-mips.c
+++ b/bfd/elfxx-mips.c
@@ -3156,8 +3156,7 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
and check to see if they exist by looking at their
addresses. */
symbol = 0;
- else if (info->shared
- && info->unresolved_syms_in_objects == RM_IGNORE
+ else if (info->unresolved_syms_in_objects == RM_IGNORE
&& ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT)
symbol = 0;
else if (strcmp (*namep, "_DYNAMIC_LINK") == 0 ||
@@ -3178,9 +3177,8 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
if (! ((*info->callbacks->undefined_symbol)
(info, h->root.root.root.string, input_bfd,
input_section, relocation->r_offset,
- ((info->shared && info->unresolved_syms_in_shared_libs == RM_GENERATE_ERROR)
- || (!info->shared && info->unresolved_syms_in_objects == RM_GENERATE_ERROR)
- || ELF_ST_VISIBILITY (h->root.other)))))
+ (info->unresolved_syms_in_objects == RM_GENERATE_ERROR)
+ || ELF_ST_VISIBILITY (h->root.other))))
return bfd_reloc_undefined;
symbol = 0;
}