Lazy IBT PLT entries look like
static const bfd_byte elf_i386_lazy_ibt_plt_entry[LAZY_PLT_ENTRY_SIZE] =
{
0xf3, 0x0f, 0x1e, 0xfb, /* endbr32 */
0x68, 0, 0, 0, 0, /* pushl immediate */
0xe9, 0, 0, 0, 0, /* jmp relative */
0x66, 0x90 /* xchg %ax,%ax */
};
static const bfd_byte elf_x86_64_lazy_ibt_plt_entry[LAZY_PLT_ENTRY_SIZE] =
{
0xf3, 0x0f, 0x1e, 0xfa, /* endbr64 */
0x68, 0, 0, 0, 0, /* pushq immediate */
0xe9, 0, 0, 0, 0, /* jmpq relative */
0x66, 0x90 /* xchg %ax,%ax */
};
They only have
unsigned int plt_reloc_offset; /* ... offset into relocation table. */
and don't have
unsigned int plt_got_offset; /* ... address of this symbol in .got. */
We should use plt_reloc_offset, not plt_got_offset, to check IBT PLT.
PR binutils/33358
* elf32-i386.c (elf_i386_get_synthetic_symtab): Check
plt_reloc_offset for lazy IBT PLT.
* elf64-x86-64.c (elf_x86_64_get_synthetic_symtab): Likewise.
Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
if (lazy_ibt_plt != NULL
&& (memcmp (plt_contents + lazy_ibt_plt->plt0_entry_size,
lazy_ibt_plt->plt_entry,
- lazy_ibt_plt->plt_got_offset) == 0))
+ lazy_ibt_plt->plt_reloc_offset) == 0))
plt_type = plt_lazy | plt_second;
else
plt_type = plt_lazy;
if (lazy_ibt_plt != NULL
&& (memcmp (plt_contents + lazy_ibt_plt->plt0_entry_size,
lazy_ibt_plt->pic_plt_entry,
- lazy_ibt_plt->plt_got_offset) == 0))
+ lazy_ibt_plt->plt_reloc_offset) == 0))
plt_type = plt_lazy | plt_pic | plt_second;
else
plt_type = plt_lazy | plt_pic;
{
if (memcmp (plt_contents + lazy_ibt_plt->plt_entry_size,
lazy_ibt_plt->plt_entry,
- lazy_ibt_plt->plt_got_offset) == 0)
+ lazy_ibt_plt->plt_reloc_offset) == 0)
{
/* The fist entry in the lazy IBT PLT is the same as
the lazy PLT. */
if (memcmp (plt_contents
+ lazy_bnd_ibt_plt->plt_entry_size,
lazy_bnd_ibt_plt->plt_entry,
- lazy_bnd_ibt_plt->plt_got_offset) == 0)
+ lazy_bnd_ibt_plt->plt_reloc_offset) == 0)
lazy_plt = lazy_bnd_ibt_plt;
else
lazy_plt = lazy_bnd_plt;