* 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:
parent
eed23bb4a1
commit
8a56bd0251
@ -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
|
||||
|
@ -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
|
||||
|
@ -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. */
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user