g++, static initialization and -nostdlib

18,788

From gcc linker docs,

-nostdlib

Do not use the standard system startup files or libraries when linking. No startup files and only the libraries you specify will be passed to the linker, and options specifying linkage of the system libraries, such as -static-libgcc or -shared-libgcc, are ignored.

Hence use,

-nodefaultlibs

Do not use the standard system libraries when linking. Only the libraries you specify will be passed to the linker, options specifying linkage of the system libraries, such as -static-libgcc or -shared-libgcc, will be ignored. The standard startup files are used normally, unless -nostartfiles is used. The compiler may generate calls to memcmp, memset, memcpy and memmove. These entries are usually resolved by entries in libc. These entry points should be supplied through some other mechanism when this option is specified.

Also try,

g++ -Wl, -static

-Wl      passes the next command on to the linker
-static  On systems that support dynamic linking, this prevents linking with 
         the shared libraries. On other systems, this option has no effect.
Share:
18,788

Related videos on Youtube

Thomas
Author by

Thomas

Updated on June 04, 2022

Comments

  • Thomas
    Thomas about 2 years

    Compiling / linking with -nostdlib seems to prevent static initialization, even if I add my own crti.s and crtn.s with .init/.fini sections.

    Are there workarounds to make g++ generate static initialization code that is inserted in .init or that I can call manually?

    This is what I tried:

    g++ -o test.o -c -fno-use-cxa-atexit test.cc  # has _start (entry point) 
                                                  #   that calls _init and _main
    as -o crti.o crti.s      # has _init in section .init
    as -o crtn.o crtn.s
    g++ -o test ./crti.o test.o -nodefaultlibs -nostartfiles ./crtn.o
    

    -nodefaultlibs alone includes static initialization code and call, but forces use of libc-_start/_init.

    -nodefaultlibs -nostartfiles allows me to use my own _start / _init, but does not include code or call to static initialization.

  • Thomas
    Thomas about 12 years
    With -nodefaultlibs the code for static intialization is included and called, but then I see no way to use my own .init / _start code. Is that still possible?
  • Thomas
    Thomas about 12 years
    Yes, I tried -nostartfiles, but then again the linker doesn't include the code and call for static intialization into my .init section.