https://sourceware.org/bugzilla/show_bug.cgi?id=16202
Bug ID: 16202 Summary: ABS8 and ABS16 get wrong addend on ARM-ELF (big endian) Product: binutils Version: unspecified Status: NEW Severity: normal Priority: P2 Component: gas Assignee: unassigned at sourceware dot org Reporter: ma.jiang at zte dot com.cn on ARM-ELF , in function elf32_arm_final_link_relocate, addend is get from : addend = bfd_get_32 (input_bfd, hit_data) & howto->src_mask; .There is a little problem, becasue howto->scr_mask is a constant that designed for little endian. for example , in the testcase in gas testsuit: .syntax unified .byte x -128 .byte x +255 .short y -32768 .short y +65535 the first ABS8 reloc for x should get a addend -128.But on big endian ARM, "bfd_get_32 (input_bfd, hit_data)" get a 0x80ff8000, and with a howto->src_mask=0xff, the final addend is 0. in the ABS8 branch, the addend is used directly. case R_ARM_ABS8: value += addend; /* There is no way to tell whether the user intended to use a signed or unsigned addend. When checking for overflow we accept either, as specified by the AAELF. */ if ((long) value > 0xff || (long) value < -0x80) return bfd_reloc_overflow; bfd_put_8 (input_bfd, value, hit_data); return bfd_reloc_ok; Finally, a 0 is put into the object file, which of course is totally wrong. ABS16 has the same problem. ============================================================================ Fix for this problem is quite strait-forward. IN ABS8/ABS16 branch, we can fetch addend once more using correct bfd_get_8/bfd_get_16, as following codes : case R_ARM_ABS8: addend = bfd_get_8 (input_bfd, hit_data); /*fectch addend again with bfd_get_8 */ value += addend; /* There is no way to tell whether the user intended to use a signed or unsigned addend. When checking for overflow we accept either, as specified by the AAELF. */ if ((long) value > 0xff || (long) value < -0x80) return bfd_reloc_overflow; bfd_put_8 (input_bfd, value, hit_data); return bfd_reloc_ok; . -- You are receiving this mail because: You are on the CC list for the bug. _______________________________________________ bug-binutils mailing list bug-binutils@gnu.org https://lists.gnu.org/mailman/listinfo/bug-binutils