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:
parent
aa654ee8f8
commit
7f0cfc6eb8
@ -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
|
||||||
|
@ -819,7 +819,6 @@ origin_spec:
|
|||||||
ORIGIN '=' mustbe_exp
|
ORIGIN '=' mustbe_exp
|
||||||
{
|
{
|
||||||
region->origin_exp = $3;
|
region->origin_exp = $3;
|
||||||
region->current = region->origin;
|
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
12
ld/ldlang.c
12
ld/ldlang.c
@ -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 ();
|
||||||
|
Loading…
Reference in New Issue
Block a user