digitalmars.D - Whether it is possible to produce PURELY statically linked program in
- "deeproot" <deeprootdeeproot gmail.com> Sep 13 2012
- Jacob Carlborg <doob me.com> Sep 13 2012
For C++
$ cat hello.cpp
#include <iostream>
using namespace std;
int main() {
cout << "hello";
return 0;
}
$ g++ hello.cpp -o hello
$ ldd hello
linux-gate.so.1 => (0xb7703000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6
(0xb7607000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7462000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb7435000)
/lib/ld-linux.so.2 (0xb7704000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb7417000)
Now i am trying to produce static executable in C++
$ g++ -static hello.cpp -o hello
$ ldd hello
not a dynamic executable
==================================
Now For D:
hello world D program has multiple dependencies
$ cat hello.d
import std.stdio;
void main(){writefln("%s World!", "Hello");}
$ gdc hello.d
$ ldd a.out
linux-gate.so.1 => (0xb771a000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb76d7000)
librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xb76ce000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb76af000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0
(0xb7694000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb74ef000)
/lib/ld-linux.so.2 (0xb771b000)
===========
Now, when i compile with -static flag to gdc then i get following
warnings
$ gdc -static hello.d
/usr/lib/gcc/i686-linux-gnu/4.6/libgphobos2.a(path.o): In
function
`_D3std4path11expandTildeFAyaZAya18expandFromDatabaseFAyaZAya':
(.text+0x335): warning: Using 'getpwnam_r' in statically linked
applications requires at runtime the shared libraries from the
glibc version used for linking
/usr/lib/gcc/i686-linux-gnu/4.6/libgphobos2.a(stdio.o): In
function `_D3std5stdio11openNetworkFAyatZS3std5stdio4File':
(.text+0x3d35): warning: Using 'gethostbyname' in statically
linked applications requires at runtime the shared libraries from
the glibc version used for linking
There is no reason that my just dead simple hello world program
should be linked with getpwnam_r and gethostbyname
========
in the same way, dmd compiler produced executable also is
dynamically linked only.
Now, my question is that, whether like C/C++ i can actually get a
helloworld (that no complex dependencies) program FULLY
statically linked in D.
Sep 13 2012
On 2012-09-13 11:26, deeproot wrote:Now, when i compile with -static flag to gdc then i get following warnings $ gdc -static hello.d /usr/lib/gcc/i686-linux-gnu/4.6/libgphobos2.a(path.o): In function `_D3std4path11expandTildeFAyaZAya18expandFromDatabaseFAyaZAya': (.text+0x335): warning: Using 'getpwnam_r' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking /usr/lib/gcc/i686-linux-gnu/4.6/libgphobos2.a(stdio.o): In function `_D3std5stdio11openNetworkFAyatZS3std5stdio4File': (.text+0x3d35): warning: Using 'gethostbyname' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking There is no reason that my just dead simple hello world program should be linked with getpwnam_r and gethostbyname ======== in the same way, dmd compiler produced executable also is dynamically linked only. Now, my question is that, whether like C/C++ i can actually get a helloworld (that no complex dependencies) program FULLY statically linked in D.
I don't know about Linux but on Mac OS X a D application compiled with DMD has only one dependency, libSystem.B.dylib, which is the same as for a standard C application. -- /Jacob Carlborg
Sep 13 2012








Jacob Carlborg <doob me.com>