ספריות דינאמיות

מאיה רשיש (maya@NetBSD.org)

למעבד יש יכולת לעבוד עם שני דברים:

  • זכרון מרכזי (RAM)
  • רגיסטרים על המעבד
    • רגיסטרים להעברת ארגומנטים: a0, ... , a7
    • רגיסטרים לשמירת ה stack pointer

נרצה לבצע חישוב: חיבור 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