summaryrefslogtreecommitdiff
path: root/docs/crt.txt
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2012-05-05 01:46:30 -0400
committerMike Frysinger <vapier@gentoo.org>2012-05-05 03:48:20 -0400
commit3457d04a3d79cd046ef5d1b000047805aa03ec97 (patch)
tree2d29488d2c941f45bae3ec1129812b44655a3e36 /docs/crt.txt
parent81bd17ac76f0c64c518d9ca541a874b603e61fa0 (diff)
docs: restore crt from old svn tree
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Diffstat (limited to 'docs/crt.txt')
-rw-r--r--docs/crt.txt80
1 files changed, 80 insertions, 0 deletions
diff --git a/docs/crt.txt b/docs/crt.txt
new file mode 100644
index 000000000..41a44dcb4
--- /dev/null
+++ b/docs/crt.txt
@@ -0,0 +1,80 @@
+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