מאיה רשיש (maya@NetBSD.org)
למעבד יש יכולת לעבוד עם שני דברים:
נרצה לבצע חישוב: חיבור 2 מספרים
add R1 R2 R3
R1 = R2 + R3
נרצה לבצע חישוב בתור פונקציה:
int add(int x, int y)
בשביל זה יש לנו ABI שמגדיר איך להעביר פרמטרים, וכך אנחנו יודעים שהרגיסטר שמכיל את הארגומנט הראשון הוא a0, הבא a1...
add: add v0 a0 a1 jr ra
פורמט ELF
$ readelf -a /bin/sh .. Dynamic section at offset 0x28da0 contains 22 entries: Tag Type Name/Value 0x0000000000000001 (NEEDED) Shared library: [libedit.so.3] 0x0000000000000001 (NEEDED) Shared library: [libterminfo.so.1] 0x0000000000000001 (NEEDED) Shared library: [libc.so.12] 0x000000000000000f (RPATH) Library rpath: [/lib] 0x000000000000000c (INIT) 0x4910 0x000000000000000d (FINI) 0x1f240 0x0000000000000004 (HASH) 0x240
פורמט ELF
$ readelf -a /bin/sh .. Section Headers: [Nr] Name Type Address Offset Size EntSize Flags Link Info Align [22] .got PROGBITS 0000000000228f40 00028f40 00000000000000a8 0000000000000008 WA 0 0 8 [23] .got.plt PROGBITS 0000000000229000 00029000 0000000000000440 0000000000000008 WA 0 0 8 [24] .data PROGBITS 0000000000229440 00029440 000000000000035f 0000000000000000 WA 0 0 32 [25] .bss NOBITS 00000000002297a0 0002979f 0000000000002500 0000000000000000 WA 0 0 32 [26] .comment PROGBITS 0000000000000000 0002979f 0000000000000021 0000000000000001 MS 0 0 1 [27] .ident PROGBITS 0000000000000000 000297c0 00000000000007b8 0000000000000000 0 0 1
פורמט ELF
$ nm /bin/sh 0000000000013a4e T makestrspace U malloc 000000000022a440 B markp 0000000000229b58 B max_user_fd U mbtowc U memcmp U memcpy U memmove 0000000000229720 D memout U memset