From: H.J. Lu Date: Tue, 14 Jan 2025 13:21:02 +0000 (+0800) Subject: ld: Parse linker script only once X-Git-Tag: binutils-2_44~137 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e76d66a53ee9ef0a70fdb44a3150518fcc8086ea;p=thirdparty%2Fbinutils-gdb.git 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 --- diff --git a/ld/ldlang.c b/ld/ldlang.c index e1e491732a9..634a6843416 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 ffe1d70d15e..f1c5f7035c5 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 34770762f1c..0baa3c305c3 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