www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Whether it is possible to produce PURELY statically linked program in

reply "deeproot" <deeprootdeeproot gmail.com> writes:
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
parent Iain Buclaw <ibuclaw ubuntu.com> writes:
On 13 September 2012 10:25, deeproot <deeprootdeeproot gmail.com> wrote:
 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.

I know what needs to be done from the gdc driver side - this will be resolved tonight. Regards -- Iain Buclaw *(p < e ? p++ : p) = (c & 0x0f) + '0';
Sep 13 2012