aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2025-01-14 21:21:02 +0800
committerH.J. Lu <hjl.tools@gmail.com>2025-01-15 05:50:37 +0800
commite76d66a53ee9ef0a70fdb44a3150518fcc8086ea (patch)
treef9880673ab9d9587a174b380453671e8a289afa7
parent9d375dfebba2c10fa074c5cf0ecd0bdaef7bba7a (diff)
downloadbinutils-e76d66a53ee9ef0a70fdb44a3150518fcc8086ea.zip
binutils-e76d66a53ee9ef0a70fdb44a3150518fcc8086ea.tar.gz
binutils-e76d66a53ee9ef0a70fdb44a3150518fcc8086ea.tar.bz2
ld: Parse linker script only once
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>
-rw-r--r--ld/ldlang.c2
-rw-r--r--ld/ldmain.c64
-rw-r--r--ld/ldmain.h2
3 files changed, 28 insertions, 40 deletions
diff --git a/ld/ldlang.c b/ld/ldlang.c
index e1e4917..634a684 100644
--- a/ld/ldlang.c
+++ b/ld/ldlang.c
@@ -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 ();
diff --git a/ld/ldmain.c b/ld/ldmain.c
index ffe1d70..f1c5f70 100644
--- a/ld/ldmain.c
+++ b/ld/ldmain.c
@@ -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;
- }
-}
diff --git a/ld/ldmain.h b/ld/ldmain.h
index 3477076..0baa3c3 100644
--- a/ld/ldmain.h
+++ b/ld/ldmain.h
@@ -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