* elf-bfd.h (_bfd_elf_merge_symbol): Delete declaration.

* elflink.c (_bfd_elf_merge_symbol): Make static.
	* elf32-sh-symbian.c (sh_symbian_relocate_section): Don't call
	_bfd_elf_merge_symbol, call _bfd_generic_link_add_one_symbol.
This commit is contained in:
Alan Modra 2013-03-23 10:25:02 +00:00
parent eed23bb4a1
commit 8a56bd0251
4 changed files with 29 additions and 43 deletions

View File

@ -1,3 +1,10 @@
2013-03-23 Alan Modra <amodra@gmail.com>
* elf-bfd.h (_bfd_elf_merge_symbol): Delete declaration.
* elflink.c (_bfd_elf_merge_symbol): Make static.
* elf32-sh-symbian.c (sh_symbian_relocate_section): Don't call
_bfd_elf_merge_symbol, call _bfd_generic_link_add_one_symbol.
2013-03-23 Alan Modra <amodra@gmail.com>
PR ld/15270

View File

@ -1993,12 +1993,6 @@ extern bfd_boolean _bfd_elf_eh_frame_present
extern bfd_boolean _bfd_elf_maybe_strip_eh_frame_hdr
(struct bfd_link_info *);
extern bfd_boolean _bfd_elf_merge_symbol
(bfd *, struct bfd_link_info *, const char *, Elf_Internal_Sym *,
asection **, bfd_vma *, bfd_boolean *, unsigned int *,
struct elf_link_hash_entry **, bfd_boolean *,
bfd_boolean *, bfd_boolean *, bfd_boolean *);
extern bfd_boolean _bfd_elf_hash_symbol (struct elf_link_hash_entry *);
extern long _bfd_elf_link_lookup_local_dynindx

View File

@ -470,51 +470,36 @@ sh_symbian_relocate_section (bfd * output_bfd,
continue;
}
new_hash = elf_link_hash_lookup (hash_table, ptr->new_name, FALSE, FALSE, TRUE);
new_hash = elf_link_hash_lookup (hash_table, ptr->new_name,
FALSE, FALSE, TRUE);
/* If we could not find the symbol then it is a new, undefined symbol.
Symbian want this behaviour - ie they want to be able to rename the
reference in a reloc from one undefined symbol to another, new and
undefined symbol. So we create that symbol here. */
if (new_hash == NULL)
{
asection * psec = bfd_und_section_ptr;
Elf_Internal_Sym new_sym;
bfd_vma new_value = 0;
bfd_boolean skip;
bfd_boolean override;
bfd_boolean type_change_ok;
bfd_boolean size_change_ok;
new_sym.st_value = 0;
new_sym.st_size = 0;
new_sym.st_name = -1;
new_sym.st_info = ELF_ST_INFO (STB_GLOBAL, STT_FUNC);
new_sym.st_other = ELF_ST_VISIBILITY (STV_DEFAULT);
new_sym.st_shndx = SHN_UNDEF;
new_sym.st_target_internal = 0;
if (! _bfd_elf_merge_symbol (input_bfd, info,
ptr->new_name, & new_sym,
& psec, & new_value, NULL,
NULL, & new_hash, & skip,
& override, & type_change_ok,
& size_change_ok))
struct bfd_link_hash_entry *bh = NULL;
bfd_boolean collect = get_elf_backend_data (input_bfd)->collect;
if (_bfd_generic_link_add_one_symbol (info, input_bfd,
ptr->new_name, BSF_GLOBAL,
bfd_und_section_ptr, 0,
NULL, FALSE, collect,
&bh))
{
_bfd_error_handler (_("%B: Failed to add renamed symbol %s"),
input_bfd, ptr->new_name);
continue;
new_hash = (struct elf_link_hash_entry *) bh;
new_hash->type = STT_FUNC;
new_hash->non_elf = 0;
if (SYMBIAN_DEBUG)
fprintf (stderr, "Created new symbol %s\n", ptr->new_name);
}
/* XXX - should we check psec, skip, override etc ? */
}
new_hash->root.type = bfd_link_hash_undefined;
/* Allow the symbol to become local if necessary. */
if (new_hash->dynindx == -1)
new_hash->def_regular = 1;
if (SYMBIAN_DEBUG)
fprintf (stderr, "Created new symbol %s\n", ptr->new_name);
if (new_hash == NULL)
{
_bfd_error_handler (_("%B: Failed to add renamed symbol %s"),
input_bfd, ptr->new_name);
continue;
}
/* Convert the new_hash value into a index into the table of symbol hashes. */

View File

@ -907,7 +907,7 @@ elf_merge_st_other (bfd *abfd, struct elf_link_hash_entry *h,
change. We set POLD_ALIGNMENT if an old common symbol in a dynamic
object is overridden by a regular object. */
bfd_boolean
static bfd_boolean
_bfd_elf_merge_symbol (bfd *abfd,
struct bfd_link_info *info,
const char *name,