This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
| Other format: | [Raw text] | |
(I don't know much about this old ARM ABI, so I may have missed
something. As for GNU AS, the major differences between arm-oabi and
arm-nabi is that arm-oabi uses RELA while arm-nabi uses REL, and that
arm-nabi defines some additional relocation types, right?)
It seems to me that there is a major bug in the emission of the
pc-relative relocation for arm-oabi. Consider this C file:
--
void r () {
srrr ();
}
int srrr () {
printf ("A test\n");
}
--
Here is what GCC generates:
[...]
r:
mov ip, sp
stmfd sp!, {fp, ip, lr, pc}
sub fp, ip, #4
bl srrr
ldmea fp, {fp, sp, pc}
[...]
srrr:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 1, uses_anonymous_args = 0
mov ip, sp
stmfd sp!, {fp, ip, lr, pc}
sub fp, ip, #4
ldr r0, .L3
bl printf
mov r0, r3
ldmea fp, {fp, sp, pc}
[...]
If I run as on it, I get:
sok% arm-oabi-objdump -d -j .text ../../../binutils_fsf/tmp/r_oabi.o
../../../binutils_fsf/tmp/r_oabi.o: file format elf32-littlearm-oabi
Disassembly of section .text:
00000000 <r>:
0: e1a0c00d mov ip, sp
4: e92dd800 stmdb sp!, {fp, ip, lr, pc}
8: e24cb004 sub fp, ip, #4 ; 0x4
c: ebfffffb bl 0 <r>
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Here is the problem. Even though arm-oabi uses RELA, an implicit addend
has been generated (-0xc). The relocation entry is:
sok% arm-oabi-readelf -r r_oabi.o
[...]
0000000c 00000f01 R_ARM_PC24 00000014 srrr + 0
The computation of R_ARM_PC24, according to the ARM-ELF ABI, is S - P
+ A (S being the symbol, P the place of the relocation and A the sum
of the implicit addend and the explicit addend). In that case, the
target of bl is srrr - 0xc... It should have been srrr.
After investigation, it appears that in tc-arm.c (md_apply_fix3), it
appears that an implicit addend can be generated for
BFD_RELOC_ARM_PCREL_BLX and BFD_RELOC_ARM_PCREL_BRANCH. This patch
fixes the problem. Tested against the simulator, 0 failures.
Changelog entry:
2003-12-12 Jerome Guitton <guitton@act-europe.fr>
* tc-arm.c (md_apply_fix3): Make sure that no implicit addend
will be generated for BFD_RELOC_ARM_PCREL_BLX and
BFD_RELOC_ARM_PCREL_BRANCH.
--
Jerome
Attachment:
tc-arm.dif
Description: Text document
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |