Pagini
Workshops
Parteneri
This is an old revision of the document!
Rulați make
pentru a compila sursele din directorul session-02-tasks.
readelf
pentru a afisa informații despre secțiunile executabilului adr_space
. (Hint: man readelf, search: sections).text
, .rodata
, .data
și .bss
. Observați diferențele în coloana Type
între .bss
și .data
. Ce înseamnă ele?adr_space.c
. Determinați secțiunea în care a fost plasată fiecare variabilă. În acest scop folosiți objdump
. (Hint: objdump -t)objdump
) corespunde cu declarația corespunzătoare din fișierul adr_space.c
.string2
este doar 4? Folosiți readelf
pentru a afișa tot conținutul secțiunii .data
(Hint: readelf -x). De ce lipsește conținutul variabilei string2
?readelf
pentru a căuta secțiunea în care este conținutul variabilei string2. Cum explicați?adr_space
. Folosiți pmap
pentru a afișa zonele de memorie mapate. Câte din zonele afișate de pmap sunt asociate executabilului adr_space
? Identificați stiva și heap-ul..text
, .rodata
, .data
și .bss
în ce zonă de memorie au fost încărcate. Folosiți coloana Addr
din output-ul lui readelf de la punctul 1 pentru a asocia fiecare din aceste secțiuni într-o zonă de memorie din cele afișate de pmap.adr_space
, folosind readelf
. Doar segmentele marcate cu “LOAD” vor fi încărcate în memorie. Corespund adresele acestor segmente cu output-ul lui pmap?return_array
. De ce nu funcționează? Corectați programul astfel încât să funcționeze corect.params
. Cum explicați comportamentul?stackframe
. Programul realizează apelurile de funcții main
→ f
→ g
. Funcția g afișează conținutul stivei. Identificați frame-urile corespunzătoare funcțiilor main
, f
și g
. Care sunt adresele de return? Folosiți utilitarul addr2line
pentru a verifica faptul că adresa de return este într-adevăr imediat după apelul funcției.bug
. Vom folosi GDB pentru a identifica motivul erorii.gdb ./bug
(gdb) run
Programul se va opri la linia care a cauzat accesul invalid. Pentru a afișa valorile variabilelor folosim comanda print
.
După ce am identificat ce variabilă are o valoare nevalidă vrem să aflăm motivul pentru care a ajuns așa. Folosiți comanda backtrace
pentru a afișa stiva de apeluri.
(gdb) backtrace #0 0x0804846a in initialize (entries=0x0, num=5) at bug.c:15 #1 0x080484c5 in allocate (n=5) at bug.c:31 #2 0x080484df in main () at bug.c:41
Folosiți comanda frame
pentru a vă muta în cadrul unui alt frame din stiva de apeluri
(gdb) frame 1 #1 0x080484c5 in allocate (n=5) at bug.c:31 31 initialize(w, n);
Verificați valorile cu care a fost apelată funcția initialize
. De unde provin aceste valori? Folosiți comanda list
pentru a afișa codul sursă din jurul liniei curente. Investigați celelalte variabile din funcție și identificați sursa problemei.
chmod +x elf_magic ./elf_magic