[llvm-dev] PIC and mcmodel=large on x86 doesn't use any relocations
John Reagan via llvm-dev
llvm-dev at lists.llvm.org
Tue Nov 1 07:06:44 PDT 2016
> From: Joerg Sonnenberger via llvm-dev <llvm-dev at lists.llvm.org>
> To: llvm-dev at lists.llvm.org
> Subject: Re: [llvm-dev] PIC and mcmodel=large on x86 doesn't use any
> relocations
>
> On Mon, Oct 31, 2016 at 02:30:43PM -0400, John Reagan via llvm-dev
> wrote:
> > The idea to make this all work on x86-64 is to use the address of a
> > routine's PLT as its "address" in all cases. By putting the PLT in
> > 32-bit address space, some ancient BASIC or Fortran program can
> > continue to use an INTEGER*4 to hold a routine's "address" and pass
> it
> > around. Of course, our PLTs won't be actual dynamic loading code
> > but just trampolines to the 64-bit code. The PLTs provide a
> > consistent "address of routine" for pointer comparisons, etc just
> > like the "primary function descriptor" on Itanium.
>
> That's effectively how the main binary works for dynamically linked
> non-PIE x86_64 code in the default code model. It creates some
> problems for protected symbols and involves the nasty copy
> relocations, but nothing so far seems to require the large code model,
> at least in the sense of "GOT and PLT are not addressable with 32bit signed offset"?
>
> Joerg
>
Looking at what I have today on OpenVMS Itanium, I can have code at address (I'll add a 'dot' in the middle for readability)
0x00000001.00000000
and our short section with static data/FDs is at
0x00000000.00020000
How does the code find the GOT/PLT with only 32-bit %rip addressing?
More information about the llvm-dev
mailing list