* elf32-arm.h (WILL_CALL_FINISH_DYNAMIC_SYMBOL): Define.

(elf32_arm_final_link_relocate, elf32_arm_relocate_section): Use it.
This commit is contained in:
Daniel Jacobowitz 2003-08-05 16:24:12 +00:00
parent d3ba05513b
commit 50d6c87817
2 changed files with 29 additions and 8 deletions

View file

@ -1,3 +1,8 @@
2003-08-05 Daniel Jacobowitz <drow@mvista.com>
* elf32-arm.h (WILL_CALL_FINISH_DYNAMIC_SYMBOL): Define.
(elf32_arm_final_link_relocate, elf32_arm_relocate_section): Use it.
2003-08-03 Jeff Muizelaar <muizelaar@rogers.com> 2003-08-03 Jeff Muizelaar <muizelaar@rogers.com>
* coffcode.h: (coff_slurp_line_table) Return with a warning * coffcode.h: (coff_slurp_line_table) Return with a warning

View file

@ -1038,6 +1038,18 @@ elf32_arm_to_thumb_stub (info, name, input_bfd, output_bfd, input_section,
return TRUE; return TRUE;
} }
/* This is the condition under which elf32_arm_finish_dynamic_symbol
will be called from elflink.h. If elflink.h doesn't call our
finish_dynamic_symbol routine, we'll need to do something about
initializing any .plt and .got entries in elf32_arm_relocate_section
and elf32_arm_final_link_relocate. */
#define WILL_CALL_FINISH_DYNAMIC_SYMBOL(DYN, SHARED, H) \
((DYN) \
&& ((SHARED) \
|| ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) \
&& ((H)->dynindx != -1 \
|| ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0))
/* Perform a relocation as part of a final link. */ /* Perform a relocation as part of a final link. */
static bfd_reloc_status_type static bfd_reloc_status_type
@ -1605,13 +1617,16 @@ elf32_arm_final_link_relocate (howto, input_bfd, output_bfd,
if (h != NULL) if (h != NULL)
{ {
bfd_vma off; bfd_vma off;
bfd_boolean dyn = elf_hash_table (info)->dynamic_sections_created;
off = h->got.offset; off = h->got.offset;
BFD_ASSERT (off != (bfd_vma) -1); BFD_ASSERT (off != (bfd_vma) -1);
if (!elf_hash_table (info)->dynamic_sections_created || if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
(info->shared && (info->symbolic || h->dynindx == -1) || (info->shared
&& (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))) && (info->symbolic || h->dynindx == -1
|| (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL))
&& (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)))
{ {
/* This is actually a static link, or it is a -Bsymbolic link /* This is actually a static link, or it is a -Bsymbolic link
and the symbol is defined locally. We must initialize this and the symbol is defined locally. We must initialize this
@ -1991,12 +2006,13 @@ elf32_arm_relocate_section (output_bfd, info, input_bfd, input_section,
break; break;
case R_ARM_GOT32: case R_ARM_GOT32:
if (elf_hash_table(info)->dynamic_sections_created if ((WILL_CALL_FINISH_DYNAMIC_SYMBOL
&& (!info->shared (elf_hash_table(info)->dynamic_sections_created,
info->shared, h))
&& (!info->shared
|| (!info->symbolic && h->dynindx != -1) || (!info->symbolic && h->dynindx != -1)
|| (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0 || (h->elf_link_hash_flags
) & ELF_LINK_HASH_DEF_REGULAR) == 0))
)
relocation_needed = 0; relocation_needed = 0;
break; break;