PR 10474
* ldemul.c (after_allocation_default): Run lang_relax_sections. * ldlang.h (lang_relax_sections): Declare. * ldlang.c (relax_sections): Delete. (lang_relax_sections): New function. (lang_process): Don't relax directly from here. * emultempl/alphaelf.em (alpha_finish): Call finish_default. * emultempl/armelf.em (arm_elf_after_allocation): Delete. Move body.. (gld${EMULATION_NAME}_finish): ..to here. Move existing code.. (gld${EMULATION_NAME}_after_allocation): ..to here. New function. (LDEMUL_AFTER_ALLOCATION): Update. * emultempl/avrelf.em (avr_elf_finish, LDEMUL_FINISH): Delete. (avr_elf_after_allocation): New function. (LDEMUL_AFTER_ALLOCATION): Define. * emultempl/elf-generic.em (gld${EMULATION_NAME}_map_segments): Call lang_relax_sections. * emultempl/elf32.em (gld${EMULATION_NAME}_finish): Delete. Move.. (gld${EMULATION_NAME}_after_allocation): ..code to here. New function. (LDEMUL_AFTER_ALLOCATION, LDEMUL_FINISH): Update. * emultempl/genelf.em (gld${EMULATION_NAME}_finish): Delete. Move.. (gld${EMULATION_NAME}_after_allocation): ..code to here. New function. (LDEMUL_FINISH): Delete. (LDEMUL_AFTER_ALLOCATION): Define. * emultempl/hppaelf.em (gld${EMULATION_NAME}_finish): Delete. Move.. (gld${EMULATION_NAME}_after_allocation): ..to here. New function. (LDEMUL_FINISH): Delete. (LDEMUL_AFTER_ALLOCATION): Define. * emultempl/m68hc1xelf.em (m68hc11elf_finish): Delete. Move.. (m68hc11elf_after_allocation): ..to here. New function. (LDEMUL_FINISH): Delete. (LDEMUL_AFTER_ALLOCATION): Define. * emultempl/m68kelf.em (m68k_elf_after_allocation): Call gld${EMULATION_NAME}_after_allocation. * emultempl/mmix-elfnmmo.em (mmix_after_allocation): Call gld${EMULATION_NAME}_after_allocation. * emultempl/mmo.em (mmo_finish): Delete. Move body.. (gld${EMULATION_NAME}_after_allocation): ..to here. New function. (LDEMUL_FINISH): Define. * emultempl/ppc64elf.em (ppc_layout_sections_again): Set elf_gp. (gld${EMULATION_NAME}_finish): Move code sizing sections.. (gld${EMULATION_NAME}_after_allocation): ..to here. * emultempl/sh64elf.em (sh64_elf_${EMULATION_NAME}_after_allocation): Call gld${EMULATION_NAME}_after_allocation. * emultempl/spuelf.em (gld${EMULATION_NAME}_finish): Delete bfd_elf_discard_info and map_segments call.
This commit is contained in:
parent
a8ad78a74e
commit
eaeb0a9d5c
18 changed files with 197 additions and 174 deletions
90
ld/ldlang.c
90
ld/ldlang.c
|
@ -6159,35 +6159,58 @@ lang_find_relro_sections (void)
|
|||
|
||||
/* Relax all sections until bfd_relax_section gives up. */
|
||||
|
||||
static void
|
||||
relax_sections (void)
|
||||
void
|
||||
lang_relax_sections (bfd_boolean need_layout)
|
||||
{
|
||||
/* Keep relaxing until bfd_relax_section gives up. */
|
||||
bfd_boolean relax_again;
|
||||
|
||||
link_info.relax_trip = -1;
|
||||
do
|
||||
if (command_line.relax)
|
||||
{
|
||||
relax_again = FALSE;
|
||||
link_info.relax_trip++;
|
||||
/* We may need more than one relaxation pass. */
|
||||
int i = link_info.relax_pass;
|
||||
|
||||
/* Note: pe-dll.c does something like this also. If you find
|
||||
you need to change this code, you probably need to change
|
||||
pe-dll.c also. DJ */
|
||||
/* The backend can use it to determine the current pass. */
|
||||
link_info.relax_pass = 0;
|
||||
|
||||
/* Do all the assignments with our current guesses as to
|
||||
section sizes. */
|
||||
lang_do_assignments ();
|
||||
while (i--)
|
||||
{
|
||||
/* Keep relaxing until bfd_relax_section gives up. */
|
||||
bfd_boolean relax_again;
|
||||
|
||||
/* We must do this after lang_do_assignments, because it uses
|
||||
size. */
|
||||
lang_reset_memory_regions ();
|
||||
link_info.relax_trip = -1;
|
||||
do
|
||||
{
|
||||
link_info.relax_trip++;
|
||||
|
||||
/* Perform another relax pass - this time we know where the
|
||||
globals are, so can make a better guess. */
|
||||
lang_size_sections (&relax_again, FALSE);
|
||||
/* Note: pe-dll.c does something like this also. If you find
|
||||
you need to change this code, you probably need to change
|
||||
pe-dll.c also. DJ */
|
||||
|
||||
/* Do all the assignments with our current guesses as to
|
||||
section sizes. */
|
||||
lang_do_assignments ();
|
||||
|
||||
/* We must do this after lang_do_assignments, because it uses
|
||||
size. */
|
||||
lang_reset_memory_regions ();
|
||||
|
||||
/* Perform another relax pass - this time we know where the
|
||||
globals are, so can make a better guess. */
|
||||
relax_again = FALSE;
|
||||
lang_size_sections (&relax_again, FALSE);
|
||||
}
|
||||
while (relax_again);
|
||||
|
||||
link_info.relax_pass++;
|
||||
}
|
||||
need_layout = TRUE;
|
||||
}
|
||||
|
||||
if (need_layout)
|
||||
{
|
||||
/* Final extra sizing to report errors. */
|
||||
lang_do_assignments ();
|
||||
lang_reset_memory_regions ();
|
||||
lang_size_sections (NULL, TRUE);
|
||||
}
|
||||
while (relax_again);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -6293,29 +6316,8 @@ lang_process (void)
|
|||
/* Size up the sections. */
|
||||
lang_size_sections (NULL, !command_line.relax);
|
||||
|
||||
/* Now run around and relax if we can. */
|
||||
if (command_line.relax)
|
||||
{
|
||||
/* We may need more than one relaxation pass. */
|
||||
int i = link_info.relax_pass;
|
||||
|
||||
/* The backend can use it to determine the current pass. */
|
||||
link_info.relax_pass = 0;
|
||||
|
||||
while (i--)
|
||||
{
|
||||
relax_sections ();
|
||||
link_info.relax_pass++;
|
||||
}
|
||||
|
||||
/* Final extra sizing to report errors. */
|
||||
lang_do_assignments ();
|
||||
lang_reset_memory_regions ();
|
||||
lang_size_sections (NULL, TRUE);
|
||||
}
|
||||
|
||||
/* See if anything special should be done now we know how big
|
||||
everything is. */
|
||||
everything is. This is where relaxation is done. */
|
||||
ldemul_after_allocation ();
|
||||
|
||||
/* Fix any .startof. or .sizeof. symbols. */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue