I would like to compile a native shared library with ocaml on amd64. I
googled the problem and as far as I understand, I need both runtimes
and libraries (the ones used in my library) compiled with -fPIC:
http://caml.inria.fr/mantis/view.php?id=3924
The above trick allowed me to compile ocaml runtimes with -fPIC
(linker doesn't complain about libasmrun.a anymore):
BYTECCCOMPOPTS=-fno-defer-pop -Wall -D_FILE_OFFSET_BITS=64 -D_REENTRANT -fPIC
NATIVECCCOMPOPTS=-Wall -D_FILE_OFFSET_BITS=64 -D_REENTRANT -fPIC
NATIVECCPROFOPTS=-Wall -D_FILE_OFFSET_BITS=64 -D_REENTRANT -fPIC
SUPPORTS_SHARED_LIBRARIES=true
BNG_ARCH=amd64
http://caml.inria.fr/pub/ml-archives/caml-list/2005/12/6ac193aca085629903e7efd79ae0274f.en.html
But I still have issues with the ocaml libraries. I don't know how to
compile the standard library from the ocaml tarball with -fPIC. I
looked at the Makefiles, but I could'nt figure out what to change to
achieve this task.
I've looked at rocaml (http://eigenclass.org/hiki/rocaml) which fails
to compile amd64 library too, so I imagine the problem is definitly in
the way of compiling the ocaml libraries.
Any hints how to compile these libraries with -fPIC ?
Jonathan
_______________________________________________
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs
You should try the current CVS version of OCaml. Under AMD64, ocamlopt
now produces PIC code by default.
-- Alain
cc -shared -o foo.so foo_rocaml_wrapper.o -L. -L/usr/lib -L.
-rdynamic -Wl,-export-dynamic foo_rocaml_runtime.o
/usr/local/lib/ocaml/libasmrun.a /usr/local/lib/ocaml/libunix.a
/usr/local/lib/ocaml/libnums.a -lruby1.8 -lpthread -ldl -lcrypt -lm
-lc
/usr/bin/ld: /usr/local/lib/ocaml/libasmrun.a(startup.o): relocation
R_X86_64_32 against `a local symbol' can not be used when making a
shared object; recompile with -fPIC
/usr/local/lib/ocaml/libasmrun.a: could not read symbols: Bad value
collect2: ld returned 1 exit status
make: *** [foo.so] Erreur 1
Is there any specific tag to check out from CVS?
You mentioned in your previous email that you got rid of such errors by
adding -fPIC to *COMPOPTS variables. Cannot you do the same for other C
libraries? The changes in the CVS only affect the code generated by
OCaml, like stdlib.a (the native code produced by ocamlopt for the
standard library).
Now the error is in code written directly in assembler (asmrun/amd64.S).
Unfortunately, I don't think there is an easy solution here: this code
should be adapted to be position-independent.