[PATCH v3] ld: Use stat to check if linker script appears multiple times
H.J. Lu
hjl.tools@gmail.com
Tue Aug 12 14:38:34 GMT 2025
On Tue, Aug 12, 2025 at 7:16 AM Jan Beulich <jbeulich@suse.com> wrote:
>
> On 12.08.2025 13:57, H.J. Lu wrote:
> > Use stat, instead of strcmp, to check if the same linker script file
> > appears multiple times for
> >
> > $ ld -L... -T ././/script.t -T script.t ...
> >
> > Although ././/script.t and script.t access the same file, but their
> > filenames are different. strcmp won't work here.
> >
> > Copy gnulib/import/same-inode.h to include since the gnulib directory
> > isn't included in the binutils tarball.
> >
> > include/
> >
> > PR ld/24576
> > * same-inode.h: New file. Copied from gnulib/import/same-inode.h.
> >
> > ld/
> >
> > PR ld/24576
> > * ldfile.c: Include "same-inode.h".
> > (ldfile_find_command_file): Change the second argument from bool
> > to enum script_open_style. Check if the same linker script file
> > appears multiple times by using stat, instead using strcmp.
> > (ldfile_open_command_file_1): Don't check if the same linker
> > script file appears multiple times here.
> > * testsuite/ld-scripts/pr24576-2.d: New.
> > * testsuite/ld-scripts/script.exp: Run pr24576-2.
> >
> > Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
>
> Looks largely okay to me, but I have one more question and a small remark:
>
> > --- a/ld/ldfile.c
> > +++ b/ld/ldfile.c
> > @@ -35,6 +35,7 @@
> > #include "libiberty.h"
> > #include "filenames.h"
> > #include <fnmatch.h>
> > +#include "same-inode.h"
> > #if BFD_SUPPORTS_PLUGINS
> > #include "plugin.h"
> > #endif /* BFD_SUPPORTS_PLUGINS */
> > @@ -828,19 +829,26 @@ find_scripts_dir (void)
> >
> > static FILE *
> > ldfile_find_command_file (const char *name,
> > - bool default_only,
> > + enum script_open_style open_how,
> > bool *sysrooted)
> > {
> > search_dirs_type *search;
> > FILE *result = NULL;
> > - char *path;
> > + char *path = NULL;
> > + const char *filename = NULL;
> > + struct script_name_list *script;
> > + size_t len;
> > + struct stat sbuf1;
> >
> > - if (!default_only)
> > + if (open_how != script_defaultT)
> > {
> > /* First try raw name. */
> > result = try_open (name, sysrooted);
> > if (result != NULL)
> > - return result;
> > + {
> > + filename = name;
> > + goto success;
> > + }
> > }
> >
> > if (!script_search)
> > @@ -861,20 +869,45 @@ ldfile_find_command_file (const char *name,
> > *search_tail_ptr = script_search;
> >
> > /* Try now prefixes. */
> > - for (search = default_only ? script_search : search_head;
> > + for (search = open_how == script_defaultT ? script_search : search_head;
> > search != NULL;
> > search = search->next)
> > {
> > path = concat (search->name, slash, name, (const char *) NULL);
> > result = try_open (path, sysrooted);
> > - free (path);
> > if (result)
> > - break;
> > + {
> > + filename = path;
> > + break;
> > + }
> > }
> >
> > /* Restore the original path list. */
> > *search_tail_ptr = NULL;
> >
> > +success:
>
> May I ask that labels be indented by at least one blank, for the sake of
> "diff -p" and alike?
Fixed in v4.
> > + /* PR 24576: Catch the case where the user has accidentally included
> > + the same linker script twice. */
> > + if (stat (filename, &sbuf1) == 0)
> > + for (script = processed_scripts; script != NULL; script = script->next)
> > + if (open_how != script_nonT || script->open_how != script_nonT)
> > + {
> > + struct stat sbuf2;
> > + if (stat (script->name, &sbuf2) == 0
> > + && SAME_INODE (sbuf1, sbuf2))
> > + fatal (_("%P: error: linker script file '%s'"
> > + " appears multiple times\n"), name);
>
> Reporting "name" here may not be very helpful? Imo we want to report both
> "filename" and "script->name", which may be entirely different from one
> another (and also different from "name").
>
Changed in v4.
Thanks.
--
H.J.
More information about the Binutils
mailing list