PR23648, Symbols based on MEMORY regions confuse --gc-sections

Running lang_do_memory_regions earlier seems a reasonable solution to
gaining better values for symbols prior to lang_gc_sections.

	PR ld/23648
	* ldlang.c (lang_process): Move lang_do_memory_regions earlier.
	Comment on lang_do_assignments call.
	* ldgram.y (origin_exp): Don't assign region->current.
This commit is contained in:
Alan Modra 2018-09-19 13:22:43 +09:30
parent aa654ee8f8
commit 7f0cfc6eb8
3 changed files with 15 additions and 5 deletions

View File

@ -1,3 +1,10 @@
2018-09-19 Alan Modra <amodra@gmail.com>
PR ld/23648
* ldlang.c (lang_process): Move lang_do_memory_regions earlier.
Comment on lang_do_assignments call.
* ldgram.y (origin_exp): Don't assign region->current.
2018-09-19 Alan Modra <amodra@gmail.com> 2018-09-19 Alan Modra <amodra@gmail.com>
* ldmain.c (add_archive_element): Handle auto-inport symbols * ldmain.c (add_archive_element): Handle auto-inport symbols

View File

@ -819,7 +819,6 @@ origin_spec:
ORIGIN '=' mustbe_exp ORIGIN '=' mustbe_exp
{ {
region->origin_exp = $3; region->origin_exp = $3;
region->current = region->origin;
} }
; ;

View File

@ -7180,6 +7180,9 @@ lang_process (void)
current_target = default_target; current_target = default_target;
lang_statement_iteration++; lang_statement_iteration++;
open_input_bfds (statement_list.head, OPEN_BFD_NORMAL); open_input_bfds (statement_list.head, OPEN_BFD_NORMAL);
/* open_input_bfds also handles assignments, so we can give values
to symbolic origin/length now. */
lang_do_memory_regions ();
#ifdef ENABLE_PLUGINS #ifdef ENABLE_PLUGINS
if (link_info.lto_plugin_active) if (link_info.lto_plugin_active)
@ -7322,8 +7325,6 @@ lang_process (void)
/* PR 13683: We must rerun the assignments prior to running garbage /* PR 13683: We must rerun the assignments prior to running garbage
collection in order to make sure that all symbol aliases are resolved. */ collection in order to make sure that all symbol aliases are resolved. */
lang_do_assignments (lang_mark_phase_enum); lang_do_assignments (lang_mark_phase_enum);
lang_do_memory_regions();
expld.phase = lang_first_phase_enum; expld.phase = lang_first_phase_enum;
/* Size up the common data. */ /* Size up the common data. */
@ -7408,8 +7409,11 @@ lang_process (void)
/* Fix any __start, __stop, .startof. or .sizeof. symbols. */ /* Fix any __start, __stop, .startof. or .sizeof. symbols. */
lang_finalize_start_stop (); lang_finalize_start_stop ();
/* Do all the assignments, now that we know the final resting places /* Do all the assignments again, to report errors. Assignment
of all the symbols. */ statements are processed multiple times, updating symbols; In
open_input_bfds, lang_do_assignments, and lang_size_sections.
Since lang_relax_sections calls lang_do_assignments, symbols are
also updated in ldemul_after_allocation. */
lang_do_assignments (lang_final_phase_enum); lang_do_assignments (lang_final_phase_enum);
ldemul_finish (); ldemul_finish ();