2.12 Edition des liens 2/5
Utilisation de la mémoire :
constantes => segment
.rodata
;
variables globales initialisées => segment
.data
;
variables globales non initialisées => segment
.bss
;
variables locales => segment
[stack]
;
variables allouées sur le tas => segment
[heap]
.
Exercice "segment pour constante"
recopiez le programme "piste noire" sous le nom
constante.c
;
définissez dans ce programme une chaîne de caractères ;
calculez la taille de cette chaîne de caractères ;
retournez cette taille au système d’exploitation ;
compilez ce programme pour obtenir un exécutable compact ;
listez avec
readelf
la liste des sections.
Exercice "segment pour variable globale initialisée"
recopiez le programme "piste noire" sous le nom
globale.c
;
définissez dans ce programme une variable globale ;
retournez cette variable entière au système d’exploitation ;
compilez ce programme pour obtenir un exécutable compact ;
listez avec
readelf
la liste des sections.
Exercice "segment pour variable statique non initialisée"
recopiez le programme "piste noire" sous le nom
statique.c
;
définissez dans ce programme une fonction ;
cette fonction comprend une variable entière statique non initialisée ;
cette variable est retournée par la fonction ;
retournez au système d’exploitation le résultat de la fonction ;
compilez ce programme pour obtenir un exécutable compact ;
quelle valeur est retournée au systéme d’exploitation ?
listez avec
readelf
la liste des sections.
Exercice "zone mémoire allouée pour la pile"
recopiez le programme "piste noire" sous le nom
pile.c
;
utilisez dans ce programme l’appel système
sys_nanosleep
;
en 32 bits :
le code de l’appel système est
0xA2
;
le premier paramètre doit être dans
%ebx
("b" pour
__asm__
) ;
le second paramètre doit être dans
%ecx
("c" pour
__asm__
).
en 64 bits :
le code de l’appel système est
35
;
le premier paramètre doit être dans
%rdi
("D" pour
__asm__
) ;
le second paramètre doit être dans
%rsi
("S" pour
__asm__
).
le premier paramètre doit être un pointeur du type :
struct delai_s { int secondes; int microsecondes; };
initialisez le pour réaliser une attente de 30s ;
le second paramètre doit être
0
;
compilez ce programme pour obtenir un exécutable compact ;
lancez le programme en tâche de fond ;
affichez le contenu de
/proc/<pid>/maps
.
Exercice "zone mémoire allouée pour le tas"
créez le programme
tas.c
, ce programme va utiliser la
libc
;
commencez par un
main
appelant
sleep
pour dormir 30s ;
compilez et lancez le programme en tâche de fond ;
affichez le contenu de
/proc/<pid>/maps
;
ajoutez au programme un appel à
malloc
pour allouer un octet ;
faites afficher l’adresse de l’octet et ...
... pendant que vous y êtes stockez une valeur dans l’octet ;
recompilez et relancez le programme en tâche de fond ;
affichez le contenu de
/proc/<pid>/maps
;
conclusion ? qui gère le tas ?