To remove one direct branch to PLT for external function calls:

https://gcc.gnu.org/ml/gcc-patches/2015-05/msg00001.html

I am proposing to add 2 new relocations, R_X86_64_RELAX_PC32
and R_X86_64_RELAX_PLT32:

1. They can only be used on 32-bit PC relative call/jmp instructions.
2. call/jmp instructions must have a 0x48 prefix.
3. Linker can treat them as R_X86_64_PC32 and R_X86_64_PLT32,
respectively.
4. Optionally, linker can convert

0x48 call/jmp foo[@PLT]

to

call/jmp *foo@GOTPCREL(%rip)

when function foo is undefined.

R_X86_64_RELAX_PC32 is defined as 39, which was the
deprecated R_X86_64_PC32_BND for

bnd call/jmp  foo

R_X86_64_RELAX_PLT32 is defined as 40, which was the
deprecated R_X86_64_PLT32_BND for

bnd call/jmp  foo@PLT

Since the current linkers treat R_X86_64_PC32_BND and
R_X86_64_PLT32_BND as _X86_64_PC32 and R_X86_64_PLT32,
respectively, they can handle the new ones correctly.

Comments, suggestions?

Thanks.

-- 
H.J.

Reply via email to