Version française
Home     About     Download     Resources     Contact us    
Browse thread
RE: [Caml-list] [patch] PIC on amd64
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Erik Bourget <ebourget@y...>
Subject: Re: [Caml-list] [patch] PIC on amd64
"Alexander Bottema" <Alexander.Bottema@mathworks.com> writes:

> Hasn't support for PIC/AMD64 been fixed in the latest release of OCaml
> (3.09.1)? Or have you found a bug in 3.09.1? I've tried to (native)
> compile a simple program on AMD64 as a shared library and it worked
> fine.

The problem is when you try to go beyond simple :)

ocamlopt -fPIC -output-obj -o hello.o pcre.cmxa hello.cmx
ld -shared --whole-archive -o hello.so hello.o -lpcre

You could make a shared library from ocaml if you assembled everything into
one object file as the assembler would be able to see all the functions.
amd64 linkers require you to look up functions in the GOT (which ld.so keeps
up to date when it loads new stuff) if they're not local.

ocaml 3.09.1:
  movq symbol(%rip), %r11  # add symbol to %rip and we know in memory where 
                           # it is.

With shared library patch:
  movq symbol@GOTPCREL(%rip), %r11  # get the address of the symbol in 
                                    # the table the linker has made for us,
  movq (%r11), %r11                 # and load it.  We have to do this because
                                    # we don't know the address of
                                    # symbol until runtime!

So, specifically, the aim of this patch is to allow the creation of shared
libraries that in turn pull in other libraries.  The amd64 ABI doc
(x86-64.org) goes into great detail about the different kinds of relocations
that are available - some are valid for shared objects and some are not.

- Erik