[PATCH] ld: Issue an error for recursively included linker script

H.J. Lu hjl.tools@gmail.com
Fri Aug 15 04:08:46 GMT 2025


On Thu, Aug 14, 2025 at 9:00 AM Jan Beulich <jbeulich@suse.com> wrote:
>
> On 14.08.2025 17:47, H.J. Lu wrote:
> > On Thu, Aug 14, 2025 at 8:26 AM Jan Beulich <jbeulich@suse.com> wrote:
> >> On 14.08.2025 17:05, H.J. Lu wrote:
> >>> When a linker script is included recursively by mistake, issue an error
> >>> instead of hang forever without outputting any error message.
> >>>
> >>>       PR ld/33265
> >>>       * ldfile.c (opened_scripts): New.
> >>>       (ldfile_try_open_bfd): After reading a linker script, clear the
> >>>       opened linker script list and free its memory.
> >>>       (ldfile_find_command_file): Issue a fatal error when the linker
> >>>       script is included recursively.  Add the linker script to the
> >>>       linked list of opened linker scripts.
> >>>       * testsuite/ld-scripts/libpr33265-1.a: New file.
> >>>       * testsuite/ld-scripts/libpr33265-2.a: Likewise.
> >>>       * testsuite/ld-scripts/pr33265-1.d: Likewise.
> >>>       * testsuite/ld-scripts/pr33265-2.d: Likewise.
> >>>       * testsuite/ld-scripts/script.exp: Run PR ld/33265 tests.
> >>>
> >>> Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
> >>
> >> Is this a v2, or merely a re-submission of v1 (for whatever reason)? In
> >> any event, my prior question ...
> >
> > It is a rebase.  It should be v2.
> >
> >>> @@ -475,6 +480,11 @@ ldfile_try_open_bfd (const char *attempt,
> >>>                 ldfile_assumed_script = false;
> >>>                 fclose (yyin);
> >>>                 yyin = NULL;
> >>> +
> >>> +               /* After reading a linker script, clear the opened
> >>> +                  linker script list and free its memory.  */
> >>> +               ldfile_script_free (&opened_scripts);
> >>
> >> ... here remains: We can't get here recursively, in which case - aiui -
> >> the freeing would happen too early?
> >
> > True, we won't get there recursively since a recursion will cause a fatal
> > error before we get here.  The opened script list only applies to
> > the linker script file we are currently reading.  After closing the file,
> > the opened script list is no longer valid and should be freed.
>
> Wait - I expect there can be multiple levels of nesting. What if a script
> at level 1 includes one (level 2) which includes another one (level 3),
> and then level 2 includes the script included at level 1 again? Won't you
> have lost track of everything at the point the level 3 script is closed?
>

I sent the v3 patch with a different approach by limiting the nested group
depth.

--
H.J.


More information about the Binutils mailing list