From: Alan Modra <amodra@bigpond.net.au>
To: Ben Elliston <bje+dated+1111959143.7bcef5@air.net.au>,
Anton Blanchard <anton@samba.org>,
binutils@sources.redhat.com
Subject: Re: cvs binutils+gcc4.0 build fail
Date: Tue, 29 Mar 2005 15:43:00 -0000 [thread overview]
Message-ID: <20050329110741.GK14407@bubble.modra.org> (raw)
In-Reply-To: <20050329065139.GG14407@bubble.modra.org>
On Tue, Mar 29, 2005 at 04:21:39PM +0930, Alan Modra wrote:
> Something was indeed going wrong with eh_frame editing. It was being
> done twice due to my 2005-03-21 ppc64elf.em change. Oops.
Blah, it's worse than that. .eh_frame needs to be edited before stubs
and suchlike are built. If the section layout changes after we're done
adding stubs, then some of the stubs will have incorrect offsets.
* emultempl/elf32.em (gld${EMULATION_NAME}_layout_sections_again):
New function, extracted from static void gld${EMULATION_NAME}_finish.
(gld${EMULATION_NAME}_strip_empty_sections): Likewise.
(gld${EMULATION_NAME}_provide_init_fini_syms): Likewise.
* emultempl/ppc64elf.em: Revert last change.
(ppc_layout_sections_again): Use
gld${EMULATION_NAME}_layout_sections_again.
(ppc_finish): Don't call gld${EMULATION_NAME}_finish. Instead call
gld${EMULATION_NAME}_strip_empty_sections and
gld${EMULATION_NAME}_provide_init_fini_syms.
* emultempl/hppaelf.em: Similarly.
Index: ld/emultempl/elf32.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/elf32.em,v
retrieving revision 1.136
diff -c -p -r1.136 elf32.em
*** ld/emultempl/elf32.em 23 Mar 2005 15:35:50 -0000 1.136
--- ld/emultempl/elf32.em 29 Mar 2005 10:53:24 -0000
*************** static void gld${EMULATION_NAME}_after_o
*** 59,65 ****
static void gld${EMULATION_NAME}_before_allocation (void);
static bfd_boolean gld${EMULATION_NAME}_place_orphan
(lang_input_statement_type *file, asection *s);
! static void gld${EMULATION_NAME}_finish (void);
EOF
--- 59,68 ----
static void gld${EMULATION_NAME}_before_allocation (void);
static bfd_boolean gld${EMULATION_NAME}_place_orphan
(lang_input_statement_type *file, asection *s);
! static void gld${EMULATION_NAME}_layout_sections_again (void);
! static void gld${EMULATION_NAME}_strip_empty_sections (void);
! static void gld${EMULATION_NAME}_provide_init_fini_syms (void);
! static void gld${EMULATION_NAME}_finish (void) ATTRIBUTE_UNUSED;
EOF
*************** gld${EMULATION_NAME}_provide_bound_symbo
*** 1450,1474 ****
_bfd_elf_provide_symbol (&link_info, end, end_val);
}
static void
! gld${EMULATION_NAME}_finish (void)
{
! if (bfd_elf_discard_info (output_bfd, &link_info))
{
! lang_reset_memory_regions ();
!
! /* Resize the sections. */
! lang_size_sections (stat_ptr->head, abs_output_section,
! &stat_ptr->head, 0, (bfd_vma) 0, NULL, TRUE);
!
! /* Redo special stuff. */
! ldemul_after_allocation ();
!
! /* Do the assignments again. */
! lang_do_assignments (stat_ptr->head, abs_output_section,
! (fill_type *) 0, (bfd_vma) 0);
}
if (!link_info.relocatable)
{
lang_output_section_statement_type *os;
--- 1453,1510 ----
_bfd_elf_provide_symbol (&link_info, end, end_val);
}
+ /* If not building a shared library, provide
+
+ __preinit_array_start
+ __preinit_array_end
+ __init_array_start
+ __init_array_end
+ __fini_array_start
+ __fini_array_end
+
+ They are set here rather than via PROVIDE in the linker
+ script, because using PROVIDE inside an output section
+ statement results in unnecessary output sections. Using
+ PROVIDE outside an output section statement runs the risk of
+ section alignment affecting where the section starts. */
+
static void
! gld${EMULATION_NAME}_provide_init_fini_syms (void)
{
! if (!link_info.relocatable && !link_info.shared)
{
! gld${EMULATION_NAME}_provide_bound_symbols (".preinit_array",
! "__preinit_array_start",
! "__preinit_array_end");
! gld${EMULATION_NAME}_provide_bound_symbols (".init_array",
! "__init_array_start",
! "__init_array_end");
! gld${EMULATION_NAME}_provide_bound_symbols (".fini_array",
! "__fini_array_start",
! "__fini_array_end");
}
+ }
+ static void
+ gld${EMULATION_NAME}_layout_sections_again (void)
+ {
+ lang_reset_memory_regions ();
+
+ /* Resize the sections. */
+ lang_size_sections (stat_ptr->head, abs_output_section,
+ &stat_ptr->head, 0, (bfd_vma) 0, NULL, TRUE);
+
+ /* Redo special stuff. */
+ ldemul_after_allocation ();
+
+ /* Do the assignments again. */
+ lang_do_assignments (stat_ptr->head, abs_output_section,
+ (fill_type *) 0, (bfd_vma) 0);
+ }
+
+ static void
+ gld${EMULATION_NAME}_strip_empty_sections (void)
+ {
if (!link_info.relocatable)
{
lang_output_section_statement_type *os;
*************** gld${EMULATION_NAME}_finish (void)
*** 1495,1529 ****
}
}
}
! /* If not building shared library, provide
! __preinit_array_start
! __preinit_array_end
! __init_array_start
! __init_array_end
! __fini_array_start
! __fini_array_end
!
! They are set here rather than via PROVIDE in the linker
! script, because using PROVIDE inside an output section
! statement results in unnecessary output sections. Using
! PROVIDE outside an output section statement runs the risk of
! section alignment affecting where the section starts. */
!
! if (!link_info.shared)
! {
! gld${EMULATION_NAME}_provide_bound_symbols
! (".preinit_array", "__preinit_array_start",
! "__preinit_array_end");
! gld${EMULATION_NAME}_provide_bound_symbols
! (".init_array", "__init_array_start",
! "__init_array_end");
! gld${EMULATION_NAME}_provide_bound_symbols
! (".fini_array", "__fini_array_start",
! "__fini_array_end");
! }
! }
}
EOF
fi
--- 1531,1547 ----
}
}
}
+ }
+ }
! static void
! gld${EMULATION_NAME}_finish (void)
! {
! if (bfd_elf_discard_info (output_bfd, &link_info))
! gld${EMULATION_NAME}_layout_sections_again ();
! gld${EMULATION_NAME}_strip_empty_sections ();
! gld${EMULATION_NAME}_provide_init_fini_syms ();
}
EOF
fi
Index: ld/emultempl/ppc64elf.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/ppc64elf.em,v
retrieving revision 1.41
diff -u -p -r1.41 ppc64elf.em
--- ld/emultempl/ppc64elf.em 29 Mar 2005 06:52:22 -0000 1.41
+++ ld/emultempl/ppc64elf.em 29 Mar 2005 10:33:56 -0000
@@ -32,6 +32,9 @@ cat >>e${EMULATION_NAME}.c <<EOF
static lang_input_statement_type *stub_file;
static int stub_added = 0;
+/* Whether we need to call ppc_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. */
@@ -255,17 +258,9 @@ ppc_layout_sections_again (void)
/* 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. */
- lang_reset_memory_regions ();
-
- /* Resize the sections. */
- lang_size_sections (stat_ptr->head, abs_output_section,
- &stat_ptr->head, 0, 0, NULL, TRUE);
-
- /* Recalculate TOC base. */
- ldemul_after_allocation ();
+ need_laying_out = 0;
- /* Do the assignments again. */
- lang_do_assignments (stat_ptr->head, abs_output_section, NULL, 0);
+ gld${EMULATION_NAME}_layout_sections_again ();
}
@@ -316,6 +311,13 @@ ppc_finish (void)
descriptor in the .opd section. */
entry_section = ".opd";
+ /* bfd_elf_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_discard_info (output_bfd, &link_info))
+ need_laying_out = 1;
+
/* If generating a relocatable output file, then we don't have any
stubs. */
if (stub_file != NULL && !link_info.relocatable)
@@ -344,6 +346,9 @@ ppc_finish (void)
}
}
+ if (need_laying_out)
+ ppc_layout_sections_again ();
+
if (link_info.relocatable)
{
asection *toc = bfd_get_section_by_name (output_bfd, ".toc");
@@ -374,7 +379,8 @@ ppc_finish (void)
}
ppc64_elf_restore_symbols (&link_info);
- gld${EMULATION_NAME}_finish ();
+ gld${EMULATION_NAME}_strip_empty_sections ();
+ gld${EMULATION_NAME}_provide_init_fini_syms ();
}
Index: ld/emultempl/hppaelf.em
===================================================================
RCS file: /cvs/src/src/ld/emultempl/hppaelf.em,v
retrieving revision 1.39
diff -u -p -r1.39 hppaelf.em
--- ld/emultempl/hppaelf.em 29 Mar 2005 06:52:22 -0000 1.39
+++ ld/emultempl/hppaelf.em 29 Mar 2005 10:33:56 -0000
@@ -36,6 +35,9 @@ static lang_input_statement_type *stub_f
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. */
@@ -217,18 +219,9 @@ hppaelf_layout_sections_again (void)
/* 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. */
- lang_reset_memory_regions ();
+ need_laying_out = 0;
- /* Resize the sections. */
- lang_size_sections (stat_ptr->head, abs_output_section,
- &stat_ptr->head, 0, (bfd_vma) 0, NULL, TRUE);
-
- /* Redo special stuff. */
- ldemul_after_allocation ();
-
- /* Do the assignments again. */
- lang_do_assignments (stat_ptr->head, abs_output_section,
- (fill_type *) 0, (bfd_vma) 0);
+ gld${EMULATION_NAME}_layout_sections_again ();
}
@@ -253,6 +246,13 @@ build_section_lists (lang_statement_unio
static void
hppaelf_finish (void)
{
+ /* bfd_elf_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_discard_info (output_bfd, &link_info))
+ need_laying_out = 1;
+
/* If generating a relocatable output file, then we don't
have to examine the relocs. */
if (stub_file != NULL && !link_info.relocatable)
@@ -284,6 +284,9 @@ hppaelf_finish (void)
}
}
+ if (need_laying_out)
+ hppaelf_layout_sections_again ();
+
if (! link_info.relocatable)
{
/* Set the global data pointer. */
@@ -297,14 +300,12 @@ hppaelf_finish (void)
if (stub_file != NULL && stub_file->the_bfd->sections != NULL)
{
if (! elf32_hppa_build_stubs (&link_info))
- {
- einfo ("%X%P: can not build stubs: %E\n");
- return;
- }
+ einfo ("%X%P: can not build stubs: %E\n");
}
}
- gld${EMULATION_NAME}_finish ();
+ gld${EMULATION_NAME}_strip_empty_sections ();
+ gld${EMULATION_NAME}_provide_init_fini_syms ();
}
--
Alan Modra
IBM OzLabs - Linux Technology Centre
next prev parent reply other threads:[~2005-03-29 11:08 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20050322212341.GD4980@krispykreme>
[not found] ` <20050323083219.A21240@mailhub.air.net.au>
[not found] ` <20050322222308.GE30711@bubble.modra.org>
2005-03-29 13:54 ` Alan Modra
2005-03-29 15:43 ` Alan Modra [this message]
2005-03-29 23:33 ` Thorsten Glaser
2005-03-30 16:34 ` Alan Modra
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20050329110741.GK14407@bubble.modra.org \
--to=amodra@bigpond.net.au \
--cc=anton@samba.org \
--cc=binutils@sources.redhat.com \
--cc=bje+dated+1111959143.7bcef5@air.net.au \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).