forked from Imagelibrary/binutils-gdb
bfd/
2006-09-07 H.J. Lu <hongjiu.lu@intel.com> * elf-bfd.h (elf_link_hash_entry): Add a dynamic field. (bfd_elf_link_mark_dynamic_symbol): New. (SYMBOLIC_BIND): New. * elf32-i386.c (elf_i386_check_relocs): Replace info->symbolic with SYMBOLIC_BIND (info, h). (elf_i386_relocate_section): Likewise. * elf64-x86-64.c (elf64_x86_64_check_relocs): Likewise. (elf64_x86_64_relocate_section): Likewise. * elfxx-ia64.c (elfNN_ia64_check_relocs): Likewise. * elflink.c (bfd_elf_link_mark_dynamic_symbol): New. (bfd_elf_record_link_assignment): Call bfd_elf_link_mark_dynamic_symbol on new entry. (_bfd_elf_merge_symbol): Likewise. (_bfd_elf_export_symbol): Return if the symbol isn't exported. (_bfd_elf_fix_symbol_flags): Replace info->symbolic with SYMBOLIC_BIND (info, h). (_bfd_elf_dynamic_symbol_p): Likewise. (_bfd_elf_symbol_refs_local_p): Likewise. (bfd_elf_size_dynamic_sections): Updated. include/ 2006-09-07 H.J. Lu <hongjiu.lu@intel.com> * bfdlink.h (bfd_elf_dynamic_list): New. (bfd_link_info): Add a dynamic field. ld/ 2006-09-07 H.J. Lu <hongjiu.lu@intel.com> * Makefile.am (CXX): Set to g++. (CXX_FOR_TARGET): Likewise. * Makefile.in: Regenerated. * NEWS: Mention --dynamic-list. * ld.texinfo: Document --dynamic-list. * ldgram.y: Support dynamic list. * ldlang.c (lang_process): Call lang_finalize_version_expr_head on link_info.dynamic if needed. (lang_append_dynamic_list): New. (lang_append_dynamic_list_cpp_typeinfo): New. * ldlang.h (lang_append_dynamic_list): Likewise. * ldlang.h (lang_append_dynamic_list_cpp_typeinfo): Likewise. * ldlex.h (input_enum): Add input_dynamic_list. * ldlex.l: Handle it. * ldmain.c (main): Initialize link_info.dynamic. * lexsup.c (option_values): Add OPTION_DYNAMIC_LIST and OPTION_DYNAMIC_LIST_CPP_TYPEINFO. (ld_options): Add entries for OPTION_DYNAMIC_LIST and OPTION_DYNAMIC_LIST_CPP_TYPEINFO. (parse_args): Handle OPTION_DYNAMIC_LIST and OPTION_DYNAMIC_LIST_CPP_TYPEINFO. ld/testsuite/ 2006-09-07 H.J. Lu <hongjiu.lu@intel.com> * ld-elf/dl1.c: New file. * ld-elf/dl1.list: Likewise. * ld-elf/dl1.out: Likewise. * ld-elf/dl1main.c: Likewise. * ld-elf/dl2.c: Likewise. * ld-elf/dl2.list: Likewise. * ld-elf/dl2a.out: Likewise. * ld-elf/dl2b.out: Likewise. * ld-elf/dl2main.c: Likewise. * ld-elf/dl2xxx.c: Likewise. * ld-elf/dl2xxx.list: Likewise. * ld-elf/dl3.cc: Likewise. * ld-elf/dl3.list: Likewise. * ld-elf/dl3a.out: Likewise. * ld-elf/dl3b.out: Likewise. * ld-elf/dl3header.h: Likewise. * ld-elf/dl3main.cc: Likewise. * ld-elf/shared.exp: Updated. * lib/ld-lib.exp (run_ld_link_exec_tests): Take an optional argument for source language. Use CC/CXX for link, depending on source language. (run_cc_link_tests): Likewise.
This commit is contained in:
@@ -444,6 +444,21 @@ bfd_elf_link_record_dynamic_symbol (struct bfd_link_info *info,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* Mark a symbol dynamic. */
|
||||
|
||||
void
|
||||
bfd_elf_link_mark_dynamic_symbol (struct bfd_link_info *info,
|
||||
struct elf_link_hash_entry *h)
|
||||
{
|
||||
struct bfd_elf_dynamic_list *d = info->dynamic;
|
||||
|
||||
if (d == NULL || info->relocatable)
|
||||
return;
|
||||
|
||||
if ((*d->match) (&d->head, NULL, h->root.root.string))
|
||||
h->dynamic = 1;
|
||||
}
|
||||
|
||||
/* Record an assignment to a symbol made by a linker script. We need
|
||||
this in case some dynamic object refers to this symbol. */
|
||||
|
||||
@@ -477,7 +492,10 @@ bfd_elf_record_link_assignment (bfd *output_bfd,
|
||||
}
|
||||
|
||||
if (h->root.type == bfd_link_hash_new)
|
||||
h->non_elf = 0;
|
||||
{
|
||||
bfd_elf_link_mark_dynamic_symbol (info, h);
|
||||
h->non_elf = 0;
|
||||
}
|
||||
|
||||
/* If this symbol is being provided by the linker script, and it is
|
||||
currently defined by a dynamic object, but not by a regular
|
||||
@@ -840,6 +858,7 @@ _bfd_elf_merge_symbol (bfd *abfd,
|
||||
|
||||
if (h->root.type == bfd_link_hash_new)
|
||||
{
|
||||
bfd_elf_link_mark_dynamic_symbol (info, h);
|
||||
h->non_elf = 0;
|
||||
return TRUE;
|
||||
}
|
||||
@@ -1626,6 +1645,10 @@ _bfd_elf_export_symbol (struct elf_link_hash_entry *h, void *data)
|
||||
{
|
||||
struct elf_info_failed *eif = data;
|
||||
|
||||
/* Ignore this if we won't export it. */
|
||||
if (!eif->info->export_dynamic && !h->dynamic)
|
||||
return TRUE;
|
||||
|
||||
/* Ignore indirect symbols. These are added by the versioning code. */
|
||||
if (h->root.type == bfd_link_hash_indirect)
|
||||
return TRUE;
|
||||
@@ -2379,7 +2402,7 @@ _bfd_elf_fix_symbol_flags (struct elf_link_hash_entry *h,
|
||||
if (h->needs_plt
|
||||
&& eif->info->shared
|
||||
&& is_elf_hash_table (eif->info->hash)
|
||||
&& (eif->info->symbolic
|
||||
&& (SYMBOLIC_BIND (eif->info, h)
|
||||
|| ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
|
||||
&& h->def_regular)
|
||||
{
|
||||
@@ -2608,7 +2631,7 @@ _bfd_elf_dynamic_symbol_p (struct elf_link_hash_entry *h,
|
||||
|
||||
/* Identify the cases where name binding rules say that a
|
||||
visible symbol resolves locally. */
|
||||
binding_stays_local_p = info->executable || info->symbolic;
|
||||
binding_stays_local_p = info->executable || SYMBOLIC_BIND (info, h);
|
||||
|
||||
switch (ELF_ST_VISIBILITY (h->other))
|
||||
{
|
||||
@@ -2671,7 +2694,7 @@ _bfd_elf_symbol_refs_local_p (struct elf_link_hash_entry *h,
|
||||
/* At this point, we know the symbol is defined and dynamic. In an
|
||||
executable it must resolve locally, likewise when building symbolic
|
||||
shared libraries. */
|
||||
if (info->executable || info->symbolic)
|
||||
if (info->executable || SYMBOLIC_BIND (info, h))
|
||||
return TRUE;
|
||||
|
||||
/* Now deal with defined dynamic symbols in shared libraries. Ones
|
||||
@@ -5322,7 +5345,8 @@ bfd_elf_size_dynamic_sections (bfd *output_bfd,
|
||||
|
||||
/* If we are supposed to export all symbols into the dynamic symbol
|
||||
table (this is not the normal case), then do so. */
|
||||
if (info->export_dynamic)
|
||||
if (info->export_dynamic
|
||||
|| (info->executable && info->dynamic))
|
||||
{
|
||||
elf_link_hash_traverse (elf_hash_table (info),
|
||||
_bfd_elf_export_symbol,
|
||||
|
||||
Reference in New Issue
Block a user