samedi 22 novembre 2008

Les sections .ctors / .dtors

Quand on lance par exemple la commande :
$ size -A -x /bin/ls
/bin/ls :
section size addr
.interp 0x13 0x8048134
.note.ABI-tag 0x20 0x8048148
.hash 0x32c 0x8048168 <-- table de hash
.gnu.hash 0x5c 0x8048494 <-- table de hash
.dynsym 0x680 0x80484f0 <-- table des symboles
.dynstr 0x477 0x8048b70 <-- table des noms
.gnu.version 0xd0 0x8048fe8
.gnu.version_r 0xc0 0x80490b8
.rel.dyn 0x28 0x8049178 <-- table de relocation
.rel.plt 0x2e0 0x80491a0 <-- table de relocation
.init 0x30 0x8049480
.plt 0x5d0 0x80494b0
.text 0x104bc 0x8049a80 <-- intruction du programme (r)
.fini 0x1c 0x8059f3c
.rodata 0x3e4c 0x8059f60 <-- variables globales et statiques constante (r)
.eh_frame_hdr 0x2c 0x805ddac
.eh_frame 0xcc 0x805ddd8
.ctors 0x8 0x805e000 <-- constructeur
.dtors 0x8 0x805e008 <-- destructeur
.jcr 0x4 0x805e010
.dynamic 0xe8 0x805e014
.got 0x8 0x805e0fc
.got.plt 0x17c 0x805e104
.data 0x110 0x805e280 <-- variables globales et statiques initialisés (r+w)
.bss 0x46c 0x805e3a0 <-- variables globales et statiques non initialisés (r+w)
.gnu_debuglink 0x8 0x0
Total 0x1656a

Bon il y a les sections connue , .text, .data, .rodata etc ... mais pour ceu qui ne ce sont jamais demander ce que sont les sections .ctors et .dtors voici une petite explication .
En C un peu comme dans une class en PHP il y a un constructeur (.ctors) et un destructeur (.dtors).
Donc le constructeur et est appeler automatiquement au début du programme et le destructeur automatiquement à la fin . Voila un bout de code qui présente le fonctionnement :
#include
#include

static void constructeur(void)__attribute__((constructor));
static void destructeur(void)__attribute__((destructor));

int main(int argc, char** argv)
{
        printf("Dans la fonction main()\n");

    return EXIT_SUCCESS;
}
void destructeur(void)
{
        printf("Dans le destructeur\n");
}
void constructeur(void)
{
        printf("Dans le constructeur\n");
}

Aucun commentaire: