1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- Mini FAQ about the misc libc/gcc crt files.
- Some definitions:
- PIC - position independent code (-fPIC)
- PIE - position independent executable (-fPIE -pie)
- crt - C runtime
- crt0.o crt1.o etc...
- Some systems use crt0.o, while some use crt1.o (and a few even use crt2.o
- or higher). Most likely due to a transitionary phase that some targets
- went through. The specific number is otherwise entirely arbitrary -- look
- at the internal gcc port code to figure out what your target expects. All
- that matters is that whatever gcc has encoded, your C library better use
- the same name.
- This object is expected to contain the _start symbol which takes care of
- bootstrapping the initial execution of the program. What exactly that
- entails is highly libc dependent and as such, the object is provided by
- the C library and cannot be mixed with other ones.
- On uClibc/glibc systems, this object initializes very early ABI requirements
- (like the stack or frame pointer), setting up the argc/argv/env values, and
- then passing pointers to the init/fini/main funcs to the internal libc main
- which in turn does more general bootstrapping before finally calling the real
- main function.
- glibc ports call this file 'start.S' while uClibc ports call this crt0.S or
- crt1.S (depending on what their gcc expects).
- crti.o
- Defines the function prologs for the .init and .fini sections (with the _init
- and _fini symbols respectively). This way they can be called directly. These
- symbols also trigger the linker to generate DT_INIT/DT_FINI dynamic ELF tags.
- These are to support the old style constructor/destructor system where all
- .init/.fini sections get concatenated at link time. Not to be confused with
- newer prioritized constructor/destructor .init_array/.fini_array sections and
- DT_INIT_ARRAY/DT_FINI_ARRAY ELF tags.
- glibc ports used to call this 'initfini.c', but now use 'crti.S'. uClibc
- also uses 'crti.S'.
- crtn.o
- Defines the function epilogs for the .init/.fini sections. See crti.o.
- glibc ports used to call this 'initfini.c', but now use 'crtn.S'. uClibc
- also uses 'crtn.S'.
- Scrt1.o
- Used in place of crt1.o when generating PIEs.
- gcrt1.o
- Used in place of crt1.o when generating code with profiling information.
- Compile with -pg. Produces output suitable for the gprof util.
- Mcrt1.o
- Like gcrt1.o, but is used with the prof utility. glibc installs this as
- a dummy file as it's useless on linux systems.
- crtbegin.o
- GCC uses this to find the start of the constructors.
- crtbeginS.o
- Used in place of crtbegin.o when generating shared objects/PIEs.
- crtbeginT.o
- Used in place of crtbegin.o when generating static executables.
- crtend.o
- GCC uses this to find the start of the destructors.
- crtendS.o
- Used in place of crtend.o when generating shared objects/PIEs.
- General linking order:
- crt1.o crti.o crtbegin.o [-L paths] [user objects] [gcc libs] [C libs] [gcc libs] crtend.o crtn.o
- More references:
- http://gcc.gnu.org/onlinedocs/gccint/Initialization.html
|