PATCH: IA64: Don't relax branch in .init/.fini sections.
H. J. Lu
hjl@lucon.org
Wed Jun 30 01:16:00 GMT 2004
On Tue, Jun 29, 2004 at 04:49:05PM -0700, Jim Wilson wrote:
> On Sat, 2004-06-26 at 22:53, H. J. Lu wrote:
> > * elfxx-ia64.c (elfNN_ia64_relax_section): Don't relax branch
> > in .init/.fini sections.
>
> This looks OK to me.
>
> You suggest using brl. The gcc startup files deliberately use indirect
> branches to avoid this problem. We load the function address into a
> register, and then branch on the register. This also avoids use of brl
> which is a slow on an Itanium1. If we can ignore Itanium1, then we can
> simplify the gcc startup code a little bit.
>
> The error message doesn't give any hint about which instruction can't be
> relocated. Which means if you have lots of them you are screwed. This
> might be rare enough that we don't have to worry about it. You didn't
> give any info on how the problem was detected, so I can't tell if this
> matters.
I will check in this shortly.
H.J.
-------------- next part --------------
2004-06-29 H.J. Lu <hongjiu.lu@intel.com>
PR 240
* elfxx-ia64.c (elfNN_ia64_relax_section): Don't relax branch
in .init/.fini sections.
--- bfd/elfxx-ia64.c.brl 2004-06-29 14:41:42.833932627 -0700
+++ bfd/elfxx-ia64.c 2004-06-29 18:10:44.212915584 -0700
@@ -953,6 +953,19 @@ elfNN_ia64_relax_section (abfd, sec, lin
{
bfd_signed_vma offset;
+ /* We can't put a trampoline in a .init/.fini section. Issue
+ an error. */
+ if (strcmp (sec->output_section->name, ".init") == 0
+ || strcmp (sec->output_section->name, ".fini") == 0)
+ {
+ (*_bfd_error_handler)
+ (_("%s: Can't relax br at 0x%lx in section `%s'. Please use brl or indirect branch."),
+ bfd_archive_filename (sec->owner),
+ (unsigned long) roff, sec->name);
+ bfd_set_error (bfd_error_bad_value);
+ goto error_return;
+ }
+
reladdr = (sec->output_section->vma
+ sec->output_offset
+ roff) & (bfd_vma) -4;
More information about the Binutils
mailing list