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.
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
Patch applied.
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