Anonymous user
Calling Global Constructors: Difference between revisions
Undo revision 14725 by Shikhin (talk) and fix typo
[unchecked revision] | [unchecked revision] |
Line 5:
= GNU Compiler Collection - System V ABI =
The System V ABI (as used by <tt>i586-elf-gcc</tt>, <tt>x86_64-elf-gcc</tt>, and other ELF platforms) specifies use of five different object files that together handle program initialization. These are traditionally called <tt>crt0.o</tt>, <tt>crti.o</tt>, <tt>crtbegin.o</tt>, <tt>crtend.o</tt>, and <tt>crtn.o</tt>. Together these object files implement two special functions: <tt>_init</tt> which runs the global constructors and other initialization tasks, and <tt>_fini</tt> that runs the global destructors and other termination tasks.
This scheme allows the compiler great control in program initialization and makes things easy for you, but you have to cooperate with the compiler or bad things will happen. Your cross-compiler will provide you with <tt>crtbegin.o</tt> and <tt>crtend.o</tt>. These files contain the internals that the compiler wish to hide from you, but wants you to use. To get access to this information, you will need to provide your own implementation of <tt>crti.o</tt> and <tt>crtn.o</tt>. Fortunately, this is easy and described in detail in this tutorial. The fifth file <tt>crt0.o</tt> contains the program entry point (normally <tt>_start</tt>) and calls the special <tt>_init</tt> function that runs the "program initialization tasks" that <tt>crti.o</tt>, <tt>crtbegin.o</tt>, <tt>crtend.o</tt>, and <tt>crtn.o</tt> together form, and your exit function will normally call the <tt>_fini</tt> function made by these objects. However, <tt>crt0</tt>.o is out of scope of this article. (Note that the object file that contains <tt>_start</tt> acts as <tt>crt0.o</tt> in a kernel.)
Line 17:
<source lang="bash">i585-elf-ld crt0.o crti.o crtbegin.o foo.o bar.o crtend.o crtn.o</source>
The idea is that the these files together form the <tt>_init</tt> and <tt>_fini</tt> functions during the linking. This is
== Using global constructors from C ==
Line 36:
== Using crti.o, crtbegin.o, crtend.o, and crtn.o in a Kernel ==
In a kernel, you are not using a user-space C library. You may be using a special kernel "C library", or
<source lang="bash">i586-elf-gcc $CFLAGS -print-file-name=crtbegin.o</source>
Line 77:
== x86 (32-bit) ==
It is very simple to implement this under x86. You simply have to define the header of two functions in <tt>crti.o</tt> and the footer in <tt>crtn.o</tt> and use these objects in your C library or kernel. You can then simply call <tt>_init</tt> to perform the initialization tasks and call <tt>_fini</tt> to perform the termination tasks (normally
<source lang="asm">
/*
.section .init
.global _init
Line 99:
<source lang="asm">
/*
.section .init
/* gcc will nicely put the contents of crtend.o's .init section here. */
Line 115:
== x86_64 (64-bit) ==
The system ABI on
<source lang="asm">
/*
.section .init
.global _init
Line 137:
<source lang="asm">
/*
.section .init
/* gcc will nicely put the contents of crtend.o's .init section here. */
|