diff options
author | Alan Modra <amodra@gmail.com> | 2009-08-10 07:50:56 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2009-08-10 07:50:56 +0000 |
commit | eaeb0a9d5c65fd8dc19878b068e17f90a93a19c2 (patch) | |
tree | 2fd5546de6a8a46159d292b109e46dd1d525f53a /ld/ldlang.c | |
parent | a8ad78a74eb4e3bf77cf6174e5c10a3c30212b3a (diff) | |
download | gdb-eaeb0a9d5c65fd8dc19878b068e17f90a93a19c2.zip gdb-eaeb0a9d5c65fd8dc19878b068e17f90a93a19c2.tar.gz gdb-eaeb0a9d5c65fd8dc19878b068e17f90a93a19c2.tar.bz2 |
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.
Diffstat (limited to 'ld/ldlang.c')
-rw-r--r-- | ld/ldlang.c | 90 |
1 files changed, 46 insertions, 44 deletions
diff --git a/ld/ldlang.c b/ld/ldlang.c index bc03374..a1bd2e3 100644 --- a/ld/ldlang.c +++ b/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++; + + /* 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; + } - /* Perform another relax pass - this time we know where the - globals are, so can make a better guess. */ - lang_size_sections (&relax_again, FALSE); + 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. */ |