From: Max Filippov Date: Fri, 7 Dec 2018 20:59:04 +0000 (-0800) Subject: bfd: xtensa: ignore overflow in hight part of const16 relocation X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=00863b8e40a0afd0daf0925acf3f7c794dfd9c73;p=binutils-gdb.git bfd: xtensa: ignore overflow in hight part of const16 relocation 32-bit constants loaded by two const16 opcodes that involve relocation (e.g. calculated as a sum of a symbol and a constant) may overflow, resulting in linking error with the following message: dangerous relocation: const16: cannot encode: (_start+0x70000000) They should wrap around instead. Limit const16 opcode immediate field to 16 least significant bits to implement this wrap around. bfd/ 2018-12-11 Max Filippov * elf32-xtensa.c (elf_xtensa_do_reloc): Limit const16 opcode immediate field to 16 least significant bits. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index b88fe7eb95a..9acd28dc7ba 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2018-12-11 Max Filippov + + * elf32-xtensa.c (elf_xtensa_do_reloc): Limit const16 opcode + immediate field to 16 least significant bits. + 2018-12-11 H.J. Lu * elf32-xc16x.c (elf32_xc16x_rtype_to_howto): New function. diff --git a/bfd/elf32-xtensa.c b/bfd/elf32-xtensa.c index cf085b7b075..de960cd3b8f 100644 --- a/bfd/elf32-xtensa.c +++ b/bfd/elf32-xtensa.c @@ -1957,8 +1957,9 @@ elf_xtensa_do_reloc (reloc_howto_type *howto, } else if (opcode == get_const16_opcode ()) { - /* ALT used for high 16 bits. */ - newval = relocation >> 16; + /* ALT used for high 16 bits. + Ignore 32-bit overflow. */ + newval = (relocation >> 16) & 0xffff; opnd = 1; } else