Have the linker report an error if the same script is used twice.
PR 24576 * ld/ldfile.c: (ldfile_open_command_file_1): Add new parameter - is_script. If true check that the file has not already been parsed as a linker script. (ldfile_open_script_file): New function. (ldfile_try_open_bfd): Use the new function in place of ldfile_open_command_line. * ldmain.c (main): Likewise. * lexsup.c (parse_args): Use the new function for opening linker scripts with the -T option. * ldfile.h (ldfile_open_script_file): Add prototype.
This commit is contained in:
parent
8fca4da075
commit
6ec6968b1b
5 changed files with 57 additions and 6 deletions
15
ld/ChangeLog
15
ld/ChangeLog
|
@ -1,3 +1,18 @@
|
||||||
|
2019-05-22 Julius Werner <jwerner@chromium.org>
|
||||||
|
Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
|
PR 24576
|
||||||
|
* ld/ldfile.c: (ldfile_open_command_file_1): Add new parameter -
|
||||||
|
is_script. If true check that the file has not already been
|
||||||
|
parsed as a linker script.
|
||||||
|
(ldfile_open_script_file): New function.
|
||||||
|
(ldfile_try_open_bfd): Use the new function in place of
|
||||||
|
ldfile_open_command_line.
|
||||||
|
* ldmain.c (main): Likewise.
|
||||||
|
* lexsup.c (parse_args): Use the new function for opening linker
|
||||||
|
scripts with the -T option.
|
||||||
|
* ldfile.h (ldfile_open_script_file): Add prototype.
|
||||||
|
|
||||||
2019-05-21 Faraz Shahbazker <fshahbazker@wavecomp.com>
|
2019-05-21 Faraz Shahbazker <fshahbazker@wavecomp.com>
|
||||||
|
|
||||||
* testsuite/ld-mips-elf/pic-reloc-5.s: Add tests for
|
* testsuite/ld-mips-elf/pic-reloc-5.s: Add tests for
|
||||||
|
|
42
ld/ldfile.c
42
ld/ldfile.c
|
@ -186,7 +186,7 @@ ldfile_try_open_bfd (const char *attempt,
|
||||||
extern FILE *yyin;
|
extern FILE *yyin;
|
||||||
|
|
||||||
/* Try to interpret the file as a linker script. */
|
/* Try to interpret the file as a linker script. */
|
||||||
ldfile_open_command_file (attempt);
|
ldfile_open_script_file (attempt);
|
||||||
|
|
||||||
ldfile_assumed_script = TRUE;
|
ldfile_assumed_script = TRUE;
|
||||||
parser_input = input_selected;
|
parser_input = input_selected;
|
||||||
|
@ -588,11 +588,39 @@ ldfile_find_command_file (const char *name,
|
||||||
/* Open command file NAME. */
|
/* Open command file NAME. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ldfile_open_command_file_1 (const char *name, bfd_boolean default_only)
|
ldfile_open_command_file_1 (const char *name,
|
||||||
|
bfd_boolean default_only,
|
||||||
|
bfd_boolean is_script)
|
||||||
{
|
{
|
||||||
FILE *ldlex_input_stack;
|
FILE *ldlex_input_stack;
|
||||||
bfd_boolean sysrooted;
|
bfd_boolean sysrooted;
|
||||||
|
|
||||||
|
if (is_script)
|
||||||
|
{
|
||||||
|
static struct name_list *processed_scripts = NULL;
|
||||||
|
struct name_list *script;
|
||||||
|
|
||||||
|
/* PR 24576: Catch the case where the user has accidentally included
|
||||||
|
the same linker script twice. */
|
||||||
|
for (script = processed_scripts; script != NULL; script = script->next)
|
||||||
|
{
|
||||||
|
if (strcmp (name, script->name) == 0)
|
||||||
|
{
|
||||||
|
einfo (_("%F%P: error: linker script file '%s' appears multiple times\n"),
|
||||||
|
name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* FIXME: This memory is never freed, but that should not really matter.
|
||||||
|
It will be released when the linker exits, and it is unlikely to ever
|
||||||
|
be more than a few tens of bytes. */
|
||||||
|
script = xmalloc (sizeof (name_list));
|
||||||
|
script->name = strdup (name);
|
||||||
|
script->next = processed_scripts;
|
||||||
|
processed_scripts = script;
|
||||||
|
}
|
||||||
|
|
||||||
ldlex_input_stack = ldfile_find_command_file (name, default_only, &sysrooted);
|
ldlex_input_stack = ldfile_find_command_file (name, default_only, &sysrooted);
|
||||||
|
|
||||||
if (ldlex_input_stack == NULL)
|
if (ldlex_input_stack == NULL)
|
||||||
|
@ -615,7 +643,13 @@ ldfile_open_command_file_1 (const char *name, bfd_boolean default_only)
|
||||||
void
|
void
|
||||||
ldfile_open_command_file (const char *name)
|
ldfile_open_command_file (const char *name)
|
||||||
{
|
{
|
||||||
ldfile_open_command_file_1 (name, FALSE);
|
ldfile_open_command_file_1 (name, FALSE, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ldfile_open_script_file (const char *name)
|
||||||
|
{
|
||||||
|
ldfile_open_command_file_1 (name, FALSE, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Open command file NAME at the default script location. */
|
/* Open command file NAME at the default script location. */
|
||||||
|
@ -623,7 +657,7 @@ ldfile_open_command_file (const char *name)
|
||||||
void
|
void
|
||||||
ldfile_open_default_command_file (const char *name)
|
ldfile_open_default_command_file (const char *name)
|
||||||
{
|
{
|
||||||
ldfile_open_command_file_1 (name, TRUE);
|
ldfile_open_command_file_1 (name, TRUE, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -46,6 +46,8 @@ extern void ldfile_add_library_path
|
||||||
(const char *, bfd_boolean cmdline);
|
(const char *, bfd_boolean cmdline);
|
||||||
extern void ldfile_open_command_file
|
extern void ldfile_open_command_file
|
||||||
(const char *name);
|
(const char *name);
|
||||||
|
extern void ldfile_open_script_file
|
||||||
|
(const char *name);
|
||||||
extern void ldfile_open_default_command_file
|
extern void ldfile_open_default_command_file
|
||||||
(const char *name);
|
(const char *name);
|
||||||
extern void ldfile_open_file
|
extern void ldfile_open_file
|
||||||
|
|
|
@ -329,7 +329,7 @@ main (int argc, char **argv)
|
||||||
if (saved_script_handle == NULL
|
if (saved_script_handle == NULL
|
||||||
&& command_line.default_script != NULL)
|
&& command_line.default_script != NULL)
|
||||||
{
|
{
|
||||||
ldfile_open_command_file (command_line.default_script);
|
ldfile_open_script_file (command_line.default_script);
|
||||||
parser_input = input_script;
|
parser_input = input_script;
|
||||||
yyparse ();
|
yyparse ();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1243,7 +1243,7 @@ parse_args (unsigned argc, char **argv)
|
||||||
break;
|
break;
|
||||||
case 'T':
|
case 'T':
|
||||||
previous_script_handle = saved_script_handle;
|
previous_script_handle = saved_script_handle;
|
||||||
ldfile_open_command_file (optarg);
|
ldfile_open_script_file (optarg);
|
||||||
parser_input = input_script;
|
parser_input = input_script;
|
||||||
yyparse ();
|
yyparse ();
|
||||||
previous_script_handle = NULL;
|
previous_script_handle = NULL;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue