Bug 15787 - Better choice for B(S) value in ARM relocations
Summary: Better choice for B(S) value in ARM relocations
Status: RESOLVED FIXED
Alias: None
Product: binutils
Classification: Unclassified
Component: ld (show other bugs)
Version: 2.24
: P2 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2013-07-26 00:28 UTC by John Tytgat
Modified: 2013-08-14 12:20 UTC (History)
1 user (show)

See Also:
Host:
Target: arm-unknown-eabi
Build:
Last reconfirmed:


Attachments
Proposed patch for a better B(S) choice for R_ARM_{ALU|LDR\LDC|LDRS}_SB_G{0|1|2} relocations (3.16 KB, patch)
2013-07-26 00:28 UTC, John Tytgat
Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description John Tytgat 2013-07-26 00:28:44 UTC
Created attachment 7122 [details]
Proposed patch for a better B(S) choice for R_ARM_{ALU|LDR\LDC|LDRS}_SB_G{0|1|2} relocations

ARM's IHI0044E document specifies the B(S) for the
R_ARM_{ALU|LDR|LDC|LDRS}_SB_G{0|1|2} relocations as:

B(S) is the addressing origin of the output segment defining the symbol S.
The origin is not required to be the base address of the segment. This
value must always be word-aligned.

However currently in bfd/elf32-arm.c the sb value gets calculated as:

	/* sb should be the origin of the *segment* containing the symbol.
	   It is not clear how to obtain this OS-dependent value, so we
	   make an arbitrary choice of zero.  */
	bfd_vma sb = 0;

IMHO this is wrong and this is not about the origin of the output segment
at run time but about the one which gets determined at linking time.  As
sb group relocations are static ones they are most probably the same so we
better use sym_sec->output_section->vma instead of a fixed value 0.

Please find patch attached.

Concerning tests : we originally had 4 linker groups tests : group-relocs-alu-bad, group-relocs-ldc-bad, group-relocs-ldr-bad and group-relocs-ldrs-bad.  The first two were pc-based, the last two were sb-based.  I've changed the last two in pc-based as well and added 4 new sb-based tests.

Tested binutils, ld and gas with target arm-unknown-eabi, no regressions.

I've a copyright assignment but no write acccess.

bfd

John Tytgat  <john@bass-software.com>

	* elf32-arm.c (elf32_arm_final_link_relocate): Use origin of output
	segment containing the relocating symbol instead of assuming 0 for
	sb group relocations.

ld/testsuite

John Tytgat  <john@bass-software.com>

	* ld-arm/group-relocs.s: Add comments.  Move symbols used for sb
	group relocations into .data section.  Drop section zero.  Use pc/r0
	as base register when pc/sb group relocations are used.
	* ld-arm/group-relocs.d: Adjust expected result.
	* ld-arm/group-relocs-ldr-bad.s: Use pc_g0/pc_g1 relocs instead of
	sb_g0/sb_g1.
	* ld-arm/group-relocs-ldrs-bad.s: Likewise.
	* ld-arm/group-relocs-ldr-bad.d: Adjust expected result.
	* ld-arm/group-relocs-ldrs-bad.d: Likewise.
	* ld-arm/group-relocs-alu-bad-2.d: New test for sb group relocation.
	* ld-arm/group-relocs-ldr-bad-2.d: Likewise.
	* ld-arm/group-relocs-ldrs-bad-2.d: Likewise.
	* ld-arm/group-relocs-ldc-bad-2.d: Likewise.
	* ld-arm/group-relocs-alu-bad-2.s: New test source.
	* ld-arm/group-relocs-ldr-bad-2.s: Likewise.
	* ld-arm/group-relocs-ldrs-bad-2.s: Likewise.
	* ld-arm/group-relocs-ldc-bad-2.s: Likewise.
	* ld-arm/arm-elf.exp: For group-relocs, drop section zero start
	definition.  Run the new tests.
Comment 1 Sourceware Commits 2013-07-31 16:26:04 UTC
CVSROOT:	/cvs/src
Module name:	src
Changes by:	nickc@sourceware.org	2013-07-31 16:26:02

Modified files:
	ld/testsuite   : ChangeLog 
	ld/testsuite/ld-arm: arm-elf.exp group-relocs-ldr-bad.d 
	                     group-relocs-ldr-bad.s 
	                     group-relocs-ldrs-bad.d 
	                     group-relocs-ldrs-bad.s group-relocs.d 
	                     group-relocs.s 
	bfd            : ChangeLog elf32-arm.c 
Added files:
	ld/testsuite/ld-arm: group-relocs-alu-bad-2.d 
	                     group-relocs-alu-bad-2.s 
	                     group-relocs-ldc-bad-2.d 
	                     group-relocs-ldc-bad-2.s 
	                     group-relocs-ldr-bad-2.d 
	                     group-relocs-ldr-bad-2.s 
	                     group-relocs-ldrs-bad-2.d 
	                     group-relocs-ldrs-bad-2.s 

Log message:
	PR ld/15787
	* elf32-arm.c (elf32_arm_final_link_relocate): Base SB on the
	output section VMA.
	
	* ld-arm/group-relocs-alu-bad-2.d; New.
	* ld-arm/group-relocs-alu-bad-2.s: New.
	* ld-arm/group-relocs-ldc-bad-2.d: New.
	* ld-arm/group-relocs-ldc-bad-2.s: New.
	* ld-arm/group-relocs-ldr-bad-2.d: New.
	* ld-arm/group-relocs-ldr-bad-2.s: New.
	* ld-arm/group-relocs-ldrs-bad-2.d: New.
	* ld-arm/group-relocs-ldrs-bad-2: New.
	* ld-arm/arm-elf.exp: Add the new tests.
	* ld-arm/group-relocs-ldr-bad.d: Update expected output.
	* ld-arm/group-relocs-ldr-bad.s: Likewise.
	* ld-arm/group-relocs-ldrs-bad.d: Likewise.
	* ld-arm/group-relocs-ldrs-bad.s: Likewise.
	* ld-arm/group-relocs.d: Likewise.
	* ld-arm/group-relocs.s: Likewise.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ChangeLog.diff?cvsroot=src&r1=1.1744&r2=1.1745
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-arm/group-relocs-alu-bad-2.d.diff?cvsroot=src&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-arm/group-relocs-alu-bad-2.s.diff?cvsroot=src&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-arm/group-relocs-ldc-bad-2.d.diff?cvsroot=src&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-arm/group-relocs-ldc-bad-2.s.diff?cvsroot=src&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-arm/group-relocs-ldr-bad-2.d.diff?cvsroot=src&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-arm/group-relocs-ldr-bad-2.s.diff?cvsroot=src&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-arm/group-relocs-ldrs-bad-2.d.diff?cvsroot=src&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-arm/group-relocs-ldrs-bad-2.s.diff?cvsroot=src&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-arm/arm-elf.exp.diff?cvsroot=src&r1=1.105&r2=1.106
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-arm/group-relocs-ldr-bad.d.diff?cvsroot=src&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-arm/group-relocs-ldr-bad.s.diff?cvsroot=src&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-arm/group-relocs-ldrs-bad.d.diff?cvsroot=src&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-arm/group-relocs-ldrs-bad.s.diff?cvsroot=src&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-arm/group-relocs.d.diff?cvsroot=src&r1=1.4&r2=1.5
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-arm/group-relocs.s.diff?cvsroot=src&r1=1.2&r2=1.3
http://sourceware.org/cgi-bin/cvsweb.cgi/src/bfd/ChangeLog.diff?cvsroot=src&r1=1.6125&r2=1.6126
http://sourceware.org/cgi-bin/cvsweb.cgi/src/bfd/elf32-arm.c.diff?cvsroot=src&r1=1.321&r2=1.322
Comment 2 Nick Clifton 2013-07-31 16:26:51 UTC
Patch applied.
Comment 3 Sourceware Commits 2013-08-14 12:20:43 UTC
CVSROOT:	/cvs/src
Module name:	src
Changes by:	nickc@sourceware.org	2013-08-14 12:20:41

