diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2025-01-14 21:21:02 +0800 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2025-01-15 05:50:37 +0800 |
commit | e76d66a53ee9ef0a70fdb44a3150518fcc8086ea (patch) | |
tree | f9880673ab9d9587a174b380453671e8a289afa7 | |
parent | 9d375dfebba2c10fa074c5cf0ecd0bdaef7bba7a (diff) | |
download | binutils-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.c | 2 | ||||
-rw-r--r-- | ld/ldmain.c | 64 | ||||
-rw-r--r-- | ld/ldmain.h | 2 |
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 |