From c56feb2b8c5a2d4a3dc92317d7f547e2c89feb8a Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Thu, 15 Nov 2001 12:44:03 +0000 Subject: * emultempl/elf32.em (gld${EMULATION_NAME}_finish): Only emit this function when LDEMUL_FINISH isn't set to the same name. Don't call ${LDEMUL_FINISH}. (ld_${EMULATION_NAME}_emulation): Call $LDEMUL_FINISH if defined. * emultempl/armelf.em (arm_elf_finish): Call gld${EMULATION_NAME}_finish. * emultempl/hppaelf.em (hppaelf_finish): Rename to gld${EMULATION_NAME}_finish. Call bfd_elf32_discard_info and hppaelf_layout_sections_again if necessary. (need_laying_out): New var. (hppaelf_layaout_sections_again): Rename to hppaelf_layout_sections_again. Clear need_laying_out. (PARSE_AND_LIST_OPTIONS): Format text. --- ld/emultempl/hppaelf.em | 44 +++++++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 15 deletions(-) (limited to 'ld/emultempl/hppaelf.em') diff --git a/ld/emultempl/hppaelf.em b/ld/emultempl/hppaelf.em index 31ef43c..80965015 100644 --- a/ld/emultempl/hppaelf.em +++ b/ld/emultempl/hppaelf.em @@ -31,8 +31,8 @@ static void hppaelf_after_parse PARAMS((void)); static void hppaelf_create_output_section_statements PARAMS ((void)); static asection *hppaelf_add_stub_section PARAMS ((const char *, asection *)); -static void hppaelf_layaout_sections_again PARAMS ((void)); -static void hppaelf_finish PARAMS ((void)); +static void hppaelf_layout_sections_again PARAMS ((void)); +static void gld${EMULATION_NAME}_finish PARAMS ((void)); /* Fake input file for stubs. */ @@ -43,6 +43,9 @@ static lang_input_statement_type *stub_file; stubs. */ static int multi_subspace = 0; +/* Whether we need to call hppa_layout_sections_again. */ +static int need_laying_out = 0; + /* Maximum size of a group of input sections that can be handled by one stub section. A value of +/-1 indicates the bfd back-end should use a suitable default size. */ @@ -216,11 +219,12 @@ hppaelf_add_stub_section (stub_sec_name, input_section) /* Another call-back for elf32_hppa_size_stubs. */ static void -hppaelf_layaout_sections_again () +hppaelf_layout_sections_again () { /* If we have changed sizes of the stub sections, then we need to recalculate all the section offsets. This may mean we need to add even more stubs. */ + need_laying_out = 0; /* Resize the sections. */ lang_size_sections (stat_ptr->head, abs_output_section, @@ -239,13 +243,20 @@ hppaelf_layaout_sections_again () to build linker stubs. */ static void -hppaelf_finish () +gld${EMULATION_NAME}_finish () { /* If generating a relocatable output file, then we don't have to examine the relocs. */ if (link_info.relocateable) return; + /* bfd_elf32_discard_info just plays with debugging sections, + ie. doesn't affect any code, so we can delay resizing the + sections. It's likely we'll resize everything in the process of + adding stubs. */ + if (bfd_elf${ELFSIZE}_discard_info (&link_info)) + need_laying_out = 1; + /* Call into the BFD backend to do the real work. */ if (! elf32_hppa_size_stubs (output_bfd, stub_file->the_bfd, @@ -253,12 +264,15 @@ hppaelf_finish () multi_subspace, group_size, &hppaelf_add_stub_section, - &hppaelf_layaout_sections_again)) + &hppaelf_layout_sections_again)) { einfo ("%X%P: can not size stub section: %E\n"); return; } + if (need_laying_out) + hppaelf_layout_sections_again (); + /* Set the global data pointer. */ if (! elf32_hppa_set_gp (output_bfd, &link_info)) { @@ -323,17 +337,17 @@ PARSE_AND_LIST_LONGOPTS=' PARSE_AND_LIST_OPTIONS=' fprintf (file, _("\ - --multi-subspace Generate import and export stubs to support\n\ - multiple sub-space shared libraries\n" + --multi-subspace Generate import and export stubs to support\n\ + multiple sub-space shared libraries\n" )); fprintf (file, _("\ - --stub-group-size=N Maximum size of a group of input sections that can be\n\ - handled by one stub section. A negative value\n\ - locates all stubs before their branches (with a\n\ - group size of -N), while a positive value allows\n\ - two groups of input sections, one before, and one\n\ - after each stub section. Values of +/-1 indicate\n\ - the linker should choose suitable defaults." + --stub-group-size=N Maximum size of a group of input sections that can be\n\ + handled by one stub section. A negative value\n\ + locates all stubs before their branches (with a\n\ + group size of -N), while a positive value allows\n\ + two groups of input sections, one before, and one\n\ + after each stub section. Values of +/-1 indicate\n\ + the linker should choose suitable defaults.\n" )); ' @@ -355,5 +369,5 @@ PARSE_AND_LIST_ARGS_CASES=' # Put these extra hppaelf routines in ld_${EMULATION_NAME}_emulation # LDEMUL_AFTER_PARSE=hppaelf_after_parse -LDEMUL_FINISH=hppaelf_finish +LDEMUL_FINISH=gld${EMULATION_NAME}_finish LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=hppaelf_create_output_section_statements -- cgit v1.1