לדלג לתוכן

5.11 פורמט ELF לעומק תרגול

תרגול - פורמט ELF לעומק

תרגיל 1 - זיהוי סקשנים

כתבו תוכנית C שמכילה:
- משתנה גלובלי מאותחל
- משתנה גלובלי לא מאותחל
- מחרוזת קבועה (string literal)
- פונקציה (מלבד main)

קמפלו את התוכנית והשתמשו ב-readelf -S כדי לזהות באיזה סקשן כל אלמנט נמצא.
בנוסף, השתמשו ב-readelf -s כדי לאמת את הסקשן של כל סמל.


תרגיל 2 - כתובת main ודיסאסמבלי

קמפלו תוכנית פשוטה (אפשר את התוכנית מתרגיל 1).

א. השתמשו ב-readelf -s כדי למצוא את הכתובת של main.
ב. השתמשו ב-objdump -d כדי לעשות דיסאסמבלי ולמצוא את הפונקציה main.
ג. ודאו שהכתובות תואמות. הסבירו כל שורה בדיסאסמבלי של main.


תרגיל 3 - השוואה בין קומפילציה סטטית לדינמית

קמפלו את אותה תוכנית בשתי דרכים:

gcc -o dynamic_prog prog.c
gcc -static -o static_prog prog.c

א. השתמשו ב-readelf -S על שני הקבצים. כמה סקשנים יש בכל אחד?
ב. אילו סקשנים מופיעים רק בגרסה הדינמית? למה?
ג. השוו את גודל הקבצים. מה מסביר את ההבדל?
ד. מה מחזירה הפקודה ldd על כל אחד מהקבצים?


תרגיל 4 - רלוקציות ו-printf

קמפלו תוכנית שמשתמשת ב-printf (קומפילציה דינמית רגילה).

א. הריצו readelf -r על הקובץ.
ב. מצאו את רשומת הrelocation של printf.
ג. הסבירו את כל השדות ברשומת הrelocation:
- מה הOffset?
- מה הType?
- מה שם הסמל?
ד. הסבירו במילים שלכם: מה רשומת הrelocation הזו אומרת לdynamic linker לעשות?
ה. השתמשו ב-readelf -S כדי למצוא את כתובת הGOT. האם הOffset מהrelocation נופל בתוך טווח הGOT?


תרגיל 5 - פונקציות constructor ו-destructor

כתבו תוכנית C עם:
- פונקציה מסומנת עם __attribute__((constructor)) שמדפיסה הודעה
- פונקציה מסומנת עם __attribute__((destructor)) שמדפיסה הודעה
- פונקציית main שמדפיסה הודעה

א. קמפלו והריצו - ודאו שסדר ההדפסות הוא: constructor, main, destructor.
ב. השתמשו ב-readelf -S כדי למצוא את הסקשנים .init_array ו-.fini_array.
ג. השתמשו ב-readelf -x .init_array כדי לראות את תוכן הסקשן. מה הכתובת שרשומה שם?
ד. השתמשו ב-readelf -s כדי למצוא את הכתובת של פונקציית הconstructor שלכם. האם היא תואמת?