aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog8
-rw-r--r--bfd/elf32-ppc.c18
-rw-r--r--bfd/elflink.c20
3 files changed, 34 insertions, 12 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index b72e53e..ad9a7c6 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,11 @@
+2005-06-30 Alan Modra <amodra@bigpond.net.au>
+
+ * elf32-ppc.c (ppc_elf_adjust_dynamic_symbol): Ignore dynamic
+ _SDA_BASE_ and _SDA2_BASE_ symbols.
+ * elflink.c (_bfd_elf_provide_symbol): Correct comment. Define
+ sym if not def_regular.
+ (_bfd_elf_provide_section_bound_symbols): Similarly.
+
2005-06-30 Ben Elliston <bje@gnu.org>
* config.bfd: Mark as obsolete:
diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c
index 4f1eec9..1d41f57 100644
--- a/bfd/elf32-ppc.c
+++ b/bfd/elf32-ppc.c
@@ -3945,6 +3945,24 @@ ppc_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
/* This is a reference to a symbol defined by a dynamic object which
is not a function. */
+ /* First, a fudge for old shared libs that export some symbols they
+ should not. */
+ if (!h->def_regular
+ && (strcmp (h->root.root.string, "_SDA_BASE_") == 0
+ || strcmp (h->root.root.string, "_SDA2_BASE_") == 0))
+ {
+ /* These symbols will be defined later, as if they were defined in
+ a linker script. We don't want to use a definition in a shared
+ object. */
+ const struct elf_backend_data *bed;
+
+ bed = get_elf_backend_data (htab->elf.dynobj);
+ (*bed->elf_backend_hide_symbol) (info, h, TRUE);
+ h->root.type = bfd_link_hash_undefined;
+ h->root.u.undef.abfd = htab->elf.dynobj;
+ return TRUE;
+ }
+
/* If we are creating a shared library, we must presume that the
only references to the symbol are via the global offset table.
For such cases we need not do anything here; the relocations will
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 8870857..6177f53 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -9836,8 +9836,9 @@ bfd_elf_set_symbol (struct elf_link_hash_entry *h, bfd_vma val,
h->forced_local = 1;
}
-/* Set NAME to VAL if the symbol exists and is undefined. If val is NULL
- it is an absolute symbol, otherwise it is relative to that section. */
+/* Set NAME to VAL if the symbol exists and is not defined in a regular
+ object file. If S is NULL it is an absolute symbol, otherwise it is
+ relative to that section. */
void
_bfd_elf_provide_symbol (struct bfd_link_info *info, const char *name,
@@ -9847,13 +9848,12 @@ _bfd_elf_provide_symbol (struct bfd_link_info *info, const char *name,
h = elf_link_hash_lookup (elf_hash_table (info), name, FALSE, FALSE,
FALSE);
- if (h != NULL && (h->root.type == bfd_link_hash_undefined
- || h->root.type == bfd_link_hash_undefweak))
+ if (h != NULL && !h->def_regular)
bfd_elf_set_symbol (h, val, s);
}
-/* Set START and END to boundaries of SEC if they exist and are
- undefined. */
+/* Set START and END to boundaries of SEC if they exist and are not
+ defined in regular object files. */
void
_bfd_elf_provide_section_bound_symbols (struct bfd_link_info *info,
@@ -9868,15 +9868,11 @@ _bfd_elf_provide_section_bound_symbols (struct bfd_link_info *info,
/* Check if we need them or not first. */
hs = elf_link_hash_lookup (elf_hash_table (info), start, FALSE,
FALSE, FALSE);
- do_start = (hs != NULL
- && (hs->root.type == bfd_link_hash_undefined
- || hs->root.type == bfd_link_hash_undefweak));
+ do_start = hs != NULL && !hs->def_regular;
he = elf_link_hash_lookup (elf_hash_table (info), end, FALSE,
FALSE, FALSE);
- do_end = (he != NULL
- && (he->root.type == bfd_link_hash_undefined
- || he->root.type == bfd_link_hash_undefweak));
+ do_end = he != NULL && !he->def_regular;
if (!do_start && !do_end)
return;