Compiling C++ apps statically

Experimenting with Wirbel, I wondered if it could create a static executable. Wirbel creates intermediate C++ code then calls the Gnu C++ compiler, so the final executable requires the and libraries.

The thing is the executable would have to be small, and for plain C programs compiling against Dietlibc or uClibc statically is the way to go. For a C app, you could do this:

# diet gcc -nostdinc -o hello hello.c

A C++ app requires the C shared libraries, but also the C++ shared libraries. One thing at a time, can I compile a C++ app to use the libstdc++.a and libgcc_s.a static libraries?, problem, there is no libgcc_s.a. However, after a bit of research I discovered that this works:

remove /usr/lib/ symlink
# ln -s /usr/lib/gcc/i486-t2-linux-gnu/4.2.2/libgcc_eh.a /usr/lib/libgcc_s.a
remove /usr/lib/ symlink

The removal of the symlinks forces the linker to fallback and look to see if there is a static library and if so it is used.

After doing the above, I then compile the Wirbel program:
# wic hello.w
# ldd ./hello => (0xffffe000) => /lib/ (0xb7f33000) => /lib/ (0xb7e38000)
/lib/ (0xb7f56000)

But, at this stage I don't know how to link in the Dietlibc libraries instead of the standard C libraries.

Posted on 5 Nov 2008, 17:03


Posted on 5 Nov 2008, 17:30 by BarryK
Fully static wirbel app
Can create a fully static app using standard C libs:

# wic -c hello.w -o
...this creates C++ source file
# wic -v hello.w
...this shows how the c++ compiler is called.
# g++ -static -fno-rtti -w -I/usr/include/wirbel -o hello /usr/lib/wirbel/libwirbel.a /usr/lib/wirbel/baustones/fs/file.o

After stripping, the executable is 447KB. This is mostly because of the C library. The original shared executable was 22KB, when I linked libstdc++ statically it jumped to 89KB.

Posted on 6 Nov 2008, 4:45 by raymundo dionicio
How much is C++ ?
How much disk space is needed if adding wirbel c++ required libraries to woof base? How much adittional ram is needed?

Posted on 6 Nov 2008, 8:23 by BarryK
C++ libs
Puppy has all the C++ shared libs.

I'm only trying to compile statically because I want to know if Wirbel could be used to create a static app that will run in the initial ramdisk.