[erlang-questions] Bundling C dependencies with a release

John Doe donpedrothird@REDACTED
Tue Oct 25 18:59:15 CEST 2016

For portable app you'll need to compile as many libs as possible
statically. With pure C libraries it's usually easy to do so, but you will
have a lot of problems with c++ executables and libraries, as libstdc++ has
different ABI in different gcc releases. You'd need to compile libstdc++
statically, and also anything that links against c++ code with
-static-libstdc++ and -fPIC. The libstdc++ itself should be built with
-fPIC flag.
When I need portable binaries I compile gcc myself from sources prior to
linking against static libstdc++, with
./configure CXXFLAGS=-fPIC CFLAGS=-fPIC --enable-languages=c,c++
--disable-gnu-unique-object --disable-multilib

Also you could get problems with openssl if you use the crypto app. There
are many different versions built of openssl each with different set of
algorithms, so it is better to compile your own openssl with something like

wget https://www.openssl.org/source/openssl-1.0.2h.tar.gz
tar -xvzf openssl-1.0.2h.tar.gz
cd openssl-1.0.2h/
./config --prefix=/usr shared -fPIC
make depend && make && make install

and then have otp built with
--disable-dynamic-ssl-lib --with-ssl=/usr/ --enable-smp-support
--without-termcap --enable-dirty-schedulers --enable-builtin-zlib

You can even patch the OTP if you need it to work with relative install
path (warning - the patch contains bashisms): http://pastebin.com/FJtRNRMJ

All that stuff should be done on a dedicated build server or VPS, as it
could break a lot of things in the system. But as the result the app is
very portable. If built on x64 box, it would work on most x64 bit linux
servers with any distro.

nif apps should be also built with something like this:

{"CXXFLAGS", "$CXXFLAGS -std=c++11 -Wall -fPIC -g3 -static-libstdc++"},
{"DRV_LDFLAGS", "$DRV_LDFLAGS c_src/libsomeapp.a
c_src/system/lib/libsnappy.a c_src/system/lib/liblz4.a
c_src/system/lib/libz.a c_src/system/lib/libbz2.a /usr/lib64/
gcc/x86_64-pc-linux-gnu/5.3.0/libstdc++.a  -static-libstdc++"}]}.

2016-10-25 15:35 GMT+03:00 Radu Popescu <i.radu.popescu@REDACTED>:

> Hello!
> I'm developing an Erlang application which is structured as an OTP
> release. It contains OTP applications and some native executables (written
> in C++). One of the Erlang dependencies also requires libsodium.
> When the time will come to deploy this - mostly to RH and Ubuntu/Debian
> servers, the idea is to have something as self-contained as possible.
> Are there best practices for how to handle C library dependencies for an
> Erlang/OTP release? I appreciate any advice.
> Thanks!
> Best regards,
> Radu
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20161025/013f8446/attachment.htm>

More information about the erlang-questions mailing list