Hi Makarius,

On 23/12/17 14:24, Makarius wrote:
Dear experts on building and linking C++ applications,

according to the blog "Creating portable Linux binaries"
http://insanecoding.blogspot.de/2012/07/creating-portable-linux-binaries.html
the following options could make the poly executable more portable
accross different Linux versions:

   CFLAGS="-static-libgcc -static-libstdc++ -Wl,-Bstatic -lgmp -Wl,-Bdynamic"

On the surface this works fine on x86_64-linux (Ubuntu 16.04 LTS), but
there is a remaining dependency on libpolyml.so, which itself depends on
dynamic gcc and stdc++ libraries.

When you build with the above CFLAGS, does
  objdump -p <install-dir>/bin/poly
show no NEEDED entry for libgcc and libstdc++ in the dynamic section? I.e. did this actually cause these libraries to be statically linked? (They are still present for me if I use the above -static-... options.)

"-Wl,-Bstatic -lgmp -Wl,-Bdynamic" causes configure to fail for me. That is not surprising because the packages for gmp only distribute shared object (.so) files - there is no archive (.a) file so static linking to gmp is not possible without building it myself. Presumably you have archive/object files for all the libraries you want to statically link?

Including "-lpolyml" next to "-lgmp" above does not work, probably
because these options also apply to the build process of libpolyml itself.

How can I make libpolyml a static part of poly?

If you build Poly/ML with --disable-shared, libpolyml will always be statically linked: it has to be because no SO file is installed.

Even if Poly/ML is built with --enable-shared, the archive (.a) files are still installed. Therefore, regardless of how Poly/ML was built, you can produce an executable that statically links libpolyml by linking as follows:

  gcc file.o \
    -Wl,-Bstatic \
    -L<install-dir>/lib -lpolymain -lpolyml \
    -Wl,-Bdynamic \
    -lpthread [-lffi] -lgmp -lm -ldl -lstdc++ -lgcc_s -lgcc

(-lffi required if --with-system-libffi was specified.)
You can't use polyc in this case though.

Phil


Alternatively, how can I make libgcc and libstdc++ a static part of
libpolyml?


        Makarius
_______________________________________________
polyml mailing list
polyml@inf.ed.ac.uk
http://lists.inf.ed.ac.uk/mailman/listinfo/polyml

_______________________________________________
polyml mailing list
polyml@inf.ed.ac.uk
http://lists.inf.ed.ac.uk/mailman/listinfo/polyml

Reply via email to