Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Compile a Standalone Static Executable

I'm trying to compile an executable (ELF file) that does not use a dynamic loader. I built a cross compiler that compiles mips from linux to be used on a simulator I made. I asserted the flag -static-libgcc on compilation of my hello.cpp file (hello world program). Apparently this is not enough though. Because there is still a segment in my executable which contains the name/path of the dynamic loader. What flags do I use to generate an executable which contains EVERYTHING needed to be run? Do I need to rebuild my cross compiler?

like image 719
Dan Snyder Avatar asked Jul 19 '10 16:07

Dan Snyder


2 Answers

Use the following flags for linking

-static -static-libgcc -static-libstdc++

Use these three flags to link against the static versions of all dependencies (assuming gcc). Note, that in certain situation you don't necessarily need all three flags, but they don't "hurt" either. Therefore just turn on all three.

Check if it actually worked

  1. Make sure that there is really no dynamic linkage

    ldd yourexecutable
    

    should return "not a dynamic executable" or something equivalent.

  2. Make sure that there are no unresolved symbols left

    nm yourexecutable | grep " U "
    

    The list should be empty or should contain only some special kernel-space symbols like

    U __tls_get_addr
    
  3. Finally, check if you can actually execute your executable

like image 52
Bernhard Kausler Avatar answered Nov 06 '22 14:11

Bernhard Kausler


Try using the -static flag?

like image 20
sigjuice Avatar answered Nov 06 '22 12:11

sigjuice