Modified files:
	bfd            : ChangeLog elf32-arm.c 
	ld/testsuite   : ChangeLog 
	ld/testsuite/ld-arm: arm-elf.exp group-relocs-ldr-bad-2.d 
	                     group-relocs-ldr-bad-2.s 
	                     group-relocs-ldr-bad.d 
	                     group-relocs-ldr-bad.s 
	                     group-relocs-ldrs-bad-2.d 
	                     group-relocs-ldrs-bad-2.s 
	                     group-relocs-ldrs-bad.d 
	                     group-relocs-ldrs-bad.s 
Added files:
	ld/testsuite/ld-arm: unresolved-2.d unresolved-2.s 

Log message:
	PR ld/15787
	* elf32-arm.c (elf32_arm_final_link_relocate): Use origin of output
	segment containing the relocating symbol instead of assuming 0 for
	sb group relocations.
	
	* ld-arm/group-relocs-ldr-bad.s: Redefine bar into foo section
	beyond 16 bit offset width.
	* ld-arm/group-relocs-ldrs-bad.s: Likewise.
	* ld-arm/group-relocs-ldr-bad.d: Adjust expected result.
	* ld-arm/group-relocs-ldrs-bad.d: Likewise.
	* ld-arm/group-relocs.s: Add comments.  Move symbols used for sb
	group relocations into .data section.  Drop section zero.  Use pc/r0
	as base register when pc/sb group relocations are used.
	* ld-arm/group-relocs.d: Adjust expected result.
	* ld-arm/group-relocs-alu-bad-2.d: New test for sb group relocation.
	* ld-arm/group-relocs-ldc-bad-2.d: Likewise.
	* ld-arm/group-relocs-ldr-bad-2.d: New test for pc group relocation.
	* ld-arm/group-relocs-ldrs-bad-2.d: Likewise.
	* ld-arm/unresolved-2.d: Add sb relocation failure test.
	* ld-arm/group-relocs-alu-bad-2.s: New test source.
	* ld-arm/group-relocs-ldr-bad-2.s: Likewise.
	* ld-arm/group-relocs-ldrs-bad-2.s: Likewise.
	* ld-arm/group-relocs-ldc-bad-2.s: Likewise.
	* ld-arm/unresolved-2.s: Likewise.
	* ld-arm/arm-elf.exp: For group-relocs, drop section zero start
	definition.  Run the new tests.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/src/bfd/ChangeLog.diff?cvsroot=src&r1=1.6128&r2=1.6129
http://sourceware.org/cgi-bin/cvsweb.cgi/src/bfd/elf32-arm.c.diff?cvsroot=src&r1=1.322&r2=1.323
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ChangeLog.diff?cvsroot=src&r1=1.1746&r2=1.1747
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-arm/unresolved-2.d.diff?cvsroot=src&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-arm/unresolved-2.s.diff?cvsroot=src&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-arm/arm-elf.exp.diff?cvsroot=src&r1=1.106&r2=1.107
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-arm/group-relocs-ldr-bad-2.d.diff?cvsroot=src&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-arm/group-relocs-ldr-bad-2.s.diff?cvsroot=src&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-arm/group-relocs-ldr-bad.d.diff?cvsroot=src&r1=1.2&r2=1.3
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-arm/group-relocs-ldr-bad.s.diff?cvsroot=src&r1=1.2&r2=1.3
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-arm/group-relocs-ldrs-bad-2.d.diff?cvsroot=src&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-arm/group-relocs-ldrs-bad-2.s.diff?cvsroot=src&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-arm/group-relocs-ldrs-bad.d.diff?cvsroot=src&r1=1.2&r2=1.3
http://sourceware.org/cgi-bin/cvsweb.cgi/src/ld/testsuite/ld-arm/group-relocs-ldrs-bad.s.diff?cvsroot=src&r1=1.2&r2=1.3