]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
ld: Parse linker script only once
authorH.J. Lu <hjl.tools@gmail.com>
Tue, 14 Jan 2025 13:21:02 +0000 (21:21 +0800)
committerH.J. Lu <hjl.tools@gmail.com>
Tue, 14 Jan 2025 21:50:37 +0000 (05:50 +0800)
Parsing linker script twice caused

FAIL: ld-plugin/lto-3r
FAIL: ld-plugin/lto-5r
FAIL: PR ld/19317 (2)

for x86_64-w64-mingw32 with the linker error:

./ld-new:built in linker script:27 assignment to location counter invalid outside of SECTIONS

ldscripts/i386pep.xr has

 24   .rdata  :
 25   {
 26     *(.rdata)
 27     . = ALIGN(4);
 28     /* .ctors & .dtors */
 29     /* .CRT */
 30     /* ___crt_xl_end__ is defined in the TLS Directory support code */
 31   }

Remove ld_parse_linker_script to parse linker script only once.

* ldlang.c (cmdline_emit_object_only_section): Don't call
ld_parse_linker_script.
* ldmain.c (main): Fold ld_parse_linker_script.
(ld_parse_linker_script): Removed.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
ld/ldlang.c
ld/ldmain.c
ld/ldmain.h

index e1e491732a910fbd57dc15fa157d3a3e49d6949e..634a68434165badfbcfbdb40feb88b68958d1ed1 100644 (file)
@@ -10823,8 +10823,6 @@ cmdline_emit_object_only_section (void)
   lang_init (true);
   ldexp_init (true);
 
-  ld_parse_linker_script ();
-
   /* Set up the object-only output. */
   lang_final ();
 
index ffe1d70d15ede84344af947d84331147338f8bed..f1c5f7035c5c5278922d30680d8d9d133e1805e1 100644 (file)
@@ -410,7 +410,34 @@ main (int argc, char **argv)
 
   ldemul_set_symbols ();
 
-  ld_parse_linker_script ();
+  /* If we have not already opened and parsed a linker script,
+     try the default script from command line first.  */
+  if (saved_script_handle == NULL
+      && command_line.default_script != NULL)
+    {
+      ldfile_open_script_file (command_line.default_script);
+      parser_input = input_script;
+      yyparse ();
+    }
+
+  /* If we have not already opened and parsed a linker script
+     read the emulation's appropriate default script.  */
+  if (saved_script_handle == NULL)
+    {
+      int isfile;
+      char *s = ldemul_get_script (&isfile);
+
+      if (isfile)
+       ldfile_open_default_command_file (s);
+      else
+       {
+         lex_string = s;
+         lex_redirect (s, _("built in linker script"), 1);
+       }
+      parser_input = input_script;
+      yyparse ();
+      lex_string = NULL;
+    }
 
   if (verbose)
     {
@@ -1677,38 +1704,3 @@ notice (struct bfd_link_info *info,
 
   return true;
 }
-
-/* Parse the linker script.   */
-
-void
-ld_parse_linker_script (void)
-{
-  /* If we have not already opened and parsed a linker script,
-     try the default script from command line first.  */
-  if (saved_script_handle == NULL
-      && command_line.default_script != NULL)
-    {
-      ldfile_open_script_file (command_line.default_script);
-      parser_input = input_script;
-      yyparse ();
-    }
-
-  /* If we have not already opened and parsed a linker script
-     read the emulation's appropriate default script.  */
-  if (saved_script_handle == NULL)
-    {
-      int isfile;
-      char *s = ldemul_get_script (&isfile);
-
-      if (isfile)
-       ldfile_open_default_command_file (s);
-      else
-       {
-         lex_string = s;
-         lex_redirect (s, _("built in linker script"), 1);
-       }
-      parser_input = input_script;
-      yyparse ();
-      lex_string = NULL;
-    }
-}
index 34770762f1cda695fdfa704409830b4fe6f87914..0baa3c305c3dbc45045c5b4779aaa95620bf7c10 100644 (file)
@@ -63,6 +63,4 @@ extern void add_ignoresym (struct bfd_link_info *, const char *);
 extern void add_keepsyms_file (const char *);
 extern void track_dependency_files (const char *);
 
-extern void ld_parse_linker_script (void);
-
 #endif