On Wednesday, 26 February 2014 at 17:08:38 UTC, Assaf Gordon wrote:
In my first message in this thread, I wrote (item #3), that unless I'm missing something, there is no way to build a statically linked binary with D on Linux.

They really aren't far from it out of the box:

$ dmd hellod.d
$ ldd hellod
        linux-gate.so.1 =>  (0xffffe000)
        libpthread.so.0 => /lib/libpthread.so.0 (0xf76db000)
        libm.so.6 => /lib/libm.so.6 (0xf76b5000)
        librt.so.1 => /lib/librt.so.1 (0xf76ac000)
        libc.so.6 => /lib/libc.so.6 (0xf7549000)
        /lib/ld-linux.so.2 (0xf7730000)


It isn't fully static, but those libraries are all pretty basic things and generally available on any linux install. The biggest problem is probably the libc version not matching on older installations.

One option might be to package those .so files right with your executable. A poor man's static link.


Anyway, let's try the -static switch we can use to do statically linked libc on some programs.

$ dmd hellod.d -c
$ gcc hellod.o -o hellod -m32 -L/home/me/d/dmd2/linux/bin32/../lib32 -Xlinker --export-dynamic -l:libphobos2.a -lpthread -lm -lrt -static

undefined reference to `__tls_get_addr'


BTW if you run "dmd -v yourfile.d" the last line of output is the linker command line it runs (via gcc). Then you can copy/paste that and tweak the arguments. Here, I added -static.


However, that is *not* a D problem per se, that's a libc function. Maybe my system just doesn't have the right stuff installed to build a static threaded app.

I would gladly spend the time to create VMs for each common system setup and package a static binary for it.


If you're doing that, you don't need to do anything special, since the vm will link the appropriate libc version anyway, so the default build should work.


I betcha if I sent you my binary from my slackware box over to your computer it would work even if you are a different distro.

Reply via email to