diff options
author | Alan Modra <amodra@gmail.com> | 2005-06-30 08:11:15 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2005-06-30 08:11:15 +0000 |
commit | b116d4a7eb22626b1cd82c9bf02622d41033b174 (patch) | |
tree | a55a388dec78d2eaa5907575e95e3ee2e5a0227d /bfd | |
parent | b753922c0bfbe3828b1495122875de8dad473475 (diff) | |
download | binutils-b116d4a7eb22626b1cd82c9bf02622d41033b174.tar.gz binutils-b116d4a7eb22626b1cd82c9bf02622d41033b174.tar.bz2 binutils-b116d4a7eb22626b1cd82c9bf02622d41033b174.zip |
* 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.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 8 | ||||
-rw-r--r-- | bfd/elf32-ppc.c | 18 | ||||
-rw-r--r-- | bfd/elflink.c | 20 |
3 files changed, 34 insertions, 12 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index b72e53e7fa9..ad9a7c666dc 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 4f1eec9f11f..1d41f57f25a 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 88708570a5d..6177f5324e4 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; |