[PATCH 2/5] ix86: tighten convert-load-reloc checking

H.J. Lu hjl.tools@gmail.com
Mon Feb 3 22:34:02 GMT 2025


On Mon, Feb 3, 2025 at 7:40 PM Jan Beulich <jbeulich@suse.com> wrote:
>
> Just like was done recently for x86-64 (commit 4998f9ea9d35): Even if
> the assembler avoids using the relaxable relocation for inapplicable
> insns, the relocation type can still appear for other reasons. Be more
> thorough in the opcode checking we do, to avoid bogusly altering other
> insns.
>
> Furthermore correct an opcode mask (even if with the added condition
> that's now fully benign).
>
> --- a/bfd/elf32-i386.c
> +++ b/bfd/elf32-i386.c
> @@ -1453,15 +1453,16 @@ elf_i386_convert_load_reloc (bfd *abfd,
>                   modrm = 0xc0 | (modrm & 0x38) >> 3;
>                   opcode = 0xf7;
>                 }
> -             else
> +             else if ((opcode | 0x38) == 0x3b)
>                 {
>                   /* Convert "binop foo@GOT(%reg1), %reg2" to
>                      "binop $foo, %reg2".  */
> -                 modrm = (0xc0
> -                          | (modrm & 0x38) >> 3
> -                          | (opcode & 0x3c));
> +                 modrm = 0xc0 | ((modrm & 0x38) >> 3) | (opcode & 0x38);
>                   opcode = 0x81;
>                 }
> +             else
> +               return true;
> +
>               bfd_put_8 (abfd, modrm, contents + roff - 1);
>               r_type = R_386_32;
>             }
>

Please add a testcase to show it makes a difference.

Thanks.

-- 
H.J.


More information about the Binutils mailing list