summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl@lucon.org>2002-05-03 19:53:20 +0000
committerH.J. Lu <hjl@lucon.org>2002-05-03 19:53:20 +0000
commit4033f6aa2ad286a0efd02df2be5877d504f54a6e (patch)
tree60dbdbbbf19eecb1a6417b9bf8cf53da28c0a4ec
parent17360666102e7d972cea7740b30e6323a50b278d (diff)
downloadgdb-4033f6aa2ad286a0efd02df2be5877d504f54a6e.tar.gz
2002-05-03 H.J. Lu (hjl@gnu.org)
* elfxx-mips.c (mips_elf_link_hash_entry): Add forced_local. (mips_elf_link_hash_newfunc): Initialize forced_local to false. (mips_elf_record_global_got_symbol): Call _bfd_mips_elf_hide_symbol to hide a global symbol. (_bfd_mips_elf_hide_symbol): Return if forced_local is true. Set forced_local to true.
-rw-r--r--bfd/ChangeLog9
-rw-r--r--bfd/elfxx-mips.c24
2 files changed, 30 insertions, 3 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index dc22fe51448..92ff1609dd2 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,12 @@
+2002-05-03 H.J. Lu (hjl@gnu.org)
+
+ * elfxx-mips.c (mips_elf_link_hash_entry): Add forced_local.
+ (mips_elf_link_hash_newfunc): Initialize forced_local to false.
+ (mips_elf_record_global_got_symbol): Call _bfd_mips_elf_hide_symbol
+ to hide a global symbol.
+ (_bfd_mips_elf_hide_symbol): Return if forced_local is true. Set
+ forced_local to true.
+
2002-05-02 Richard Henderson <rth@redhat.com>
* elf64-alpha.c (elf64_alpha_relocate_section): Force relative relocs
diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c
index c47556f0770..8ec22b9aee3 100644
--- a/bfd/elfxx-mips.c
+++ b/bfd/elfxx-mips.c
@@ -115,6 +115,9 @@ struct mips_elf_link_hash_entry
/* This is like the call_stub field, but it is used if the function
being called returns a floating point value. */
asection *call_fp_stub;
+
+ /* Are we forced local? .*/
+ boolean forced_local;
};
/* MIPS ELF linker hash table. */
@@ -581,6 +584,7 @@ mips_elf_link_hash_newfunc (entry, table, string)
ret->need_fn_stub = false;
ret->call_stub = NULL;
ret->call_fp_stub = NULL;
+ ret->forced_local = false;
}
return (struct bfd_hash_entry *) ret;
@@ -1685,9 +1689,18 @@ mips_elf_record_global_got_symbol (h, info, g)
{
/* A global symbol in the GOT must also be in the dynamic symbol
table. */
- if (h->dynindx == -1
- && !bfd_elf32_link_record_dynamic_symbol (info, h))
- return false;
+ if (h->dynindx == -1)
+ {
+ switch (ELF_ST_VISIBILITY (h->other))
+ {
+ case STV_INTERNAL:
+ case STV_HIDDEN:
+ _bfd_mips_elf_hide_symbol (info, h, true);
+ break;
+ }
+ if (!bfd_elf32_link_record_dynamic_symbol (info, h))
+ return false;
+ }
/* If we've already marked this entry as needing GOT space, we don't
need to do it again. */
@@ -6384,7 +6397,12 @@ _bfd_mips_elf_hide_symbol (info, entry, force_local)
asection *got;
struct mips_got_info *g;
struct mips_elf_link_hash_entry *h;
+
h = (struct mips_elf_link_hash_entry *) entry;
+ if (h->forced_local)
+ return;
+ h->forced_local = true;
+
dynobj = elf_hash_table (info)->dynobj;
got = bfd_get_section_by_name (dynobj, ".got");
g = (struct mips_got_info *) elf_section_data (got)->tdata;