From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 73068 invoked by alias); 23 May 2019 01:08:19 -0000 Mailing-List: contact binutils-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: binutils-owner@sourceware.org Received: (qmail 72533 invoked by uid 89); 23 May 2019 01:08:19 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-20.0 required=5.0 tests=AWL,BAYES_00,FAKE_REPLY_C,FREEMAIL_FROM,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.1 spammy=HX-Spam-Relays-External:sk:mail-pf, HX-HELO:sk:mail-pf, H*r:sk:static., H*RU:sk:mail-pf X-HELO: mail-pf1-f169.google.com Received: from mail-pf1-f169.google.com (HELO mail-pf1-f169.google.com) (209.85.210.169) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 23 May 2019 01:08:17 +0000 Received: by mail-pf1-f169.google.com with SMTP id s11so2232808pfm.12 for ; Wed, 22 May 2019 18:08:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:subject:message-id:mime-version:content-disposition :user-agent; bh=cWatENRjobvEBncz1DYZ3SImsHZXYsua1x+S9zXgAjs=; b=rQGUAZkr4wnF6R7Q4TtF1zVjAUwLvyGCWqaPCznBOM4k45uRH9E49wsR9U2UoMKxA8 rsO9VXb2ANz1WHLADcrQs2HwNgnDQA/Airv9/mjfYeWdQqj9dlJ/IL5V+ovCDsjtgCCZ /PNrNA6u5j5ZvB9pw4YMtLnUB4W20ejanCvUgl22tDKqPHouo8SKdk7C8ulOkvCacnAI 2rP1yflZb/L7uk89D02ABTNxL/On5qEQJuzkTxHHMXAHL1Pink7CYbZiDpvpgkXY3lbU REAuaewhp5ks+WQGxmnccFHl5r6ABW7N1nANKUQ4R5CFoGwQTSc+BtmPGPgx71rWqCKb 5Lhw== Return-Path: Received: from bubble.grove.modra.org (158.106.96.58.static.exetel.com.au. [58.96.106.158]) by smtp.gmail.com with ESMTPSA id g22sm29959888pfo.28.2019.05.22.18.08.13 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 22 May 2019 18:08:14 -0700 (PDT) Received: by bubble.grove.modra.org (Postfix, from userid 1000) id 628F880632; Thu, 23 May 2019 10:38:10 +0930 (ACST) Date: Thu, 23 May 2019 01:08:00 -0000 From: Alan Modra To: binutils@sourceware.org Subject: Re: Have the linker report an error if the same script is used twice Message-ID: <20190523010809.GY6820@bubble.grove.modra.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.9.4 (2018-02-28) X-IsSubscribed: yes X-SW-Source: 2019-05/txt/msg00312.txt.bz2 git commit 6ec6968b1b2 results in ... error: linker script file '/usr/local/lib64/libgcc_s.so' appears multiple times collect2: error: ld returned 1 exit status FAIL: bootstrap This patch changes things so that an error is given only when a -T script or the default script is invoked more than once. I'm still a little nervous that we match script file names, not the entire path. PR 24576 * ldfile.c (enum script_open_style): New. (struct script_name_list): New. (ldfile_open_command_file_1): Take a script_open_style param rather than booleans. Adjust callers. Only fail when -T or default -T script is invoked twice. (ldfile_try_open_bfd): Revert last change. diff --git a/ld/ldfile.c b/ld/ldfile.c index 5bb08f7b2e..7f60319390 100644 --- a/ld/ldfile.c +++ b/ld/ldfile.c @@ -186,7 +186,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 +585,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 +655,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 +669,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 -- Alan Modra Australia Development Lab, IBM