ld: Handle --dynamic-list* before -Bsymbolic -Bsymbolic-functions

--dynamic-list* should work both before and after -Bsymbolic and
-Bsymbolic-functions.

	PR ld/26018
	* lexsup.c (parse_args): Simplify.
	* testsuite/ld-elf/dl4e.out: New.
	* testsuite/ld-elf/shared.exp: Updated for PR ld/26018 tests.
This commit is contained in:
Fangrui Song
2020-05-20 18:31:39 -07:00
committed by H.J. Lu
parent 309cae1f7b
commit bb68f22c8e
4 changed files with 37 additions and 25 deletions

View File

@@ -1390,22 +1390,16 @@ parse_args (unsigned argc, char **argv)
break;
case OPTION_DYNAMIC_LIST_DATA:
opt_dynamic_list = dynamic_list_data;
if (opt_symbolic == symbolic)
opt_symbolic = symbolic_unset;
break;
case OPTION_DYNAMIC_LIST_CPP_TYPEINFO:
lang_append_dynamic_list_cpp_typeinfo ();
if (opt_dynamic_list != dynamic_list_data)
opt_dynamic_list = dynamic_list;
if (opt_symbolic == symbolic)
opt_symbolic = symbolic_unset;
break;
case OPTION_DYNAMIC_LIST_CPP_NEW:
lang_append_dynamic_list_cpp_new ();
if (opt_dynamic_list != dynamic_list_data)
opt_dynamic_list = dynamic_list;
if (opt_symbolic == symbolic)
opt_symbolic = symbolic_unset;
break;
case OPTION_DYNAMIC_LIST:
/* This option indicates a small script that only specifies
@@ -1422,8 +1416,6 @@ parse_args (unsigned argc, char **argv)
}
if (opt_dynamic_list != dynamic_list_data)
opt_dynamic_list = dynamic_list;
if (opt_symbolic == symbolic)
opt_symbolic = symbolic_unset;
break;
case OPTION_WARN_COMMON:
config.warn_common = TRUE;
@@ -1632,6 +1624,19 @@ parse_args (unsigned argc, char **argv)
&& command_line.check_section_addresses < 0)
command_line.check_section_addresses = 0;
switch (opt_dynamic_list)
{
case dynamic_list_unset:
break;
case dynamic_list_data:
link_info.dynamic_data = TRUE;
/* Fall through. */
case dynamic_list:
link_info.dynamic = TRUE;
opt_symbolic = symbolic_unset;
break;
}
/* -Bsymbolic and -Bsymbols-functions are for shared library output. */
if (bfd_link_dll (&link_info))
switch (opt_symbolic)
@@ -1651,25 +1656,13 @@ parse_args (unsigned argc, char **argv)
free (link_info.dynamic_list);
link_info.dynamic_list = NULL;
}
opt_dynamic_list = dynamic_list_unset;
break;
case symbolic_functions:
opt_dynamic_list = dynamic_list_data;
link_info.dynamic = TRUE;
link_info.dynamic_data = TRUE;
break;
}
switch (opt_dynamic_list)
{
case dynamic_list_unset:
break;
case dynamic_list_data:
link_info.dynamic_data = TRUE;
/* Fall through. */
case dynamic_list:
link_info.dynamic = TRUE;
break;
}
if (!bfd_link_dll (&link_info))
{
if (command_line.filter_shlib)