X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=ld%2Fldfile.c;h=9f0398a41e6453fc0ad2900217df342baf932f5c;hb=f69656d00fe3154519ea21668d964bf8cc50c01b;hp=5bb08f7b2e46f1072efc92de6b5a1c7bb109f6c1;hpb=6ec6968b1b259948ba42f0a47a3da048377058bc;p=deliverable%2Fbinutils-gdb.git diff --git a/ld/ldfile.c b/ld/ldfile.c index 5bb08f7b2e..9f0398a41e 100644 --- a/ld/ldfile.c +++ b/ld/ldfile.c @@ -21,6 +21,7 @@ #include "sysdep.h" #include "bfd.h" #include "bfdlink.h" +#include "ctf-api.h" #include "safe-ctype.h" #include "ld.h" #include "ldmisc.h" @@ -186,7 +187,7 @@ ldfile_try_open_bfd (const char *attempt, extern FILE *yyin; /* Try to interpret the file as a linker script. */ - ldfile_open_script_file (attempt); + ldfile_open_command_file (attempt); ldfile_assumed_script = TRUE; parser_input = input_selected; @@ -585,44 +586,56 @@ ldfile_find_command_file (const char *name, return result; } +enum script_open_style { + script_nonT, + script_T, + script_defaultT +}; + +struct script_name_list +{ + struct script_name_list *next; + enum script_open_style open_how; + char name[1]; +}; + /* Open command file NAME. */ static void -ldfile_open_command_file_1 (const char *name, - bfd_boolean default_only, - bfd_boolean is_script) +ldfile_open_command_file_1 (const char *name, enum script_open_style open_how) { FILE *ldlex_input_stack; bfd_boolean sysrooted; + static struct script_name_list *processed_scripts = NULL; + struct script_name_list *script; + size_t len; - if (is_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) { - 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 ((open_how != script_nonT || script->open_how != script_nonT) + && strcmp (name, script->name) == 0) { - if (strcmp (name, script->name) == 0) - { - einfo (_("%F%P: error: linker script file '%s' appears multiple times\n"), - name); - return; - } + 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); - + /* 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. */ + len = strlen (name); + script = xmalloc (sizeof (*script) + len); + script->next = processed_scripts; + script->open_how = open_how; + memcpy (script->name, name, len + 1); + processed_scripts = script; + + ldlex_input_stack = ldfile_find_command_file (name, + open_how == script_defaultT, + &sysrooted); if (ldlex_input_stack == NULL) { bfd_set_error (bfd_error_system_call); @@ -643,13 +656,13 @@ ldfile_open_command_file_1 (const char *name, void ldfile_open_command_file (const char *name) { - ldfile_open_command_file_1 (name, FALSE, FALSE); + ldfile_open_command_file_1 (name, script_nonT); } void ldfile_open_script_file (const char *name) { - ldfile_open_command_file_1 (name, FALSE, TRUE); + ldfile_open_command_file_1 (name, script_T); } /* Open command file NAME at the default script location. */ @@ -657,7 +670,7 @@ ldfile_open_script_file (const char *name) void ldfile_open_default_command_file (const char *name) { - ldfile_open_command_file_1 (name, TRUE, TRUE); + ldfile_open_command_file_1 (name, script_defaultT); } void