aboutsummaryrefslogtreecommitdiff
path: root/ld/emultempl
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2001-11-15 12:44:03 +0000
committerAlan Modra <amodra@gmail.com>2001-11-15 12:44:03 +0000
commitc56feb2b8c5a2d4a3dc92317d7f547e2c89feb8a (patch)
tree8e431d3328f359303ec6a86c820b3f4274742e0a /ld/emultempl
parentc86380b5864fac8325a2b3abbc684df5d42696ca (diff)
downloadgdb-c56feb2b8c5a2d4a3dc92317d7f547e2c89feb8a.zip
gdb-c56feb2b8c5a2d4a3dc92317d7f547e2c89feb8a.tar.gz
gdb-c56feb2b8c5a2d4a3dc92317d7f547e2c89feb8a.tar.bz2
* 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.
Diffstat (limited to 'ld/emultempl')
-rw-r--r--ld/emultempl/armelf.em3
-rw-r--r--ld/emultempl/elf32.em9
-rw-r--r--ld/emultempl/hppaelf.em44
3 files changed, 38 insertions, 18 deletions
diff --git a/ld/emultempl/armelf.em b/ld/emultempl/armelf.em
index fd27bce..c570486 100644
--- a/ld/emultempl/armelf.em
+++ b/ld/emultempl/armelf.em
@@ -104,6 +104,9 @@ arm_elf_finish ()
{
struct bfd_link_hash_entry * h;
+ /* Call the elf32.em routine. */
+ gld${EMULATION_NAME}_finish ();
+
if (thumb_entry_symbol == NULL)
return;
diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em
index 27c2954..3acc8fa 100644
--- a/ld/emultempl/elf32.em
+++ b/ld/emultempl/elf32.em
@@ -1320,12 +1320,15 @@ gld${EMULATION_NAME}_place_orphan (file, s)
return true;
}
+EOF
+fi
+
+if test x"$LDEMUL_FINISH" != xgld"$EMULATION_NAME"_finish; then
+cat >>e${EMULATION_NAME}.c <<EOF
static void
gld${EMULATION_NAME}_finish ()
{
- ${LDEMUL_FINISH+${LDEMUL_FINISH} ();}
-
if (bfd_elf${ELFSIZE}_discard_info (&link_info))
{
/* Resize the sections. */
@@ -1639,7 +1642,7 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
"${EMULATION_NAME}",
"${OUTPUT_FORMAT}",
- gld${EMULATION_NAME}_finish,
+ ${LDEMUL_FINISH-gld${EMULATION_NAME}_finish},
${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
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