X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Felf32-hppa.c;h=41ec0ce60bdab11fffa77b1cba60e5d0e5d8e5ef;hb=2c73f9d86113b392342ec5a8cff8a42be78bd429;hp=5dfd6f2cf86284125a3d78395b26b321e3dc7f1c;hpb=9ad5cbcfb23cb74d34bd04f88f4e47c0f5de5155;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elf32-hppa.c b/bfd/elf32-hppa.c index 5dfd6f2cf8..41ec0ce60b 100644 --- a/bfd/elf32-hppa.c +++ b/bfd/elf32-hppa.c @@ -1,6 +1,6 @@ /* BFD back-end for HP PA-RISC ELF files. - Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1999, 2000, 2001 - Free Software Foundation, Inc. + Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1999, 2000, 2001, + 2002 Free Software Foundation, Inc. Original code by Center for Software Science @@ -335,7 +335,7 @@ static boolean elf32_hppa_gc_sweep_hook asection *, const Elf_Internal_Rela *)); static void elf32_hppa_hide_symbol - PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *)); + PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *, boolean)); static boolean elf32_hppa_adjust_dynamic_symbol PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *)); @@ -1786,12 +1786,22 @@ elf32_hppa_gc_sweep_hook (abfd, info, sec, relocs) plabels. */ static void -elf32_hppa_hide_symbol (info, h) - struct bfd_link_info *info ATTRIBUTE_UNUSED; +elf32_hppa_hide_symbol (info, h, force_local) + struct bfd_link_info *info; struct elf_link_hash_entry *h; + boolean force_local; { - if ((h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0) - h->dynindx = -1; + if (force_local) + { + h->elf_link_hash_flags |= ELF_LINK_FORCED_LOCAL; + if (h->dynindx != -1) + { + h->dynindx = -1; + _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr, + h->dynstr_index); + } + } + if (! ((struct elf32_hppa_link_hash_entry *) h)->plabel) { h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT; @@ -2206,12 +2216,7 @@ clobber_millicode_symbols (h, info) if (h->type == STT_PARISC_MILLI && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) { - struct elf32_hppa_link_hash_table *htab; - - h->elf_link_hash_flags |= ELF_LINK_FORCED_LOCAL; - elf32_hppa_hide_symbol (info, h); - htab = hppa_link_hash_table (info); - _bfd_elf_strtab_delref (htab->elf.dynstr, h->dynstr_index); + elf32_hppa_hide_symbol (info, h, true); /* ?!? We only want to remove these from the dynamic symbol table. Therefore we do not leave ELF_LINK_FORCED_LOCAL set. */ @@ -2324,10 +2329,12 @@ elf32_hppa_size_dynamic_sections (output_bfd, info) linker script /DISCARD/, so we'll be discarding the relocs too. */ } - else + else if (p->count != 0) { srel = elf_section_data (p->sec)->sreloc; srel->_raw_size += p->count * sizeof (Elf32_External_Rela); + if ((p->sec->output_section->flags & SEC_READONLY) != 0) + info->flags |= DF_TEXTREL; } } } @@ -2500,7 +2507,9 @@ elf32_hppa_size_dynamic_sections (output_bfd, info) /* If any dynamic relocs apply to a read-only section, then we need a DT_TEXTREL entry. */ - elf_link_hash_traverse (&htab->elf, readonly_dynrelocs, (PTR) info); + if ((info->flags & DF_TEXTREL) == 0) + elf_link_hash_traverse (&htab->elf, readonly_dynrelocs, + (PTR) info); if ((info->flags & DF_TEXTREL) != 0) {