> > case BFD_RELOC_32_PCREL: > > + /* Set the low bit of the value if the target is a thumb function. > > */ + if (fixP->fx_done && fixP->fx_addsy && > > THUMB_IS_FUNC(fixP->fx_addsy)) + value |= 1; > > AFAICT, this is close, but not quite what AAELF says. The relocation > expression is > > ((S + A) | T) - . > > That is, the T bit is orred in before the address of the place is > subtracted. > > Normally, this doesn't change anything since the relocation is used with > .word which has 4-byte alignment. However, if a .4byte directive is > used, then there are no alignment constraints and the order of > processing becomes significant. It turns out this code never triggers because we force an external relocation. However the bfd code to process R_ARM_REL32 has a similar bug. Updated patch attached. Tested with cross to arm-none-eabi. Ok? Paul 2006-04-28 Paul Brook bfd/ * elf32-arm.c (elf32_arm_final_link_relocate): Set Thumb function bit for R_ARM_REL32. gas/ * config/tc-arm.c (arm_optimize_expr): New function. * config/tc-arm.h (md_optimize_expr): Define (arm_optimize_expr): Add prototype. (TC_FORCE_RELOCATION_SUB_SAME): Define. ld/testsuite/ * ld-arm/arm-elf.exp: Add thumb-rel32. * ld-arm/thumb-rel32.d: New test. * ld-arm/thumb-rel32.s: New test.