2007-01-16  H.J. Lu  <hongjiu.lu@intel.com>

	PR ld/3831
	* elf-bfd.h (bfd_elf_link_mark_dynamic_symbol): Add an
	argument, Elf_Internal_Sym *.

	* elflink.c (bfd_elf_link_mark_dynamic_symbol): Mark a data
	symbol dynamic if info->dynamic_data is TRUE.
	(bfd_elf_record_link_assignment): Updated call to
	bfd_elf_record_link_assignment.
	(_bfd_elf_merge_symbol): Likewise.  Always call
	bfd_elf_link_mark_dynamic_symbol.

include/

2007-01-16  H.J. Lu  <hongjiu.lu@intel.com>

	PR ld/3831
	* bfdlink.h (bfd_link_info): Rename dynamic to dynamic_list.
	Add dynamic and dynamic_data.

ld/

2007-01-16  H.J. Lu  <hongjiu.lu@intel.com>

	PR ld/3831
	* NEWS: Mention -Bsymbolic-functions, --dynamic-list-data and
	--dynamic-list-cpp-new.

	* ld.texinfo: Document -Bsymbolic-functions, --dynamic-list-data
	and --dynamic-list-cpp-new.

	* ldlang.c (lang_append_dynamic_list_cpp_new): New.
	(lang_process): Change link_info.dynamic to
	link_info.dynamic_list.
	(lang_append_dynamic_list): Likewise.
	* ldmain.c (main): Likewise.  Initialize link_info.dynamic and
	link_info.dynamic_data to FALSE.

	* ldlang.h (lang_append_dynamic_list_cpp_new): New.

	* lexsup.c (option_values): Add OPTION_DYNAMIC_LIST_DATA and
	OPTION_DYNAMIC_LIST_CPP_NEW.
	(ld_options): Add entries for -Bsymbolic-functions,
	--dynamic-list-data and --dynamic-list-cpp-new.  Make
	-Bsymbolic-functions an alias of --dynamic-list-data.
	(parse_args): Change link_info.dynamic to link_info.dynamic_list.
	Set link_info.dynamic to TRUE for --dynamic-list and
	--dynamic-list-cpp-typeinfo.  Handle --dynamic-list-data and
	--dynamic-list-cpp-new.

ld/testsuite/

2007-01-16  H.J. Lu  <hongjiu.lu@intel.com>

	PR ld/3831
	* ld-elf/del.cc: New.
	* ld-elf/dl5.cc: Likewise.
	* ld-elf/dl5.out: Likewise.
	* ld-elf/new.cc: Likewise.

	* ld-elf/shared.exp: Add tests for --dynamic-list-data and
	 --dynamic-list-cpp-new.
This commit is contained in:
H.J. Lu
2007-01-16 14:56:32 +00:00
parent b20d8971ad
commit 40b36307e3
18 changed files with 319 additions and 17 deletions

View File

@ -5634,8 +5634,8 @@ void
lang_process (void)
{
/* Finalize dynamic list. */
if (link_info.dynamic)
lang_finalize_version_expr_head (&link_info.dynamic->head);
if (link_info.dynamic_list)
lang_finalize_version_expr_head (&link_info.dynamic_list->head);
current_target = default_target;
@ -6945,13 +6945,13 @@ lang_add_unique (const char *name)
void
lang_append_dynamic_list (struct bfd_elf_version_expr *dynamic)
{
if (link_info.dynamic)
if (link_info.dynamic_list)
{
struct bfd_elf_version_expr *tail;
for (tail = dynamic; tail->next != NULL; tail = tail->next)
;
tail->next = link_info.dynamic->head.list;
link_info.dynamic->head.list = dynamic;
tail->next = link_info.dynamic_list->head.list;
link_info.dynamic_list->head.list = dynamic;
}
else
{
@ -6960,7 +6960,7 @@ lang_append_dynamic_list (struct bfd_elf_version_expr *dynamic)
d = xcalloc (1, sizeof *d);
d->head.list = dynamic;
d->match = lang_vers_match;
link_info.dynamic = d;
link_info.dynamic_list = d;
}
}
@ -6984,3 +6984,24 @@ lang_append_dynamic_list_cpp_typeinfo (void)
lang_append_dynamic_list (dynamic);
}
/* Append the list of C++ operator new and delete dynamic symbols to the
existing one. */
void
lang_append_dynamic_list_cpp_new (void)
{
const char * symbols [] =
{
"operator new*",
"operator delete*"
};
struct bfd_elf_version_expr *dynamic = NULL;
unsigned int i;
for (i = 0; i < ARRAY_SIZE (symbols); i++)
dynamic = lang_new_vers_pattern (dynamic, symbols [i], "C++",
FALSE);
lang_append_dynamic_list (dynamic);
}