* relaxing partial links
@ 2009-05-26 14:53 Nathan Sidwell
2009-05-27 1:58 ` Alan Modra
0 siblings, 1 reply; 6+ messages in thread
From: Nathan Sidwell @ 2009-05-26 14:53 UTC (permalink / raw)
To: binutils
[-- Attachment #1: Type: text/plain, Size: 437 bytes --]
This patch allows partial links to be relaxed on PPC. This is a useful feature
on vxworks, where kernel modules are partially linked object files, and may be
loaded at addresses far away from the targets of branches. Furthermore the
sections within such a kernel module can be arbitrarily placed at load time.
tested on powerpc-vxworks, ok?
nathan
--
Nathan Sidwell :: http://www.codesourcery.com :: CodeSourcery
[-- Attachment #2: all.diff --]
[-- Type: text/plain, Size: 8433 bytes --]
2009-05-26 Nathan Sidwell <nathan@codesourcery.com>
bfd/
* elf32-ppc.c (ppc_elf_relax_section): Work with a partial
link.
ld/
* ldmain.c (main): Don't reject --relax -r.
* ld.texinfo (PowerPC ELF32): Document behaviour of relaxing
partial links.
ld/testsuite/
* ld-powerpc/vxworks-relax-2.s: New.
* ld-powerpc/vxworks-relax-2.rd: New.
* ld-powerpc/powerpc.exp: Add it.
Index: bfd/elf32-ppc.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-ppc.c,v
retrieving revision 1.253
diff -c -3 -p -r1.253 elf32-ppc.c
*** bfd/elf32-ppc.c 21 Mar 2009 02:35:27 -0000 1.253
--- bfd/elf32-ppc.c 26 May 2009 14:49:40 -0000
*************** ppc_elf_relax_section (bfd *abfd,
*** 5661,5666 ****
--- 5661,5672 ----
|| isec->reloc_count == 0)
return TRUE;
+ /* We cannot represent the required PIC relocs in the output, so don't
+ do anything. The linker doesn't support mixing -shared and -r
+ anyway. */
+ if (link_info->relocatable && link_info->shared)
+ return TRUE;
+
trampoff = (isec->size + 3) & (bfd_vma) -4;
/* Space for a branch around any trampolines. */
trampoff += 4;
*************** ppc_elf_relax_section (bfd *abfd,
*** 5726,5732 ****
}
isym = isymbuf + ELF32_R_SYM (irel->r_info);
if (isym->st_shndx == SHN_UNDEF)
! continue; /* We can't do anything with undefined symbols. */
else if (isym->st_shndx == SHN_ABS)
tsec = bfd_abs_section_ptr;
else if (isym->st_shndx == SHN_COMMON)
--- 5732,5738 ----
}
isym = isymbuf + ELF32_R_SYM (irel->r_info);
if (isym->st_shndx == SHN_UNDEF)
! tsec = bfd_und_section_ptr;
else if (isym->st_shndx == SHN_ABS)
tsec = bfd_abs_section_ptr;
else if (isym->st_shndx == SHN_COMMON)
*************** ppc_elf_relax_section (bfd *abfd,
*** 5779,5784 ****
--- 5785,5796 ----
tsec = h->root.u.def.section;
toff = h->root.u.def.value;
}
+ else if (h->root.type == bfd_link_hash_undefined
+ || h->root.type == bfd_link_hash_undefweak)
+ {
+ tsec = bfd_und_section_ptr;
+ toff = 0;
+ }
else
continue;
*************** ppc_elf_relax_section (bfd *abfd,
*** 5838,5844 ****
reladdr = isec->output_section->vma + isec->output_offset + roff;
/* If the branch is in range, no need to do anything. */
! if (symaddr - reladdr + max_branch_offset < 2 * max_branch_offset)
continue;
/* Look for an existing fixup to this address. */
--- 5850,5861 ----
reladdr = isec->output_section->vma + isec->output_offset + roff;
/* If the branch is in range, no need to do anything. */
! if (tsec != bfd_und_section_ptr
! && (!link_info->relocatable
! /* A relocatable link may have sections moved during
! final link, so do not presume they remain in range. */
! || tsec->output_section == isec->output_section)
! && symaddr - reladdr + max_branch_offset < 2 * max_branch_offset)
continue;
/* Look for an existing fixup to this address. */
*************** ppc_elf_relax_section (bfd *abfd,
*** 6048,6053 ****
--- 6065,6091 ----
free (internal_relocs);
*again = changes != 0;
+ if (!*again && link_info->relocatable)
+ {
+ /* Convert the internal relax relocs to external form. */
+ for (irel = internal_relocs; irel < irelend; irel++)
+ if (ELF32_R_TYPE (irel->r_info) == R_PPC_RELAX32)
+ {
+ unsigned long r_symndx = ELF32_R_SYM (irel->r_info);
+
+ /* Rewrite the reloc and convert one of the trailing nop
+ relocs to describe this relocation. */
+ BFD_ASSERT (ELF32_R_TYPE (irelend[-1].r_info) == R_PPC_NONE);
+ /* The relocs are at the bottom 2 bytes */
+ irel[0].r_offset += 2;
+ memmove (irel + 1, irel, (irelend - irel - 1) * sizeof (*irel));
+ irel[0].r_info = ELF32_R_INFO (r_symndx, R_PPC_ADDR16_HA);
+ irel[1].r_offset += 4;
+ irel[1].r_info = ELF32_R_INFO (r_symndx, R_PPC_ADDR16_LO);
+ irel++;
+ }
+ }
+
return TRUE;
error_return:
Index: ld/ld.texinfo
===================================================================
RCS file: /cvs/src/src/ld/ld.texinfo,v
retrieving revision 1.245
diff -c -3 -p -r1.245 ld.texinfo
*** ld/ld.texinfo 22 May 2009 11:58:44 -0000 1.245
--- ld/ld.texinfo 26 May 2009 14:49:53 -0000
*************** displacement, which may result in @comma
*** 6284,6290 ****
@samp{--relax} enables the generation of trampolines that can access
the entire 32-bit address space. These trampolines are inserted at
section boundaries, so may not themselves be reachable if an input
! section exceeds 33M in size.
@cindex PowerPC ELF32 options
@table @option
--- 6284,6293 ----
@samp{--relax} enables the generation of trampolines that can access
the entire 32-bit address space. These trampolines are inserted at
section boundaries, so may not themselves be reachable if an input
! section exceeds 33M in size. You may combine @samp{-r} and
! @samp{--relax} to add trampolines in a partial link. In that case
! both branches to undefined symbols and inter-section branches are also
! considered potentially out of range, and trampolines inserted.
@cindex PowerPC ELF32 options
@table @option
Index: ld/ldmain.c
===================================================================
RCS file: /cvs/src/src/ld/ldmain.c,v
retrieving revision 1.135
diff -c -3 -p -r1.135 ldmain.c
*** ld/ldmain.c 6 Apr 2009 00:47:09 -0000 1.135
--- ld/ldmain.c 26 May 2009 14:49:54 -0000
*************** main (int argc, char **argv)
*** 294,301 ****
{
if (command_line.check_section_addresses < 0)
command_line.check_section_addresses = 0;
- if (command_line.relax)
- einfo (_("%P%F: --relax and -r may not be used together\n"));
if (link_info.shared)
einfo (_("%P%F: -r and -shared may not be used together\n"));
}
--- 294,299 ----
Index: ld/testsuite/ld-powerpc/powerpc.exp
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-powerpc/powerpc.exp,v
retrieving revision 1.25
diff -c -3 -p -r1.25 powerpc.exp
*** ld/testsuite/ld-powerpc/powerpc.exp 4 Mar 2009 05:50:50 -0000 1.25
--- ld/testsuite/ld-powerpc/powerpc.exp 26 May 2009 14:49:57 -0000
*************** if {[istarget "*-*-vxworks"]} {
*** 54,59 ****
--- 54,64 ----
"-mregnames" {vxworks-relax.s}
{{readelf --relocs vxworks-relax.rd}}
"vxworks-relax"}
+ {"VxWorks relocatable relax test"
+ "-Tvxworks1.ld -r --relax -q"
+ "-mregnames" {vxworks-relax-2.s}
+ {{readelf --relocs vxworks-relax-2.rd}}
+ "vxworks-relax-2"}
}
run_ld_link_tests $ppcvxtests
run_dump_test "vxworks1-static"
Index: ld/testsuite/ld-powerpc/vxworks-relax-2.rd
===================================================================
RCS file: ld/testsuite/ld-powerpc/vxworks-relax-2.rd
diff -N ld/testsuite/ld-powerpc/vxworks-relax-2.rd
*** /dev/null 1 Jan 1970 00:00:00 -0000
--- ld/testsuite/ld-powerpc/vxworks-relax-2.rd 26 May 2009 14:49:58 -0000
***************
*** 0 ****
--- 1,11 ----
+
+ Relocation section '.rela.text' at offset 0x[0-9a-f]+ contains 8 entries:
+ Offset Info Type Sym.Value Sym. Name \+ Addend
+ 00000016 00000106 R_PPC_ADDR16_HA 00000000 .text \+ 4000034
+ 0000001a 00000104 R_PPC_ADDR16_LO 00000000 .text \+ 4000034
+ 00000006 00000106 R_PPC_ADDR16_HA 00000000 .text \+ 4000034
+ 0000000a 00000104 R_PPC_ADDR16_LO 00000000 .text \+ 4000034
+ 00000026 00000506 R_PPC_ADDR16_HA 00000000 undefined \+ 0
+ 0000002a 00000504 R_PPC_ADDR16_LO 00000000 undefined \+ 0
+ 0400003e 00000606 R_PPC_ADDR16_HA 00000000 _start \+ 0
+ 04000042 00000604 R_PPC_ADDR16_LO 00000000 _start \+ 0
Index: ld/testsuite/ld-powerpc/vxworks-relax-2.s
===================================================================
RCS file: ld/testsuite/ld-powerpc/vxworks-relax-2.s
diff -N ld/testsuite/ld-powerpc/vxworks-relax-2.s
*** /dev/null 1 Jan 1970 00:00:00 -0000
--- ld/testsuite/ld-powerpc/vxworks-relax-2.s 26 May 2009 14:49:58 -0000
***************
*** 0 ****
--- 1,14 ----
+ .globl _start
+ _start:
+ bl elsewhere
+ lis 9,elsewhere@ha
+ la 0,elsewhere@l(9)
+ bl undefined
+
+
+ .section .far,"ax",@progbits
+ elsewhere:
+ bl _start
+
+ .section .pad
+ .space 0x4000000
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: relaxing partial links
2009-05-26 14:53 relaxing partial links Nathan Sidwell
@ 2009-05-27 1:58 ` Alan Modra
2009-05-27 7:47 ` Nathan Sidwell
0 siblings, 1 reply; 6+ messages in thread
From: Alan Modra @ 2009-05-27 1:58 UTC (permalink / raw)
To: Nathan Sidwell; +Cc: binutils
On Tue, May 26, 2009 at 03:53:40PM +0100, Nathan Sidwell wrote:
> * ldmain.c (main): Don't reject --relax -r.
What sort of a bomb does this drop on other target relax_section
functions?
--
Alan Modra
Australia Development Lab, IBM
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: relaxing partial links
2009-05-27 1:58 ` Alan Modra
@ 2009-05-27 7:47 ` Nathan Sidwell
2009-05-27 12:17 ` Alan Modra
0 siblings, 1 reply; 6+ messages in thread
From: Nathan Sidwell @ 2009-05-27 7:47 UTC (permalink / raw)
To: Nathan Sidwell, binutils
Alan Modra wrote:
> On Tue, May 26, 2009 at 03:53:40PM +0100, Nathan Sidwell wrote:
>> * ldmain.c (main): Don't reject --relax -r.
>
> What sort of a bomb does this drop on other target relax_section
> functions?
I don't know. sorry, I forgot to mention that I'm unsure of a target-specific
way of doing that check. suggestions?
nathan
--
Nathan Sidwell :: http://www.codesourcery.com :: CodeSourcery
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: relaxing partial links
2009-05-27 7:47 ` Nathan Sidwell
@ 2009-05-27 12:17 ` Alan Modra
2009-05-27 13:27 ` Nathan Sidwell
2009-09-09 1:42 ` Alan Modra
0 siblings, 2 replies; 6+ messages in thread
From: Alan Modra @ 2009-05-27 12:17 UTC (permalink / raw)
To: Nathan Sidwell; +Cc: binutils
On Wed, May 27, 2009 at 08:47:36AM +0100, Nathan Sidwell wrote:
> Alan Modra wrote:
>> On Tue, May 26, 2009 at 03:53:40PM +0100, Nathan Sidwell wrote:
>>> * ldmain.c (main): Don't reject --relax -r.
>>
>> What sort of a bomb does this drop on other target relax_section
>> functions?
>
> I don't know. sorry, I forgot to mention that I'm unsure of a
> target-specific way of doing that check. suggestions?
I think you're overlooking the obvious. :-) In each target
relax_section, add
if (link_info->relocatable)
(*link_info->callbacks->einfo) (_("%P%F: --relax and -r may not be used together\n"));
Adjust as necessary for name of struct bfd_link_info * param.
OK with those additions.
--
Alan Modra
Australia Development Lab, IBM
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: relaxing partial links
2009-05-27 12:17 ` Alan Modra
@ 2009-05-27 13:27 ` Nathan Sidwell
2009-09-09 1:42 ` Alan Modra
1 sibling, 0 replies; 6+ messages in thread
From: Nathan Sidwell @ 2009-05-27 13:27 UTC (permalink / raw)
To: Nathan Sidwell, binutils
[-- Attachment #1: Type: text/plain, Size: 511 bytes --]
Alan Modra wrote:
> Adjust as necessary for name of struct bfd_link_info * param.
>
> OK with those additions.
Ok, this is what I've committed after checking an --enable-targets=all build.
Many of the relax hooks were already protected against relocatable links, I did
not insert the error message for those -- they now silently accept and ignore
--relax for relocatable links. The remainder have the error added.
nathan
--
Nathan Sidwell :: http://www.codesourcery.com :: CodeSourcery
[-- Attachment #2: all.diff --]
[-- Type: text/plain, Size: 16605 bytes --]
2009-05-26 Nathan Sidwell <nathan@codesourcery.com>
bfd/
* elf32-ppc.c (ppc_elf_relax_section): Work with a partial
link.
* bout.c (b_out_bfd_relax_section): Reject relocatable links.
* elf32-m10300.c (mn10300_elf_relax_section): Likewise.
* elf32-avr.c (elf32_avr_relax_section): Likewise.
* elf32-frv.c (elf32_avr_relax_section): Likewise.
* elf32-xtensa.c (elf_xtensa_relax_section): Likewise.
* elf64-mmix.c (mmix_elf_relax_section): Likewise.
* elfxx-ia64.c (elfNN_ia64_relax_section): Likewise.
* elfxx-sparc.c (_bfd_sparc_elf_relax_section): Likewise.
* reloc.c (bfd_generic_relax_section): Likewise.
* reloc16.c (bfd_coff_reloc16_relax_section): Likewise.
* vms.c (vms_bfd_relax_section): Likewise.
ld/
* ldmain.c (main): Don't reject --relax -r.
* ld.texinfo (PowerPC ELF32): Document behaviour of relaxing
partial links.
ld/testsuite/
* ld-powerpc/vxworks-relax-2.s: New.
* ld-powerpc/vxworks-relax-2.rd: New.
* ld-powerpc/powerpc.exp: Add it.
Index: bfd/bout.c
===================================================================
RCS file: /cvs/src/src/bfd/bout.c,v
retrieving revision 1.32
diff -c -3 -p -r1.32 bout.c
*** bfd/bout.c 16 Apr 2009 23:06:58 -0000 1.32
--- bfd/bout.c 27 May 2009 13:17:30 -0000
*************** b_out_bfd_relax_section (bfd *abfd,
*** 1145,1150 ****
--- 1145,1154 ----
arelent **reloc_vector = NULL;
long reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section);
+ if (link_info->relocatable)
+ (*link_info->callbacks->einfo)
+ (_("%P%F: --relax and -r may not be used together\n"));
+
if (reloc_size < 0)
return FALSE;
Index: bfd/elf-m10300.c
===================================================================
RCS file: /cvs/src/src/bfd/elf-m10300.c,v
retrieving revision 1.96
diff -c -3 -p -r1.96 elf-m10300.c
*** bfd/elf-m10300.c 25 Nov 2008 13:03:54 -0000 1.96
--- bfd/elf-m10300.c 27 May 2009 13:17:34 -0000
*************** mn10300_elf_relax_section (bfd *abfd,
*** 2073,2078 ****
--- 2073,2082 ----
asection *section = sec;
bfd_vma align_gap_adjustment;
+ if (link_info->relocatable)
+ (*link_info->callbacks->einfo)
+ (_("%P%F: --relax and -r may not be used together\n"));
+
/* Assume nothing changes. */
*again = FALSE;
Index: bfd/elf32-avr.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-avr.c,v
retrieving revision 1.40
diff -c -3 -p -r1.40 elf32-avr.c
*** bfd/elf32-avr.c 18 Feb 2009 15:28:56 -0000 1.40
--- bfd/elf32-avr.c 27 May 2009 13:17:35 -0000
*************** elf32_avr_relax_section (bfd *abfd,
*** 1634,1639 ****
--- 1634,1643 ----
static Elf_Internal_Rela *last_reloc = NULL;
struct elf32_avr_link_hash_table *htab;
+ if (link_info->relocatable)
+ (*link_info->callbacks->einfo)
+ (_("%P%F: --relax and -r may not be used together\n"));
+
htab = avr_link_hash_table (link_info);
if (htab == NULL)
return FALSE;
Index: bfd/elf32-frv.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-frv.c,v
retrieving revision 1.63
diff -c -3 -p -r1.63 elf32-frv.c
*** bfd/elf32-frv.c 30 Jul 2008 04:34:56 -0000 1.63
--- bfd/elf32-frv.c 27 May 2009 13:17:41 -0000
*************** elf32_frvfdpic_relax_section (bfd *abfd
*** 5738,5743 ****
--- 5738,5747 ----
{
struct _frvfdpic_dynamic_got_plt_info gpinfo;
+ if (info->relocatable)
+ (*info->callbacks->einfo)
+ (_("%P%F: --relax and -r may not be used together\n"));
+
/* If we return early, we didn't change anything. */
*again = FALSE;
Index: bfd/elf32-ppc.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-ppc.c,v
retrieving revision 1.253
diff -c -3 -p -r1.253 elf32-ppc.c
*** bfd/elf32-ppc.c 21 Mar 2009 02:35:27 -0000 1.253
--- bfd/elf32-ppc.c 27 May 2009 13:17:46 -0000
*************** ppc_elf_relax_section (bfd *abfd,
*** 5661,5666 ****
--- 5661,5672 ----
|| isec->reloc_count == 0)
return TRUE;
+ /* We cannot represent the required PIC relocs in the output, so don't
+ do anything. The linker doesn't support mixing -shared and -r
+ anyway. */
+ if (link_info->relocatable && link_info->shared)
+ return TRUE;
+
trampoff = (isec->size + 3) & (bfd_vma) -4;
/* Space for a branch around any trampolines. */
trampoff += 4;
*************** ppc_elf_relax_section (bfd *abfd,
*** 5726,5732 ****
}
isym = isymbuf + ELF32_R_SYM (irel->r_info);
if (isym->st_shndx == SHN_UNDEF)
! continue; /* We can't do anything with undefined symbols. */
else if (isym->st_shndx == SHN_ABS)
tsec = bfd_abs_section_ptr;
else if (isym->st_shndx == SHN_COMMON)
--- 5732,5738 ----
}
isym = isymbuf + ELF32_R_SYM (irel->r_info);
if (isym->st_shndx == SHN_UNDEF)
! tsec = bfd_und_section_ptr;
else if (isym->st_shndx == SHN_ABS)
tsec = bfd_abs_section_ptr;
else if (isym->st_shndx == SHN_COMMON)
*************** ppc_elf_relax_section (bfd *abfd,
*** 5779,5784 ****
--- 5785,5796 ----
tsec = h->root.u.def.section;
toff = h->root.u.def.value;
}
+ else if (h->root.type == bfd_link_hash_undefined
+ || h->root.type == bfd_link_hash_undefweak)
+ {
+ tsec = bfd_und_section_ptr;
+ toff = 0;
+ }
else
continue;
*************** ppc_elf_relax_section (bfd *abfd,
*** 5838,5844 ****
reladdr = isec->output_section->vma + isec->output_offset + roff;
/* If the branch is in range, no need to do anything. */
! if (symaddr - reladdr + max_branch_offset < 2 * max_branch_offset)
continue;
/* Look for an existing fixup to this address. */
--- 5850,5861 ----
reladdr = isec->output_section->vma + isec->output_offset + roff;
/* If the branch is in range, no need to do anything. */
! if (tsec != bfd_und_section_ptr
! && (!link_info->relocatable
! /* A relocatable link may have sections moved during
! final link, so do not presume they remain in range. */
! || tsec->output_section == isec->output_section)
! && symaddr - reladdr + max_branch_offset < 2 * max_branch_offset)
continue;
/* Look for an existing fixup to this address. */
*************** ppc_elf_relax_section (bfd *abfd,
*** 6048,6053 ****
--- 6065,6091 ----
free (internal_relocs);
*again = changes != 0;
+ if (!*again && link_info->relocatable)
+ {
+ /* Convert the internal relax relocs to external form. */
+ for (irel = internal_relocs; irel < irelend; irel++)
+ if (ELF32_R_TYPE (irel->r_info) == R_PPC_RELAX32)
+ {
+ unsigned long r_symndx = ELF32_R_SYM (irel->r_info);
+
+ /* Rewrite the reloc and convert one of the trailing nop
+ relocs to describe this relocation. */
+ BFD_ASSERT (ELF32_R_TYPE (irelend[-1].r_info) == R_PPC_NONE);
+ /* The relocs are at the bottom 2 bytes */
+ irel[0].r_offset += 2;
+ memmove (irel + 1, irel, (irelend - irel - 1) * sizeof (*irel));
+ irel[0].r_info = ELF32_R_INFO (r_symndx, R_PPC_ADDR16_HA);
+ irel[1].r_offset += 4;
+ irel[1].r_info = ELF32_R_INFO (r_symndx, R_PPC_ADDR16_LO);
+ irel++;
+ }
+ }
+
return TRUE;
error_return:
Index: bfd/elf32-xtensa.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-xtensa.c,v
retrieving revision 1.114
diff -c -3 -p -r1.114 elf32-xtensa.c
*** bfd/elf32-xtensa.c 3 Apr 2009 16:06:40 -0000 1.114
--- bfd/elf32-xtensa.c 27 May 2009 13:17:54 -0000
*************** elf_xtensa_relax_section (bfd *abfd,
*** 6638,6643 ****
--- 6638,6647 ----
static bfd_boolean relocations_analyzed = FALSE;
xtensa_relax_info *relax_info;
+ if (link_info->relocatable)
+ (*link_info->callbacks->einfo)
+ (_("%P%F: --relax and -r may not be used together\n"));
+
if (!relocations_analyzed)
{
/* Do some overall initialization for relaxation. */
Index: bfd/elf64-mmix.c
===================================================================
RCS file: /cvs/src/src/bfd/elf64-mmix.c,v
retrieving revision 1.58
diff -c -3 -p -r1.58 elf64-mmix.c
*** bfd/elf64-mmix.c 21 May 2009 14:15:49 -0000 1.58
--- bfd/elf64-mmix.c 27 May 2009 13:17:56 -0000
*************** mmix_elf_relax_section (abfd, sec, link_
*** 2590,2595 ****
--- 2590,2599 ----
/* Assume nothing changes. */
*again = FALSE;
+ if (link_info->relocatable)
+ (*link_info->callbacks->einfo)
+ (_("%P%F: --relax and -r may not be used together\n"));
+
/* We don't have to do anything if this section does not have relocs, or
if this is not a code section. */
if ((sec->flags & SEC_RELOC) == 0
Index: bfd/elfxx-ia64.c
===================================================================
RCS file: /cvs/src/src/bfd/elfxx-ia64.c,v
retrieving revision 1.209
diff -c -3 -p -r1.209 elfxx-ia64.c
*** bfd/elfxx-ia64.c 15 Jan 2009 12:42:52 -0000 1.209
--- bfd/elfxx-ia64.c 27 May 2009 13:18:00 -0000
*************** elfNN_ia64_relax_section (bfd *abfd, ase
*** 786,791 ****
--- 786,795 ----
one pass. */
*again = FALSE;
+ if (link_info->relocatable)
+ (*link_info->callbacks->einfo)
+ (_("%P%F: --relax and -r may not be used together\n"));
+
/* Don't even try to relax for non-ELF outputs. */
if (!is_elf_hash_table (link_info->hash))
return FALSE;
Index: bfd/elfxx-sparc.c
===================================================================
RCS file: /cvs/src/src/bfd/elfxx-sparc.c,v
retrieving revision 1.42
diff -c -3 -p -r1.42 elfxx-sparc.c
*** bfd/elfxx-sparc.c 25 Nov 2008 13:03:56 -0000 1.42
--- bfd/elfxx-sparc.c 27 May 2009 13:18:02 -0000
*************** _bfd_sparc_elf_relax_section (bfd *abfd
*** 2453,2458 ****
--- 2453,2462 ----
struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
bfd_boolean *again)
{
+ if (link_info->relocatable)
+ (*link_info->callbacks->einfo)
+ (_("%P%F: --relax and -r may not be used together\n"));
+
*again = FALSE;
sec_do_relax (section) = 1;
return TRUE;
Index: bfd/reloc.c
===================================================================
RCS file: /cvs/src/src/bfd/reloc.c,v
retrieving revision 1.185
diff -c -3 -p -r1.185 reloc.c
*** bfd/reloc.c 4 Mar 2009 05:50:49 -0000 1.185
--- bfd/reloc.c 27 May 2009 13:18:06 -0000
*************** bfd_generic_relax_section (bfd *abfd ATT
*** 5291,5296 ****
--- 5291,5300 ----
struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
bfd_boolean *again)
{
+ if (link_info->relocatable)
+ (*link_info->callbacks->einfo)
+ (_("%P%F: --relax and -r may not be used together\n"));
+
*again = FALSE;
return TRUE;
}
Index: bfd/reloc16.c
===================================================================
RCS file: /cvs/src/src/bfd/reloc16.c,v
retrieving revision 1.18
diff -c -3 -p -r1.18 reloc16.c
*** bfd/reloc16.c 25 Apr 2008 16:02:43 -0000 1.18
--- bfd/reloc16.c 27 May 2009 13:18:06 -0000
*************** bfd_coff_reloc16_relax_section (abfd, in
*** 157,162 ****
--- 157,166 ----
arelent **reloc_vector = NULL;
long reloc_count;
+ if (link_info->relocatable)
+ (*link_info->callbacks->einfo)
+ (_("%P%F: --relax and -r may not be used together\n"));
+
/* We only do global relaxation once. It is not safe to do it multiple
times (see discussion of the "shrinks" array below). */
*again = FALSE;
Index: bfd/vms.c
===================================================================
RCS file: /cvs/src/src/bfd/vms.c,v
retrieving revision 1.47
diff -c -3 -p -r1.47 vms.c
*** bfd/vms.c 16 Apr 2009 23:06:59 -0000 1.47
--- bfd/vms.c 27 May 2009 13:18:07 -0000
*************** vms_bfd_relax_section (bfd * abfd ATTRIB
*** 1914,1919 ****
--- 1914,1923 ----
struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
bfd_boolean *again ATTRIBUTE_UNUSED)
{
+ if (link_info->relocatable)
+ (*link_info->callbacks->einfo)
+ (_("%P%F: --relax and -r may not be used together\n"));
+
#if VMS_DEBUG
vms_debug (1, "vms_bfd_relax_section (%p, %s, %p, <ret>)\n",
abfd, section->name, link_info);
Index: ld/ld.texinfo
===================================================================
RCS file: /cvs/src/src/ld/ld.texinfo,v
retrieving revision 1.245
diff -c -3 -p -r1.245 ld.texinfo
*** ld/ld.texinfo 22 May 2009 11:58:44 -0000 1.245
--- ld/ld.texinfo 27 May 2009 13:18:21 -0000
*************** displacement, which may result in @comma
*** 6284,6290 ****
@samp{--relax} enables the generation of trampolines that can access
the entire 32-bit address space. These trampolines are inserted at
section boundaries, so may not themselves be reachable if an input
! section exceeds 33M in size.
@cindex PowerPC ELF32 options
@table @option
--- 6284,6293 ----
@samp{--relax} enables the generation of trampolines that can access
the entire 32-bit address space. These trampolines are inserted at
section boundaries, so may not themselves be reachable if an input
! section exceeds 33M in size. You may combine @samp{-r} and
! @samp{--relax} to add trampolines in a partial link. In that case
! both branches to undefined symbols and inter-section branches are also
! considered potentially out of range, and trampolines inserted.
@cindex PowerPC ELF32 options
@table @option
Index: ld/ldmain.c
===================================================================
RCS file: /cvs/src/src/ld/ldmain.c,v
retrieving revision 1.135
diff -c -3 -p -r1.135 ldmain.c
*** ld/ldmain.c 6 Apr 2009 00:47:09 -0000 1.135
--- ld/ldmain.c 27 May 2009 13:18:21 -0000
*************** main (int argc, char **argv)
*** 294,301 ****
{
if (command_line.check_section_addresses < 0)
command_line.check_section_addresses = 0;
- if (command_line.relax)
- einfo (_("%P%F: --relax and -r may not be used together\n"));
if (link_info.shared)
einfo (_("%P%F: -r and -shared may not be used together\n"));
}
--- 294,299 ----
Index: ld/testsuite/ld-powerpc/powerpc.exp
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-powerpc/powerpc.exp,v
retrieving revision 1.25
diff -c -3 -p -r1.25 powerpc.exp
*** ld/testsuite/ld-powerpc/powerpc.exp 4 Mar 2009 05:50:50 -0000 1.25
--- ld/testsuite/ld-powerpc/powerpc.exp 27 May 2009 13:18:26 -0000
*************** if {[istarget "*-*-vxworks"]} {
*** 54,59 ****
--- 54,64 ----
"-mregnames" {vxworks-relax.s}
{{readelf --relocs vxworks-relax.rd}}
"vxworks-relax"}
+ {"VxWorks relocatable relax test"
+ "-Tvxworks1.ld -r --relax -q"
+ "-mregnames" {vxworks-relax-2.s}
+ {{readelf --relocs vxworks-relax-2.rd}}
+ "vxworks-relax-2"}
}
run_ld_link_tests $ppcvxtests
run_dump_test "vxworks1-static"
Index: ld/testsuite/ld-powerpc/vxworks-relax-2.rd
===================================================================
RCS file: ld/testsuite/ld-powerpc/vxworks-relax-2.rd
diff -N ld/testsuite/ld-powerpc/vxworks-relax-2.rd
*** /dev/null 1 Jan 1970 00:00:00 -0000
--- ld/testsuite/ld-powerpc/vxworks-relax-2.rd 27 May 2009 13:18:26 -0000
***************
*** 0 ****
--- 1,11 ----
+
+ Relocation section '.rela.text' at offset 0x[0-9a-f]+ contains 8 entries:
+ Offset Info Type Sym.Value Sym. Name \+ Addend
+ 00000016 00000106 R_PPC_ADDR16_HA 00000000 .text \+ 4000034
+ 0000001a 00000104 R_PPC_ADDR16_LO 00000000 .text \+ 4000034
+ 00000006 00000106 R_PPC_ADDR16_HA 00000000 .text \+ 4000034
+ 0000000a 00000104 R_PPC_ADDR16_LO 00000000 .text \+ 4000034
+ 00000026 00000506 R_PPC_ADDR16_HA 00000000 undefined \+ 0
+ 0000002a 00000504 R_PPC_ADDR16_LO 00000000 undefined \+ 0
+ 0400003e 00000606 R_PPC_ADDR16_HA 00000000 _start \+ 0
+ 04000042 00000604 R_PPC_ADDR16_LO 00000000 _start \+ 0
Index: ld/testsuite/ld-powerpc/vxworks-relax-2.s
===================================================================
RCS file: ld/testsuite/ld-powerpc/vxworks-relax-2.s
diff -N ld/testsuite/ld-powerpc/vxworks-relax-2.s
*** /dev/null 1 Jan 1970 00:00:00 -0000
--- ld/testsuite/ld-powerpc/vxworks-relax-2.s 27 May 2009 13:18:26 -0000
***************
*** 0 ****
--- 1,14 ----
+ .globl _start
+ _start:
+ bl elsewhere
+ lis 9,elsewhere@ha
+ la 0,elsewhere@l(9)
+ bl undefined
+
+
+ .section .far,"ax",@progbits
+ elsewhere:
+ bl _start
+
+ .section .pad
+ .space 0x4000000
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: relaxing partial links
2009-05-27 12:17 ` Alan Modra
2009-05-27 13:27 ` Nathan Sidwell
@ 2009-09-09 1:42 ` Alan Modra
1 sibling, 0 replies; 6+ messages in thread
From: Alan Modra @ 2009-09-09 1:42 UTC (permalink / raw)
To: Nathan Sidwell, binutils
On Wed, May 27, 2009 at 09:47:26PM +0930, Alan Modra wrote:
> In each target relax_section, add
>
> if (link_info->relocatable)
> (*link_info->callbacks->einfo) (_("%P%F: --relax and -r may not be used together\n"));
>
> Adjust as necessary for name of struct bfd_link_info * param.
>
> OK with those additions.
I gave bad/incomplete advice. xtensa can cope with ld -r --relax.
Applying mainline and branch.
* elf32-xtensa.c (elf_xtensa_relax_section): Delete -r check.
Index: bfd/elf32-xtensa.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-xtensa.c,v
retrieving revision 1.117
diff -u -p -r1.117 elf32-xtensa.c
--- bfd/elf32-xtensa.c 2 Sep 2009 07:18:36 -0000 1.117
+++ bfd/elf32-xtensa.c 9 Sep 2009 00:12:27 -0000
@@ -6634,10 +6634,6 @@ elf_xtensa_relax_section (bfd *abfd,
static bfd_boolean relocations_analyzed = FALSE;
xtensa_relax_info *relax_info;
- if (link_info->relocatable)
- (*link_info->callbacks->einfo)
- (_("%P%F: --relax and -r may not be used together\n"));
-
if (!relocations_analyzed)
{
/* Do some overall initialization for relaxation. */
--
Alan Modra
Australia Development Lab, IBM
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2009-09-09 1:42 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-05-26 14:53 relaxing partial links Nathan Sidwell
2009-05-27 1:58 ` Alan Modra
2009-05-27 7:47 ` Nathan Sidwell
2009-05-27 12:17 ` Alan Modra
2009-05-27 13:27 ` Nathan Sidwell
2009-09-09 1:42 ` Alan Modra
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).