znaczenie R_386_32 / R_386_PC32 w sekcji .rel.text elfa

Aby zrozumieć koncepcję relokacji, napisałem prosty program chk.c w następujący sposób:

  1 #include<stdio.h>
  2 main(){
  3         int x,y,sum;
  4         x = 3;
  5         y = 4;
  6         sum = x + y;
  7         printf("sum = %d\n",sum);
  8 }

jego równoważny kod złożenia, użycie „objdump -d chk.o” to:

00000000 <main>:
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   83 e4 f0                and    $0xfffffff0,%esp
   6:   83 ec 20                sub    $0x20,%esp
   9:   c7 44 24 1c 03 00 00    movl   $0x3,0x1c(%esp)
  10:   00 
  11:   c7 44 24 18 04 00 00    movl   $0x4,0x18(%esp)
  18:   00 
  19:   8b 44 24 18             mov    0x18(%esp),%eax
  1d:   8b 54 24 1c             mov    0x1c(%esp),%edx
  21:   8d 04 02                lea    (%edx,%eax,1),%eax
  24:   89 44 24 14             mov    %eax,0x14(%esp)
  28:   b8 00 00 00 00          mov    $0x0,%eax
  2d:   8b 54 24 14             mov    0x14(%esp),%edx
  31:   89 54 24 04             mov    %edx,0x4(%esp)
  35:   89 04 24                mov    %eax,(%esp)
  38:   e8 fc ff ff ff          call   39 <main+0x39>
  3d:   c9                      leave  
  3e:   c3                      ret    

i sekcja .rel.text widziana przy użyciu readelf wygląda następująco:

Relocation section '.rel.text' at offset 0x360 contains 2 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
00000029  00000501 R_386_32          00000000   .rodata
00000039  00000902 R_386_PC32        00000000   printf

Mam na ten temat następujące pytania:

1) z drugiego wpisu w sekcji .rel.text jestem w stanie zrozumieć, że wartość w offsecie 0x39 w sekcji .text (tutaj 0xfcffffff) musi zostać zastąpiona adresem symbolu powiązanego z indeksem 9 tablicy symboli (& to wychodzi na printf). Ale nie jestem w stanie wyraźnie zrozumieć znaczenia 0x02 (ELF32_R_TYPE) tutaj. Co określa tutaj R_386_PC32? Czy ktoś może jasno wyjaśnić jego znaczenie.

2) Nie jestem w stanie zrozumieć pierwszego wpisu. to, co musi zostać zastąpione w offsecie 0x29 w sekcji .text i dlaczego nie jest tutaj jasne. Znowu chcę poznać znaczenie R_386_32 tutaj. znalazłem jeden plik pdf elf_format.pdf, ale nie jestem w stanie wyraźnie zrozumieć znaczenia słowa „Type” w sekcji .rel.text.

3) Chcę też poznać znaczenie lea zespołu inst (% edx,% eax, 1),% eax ”. Chociaż znalazłem bardzo dobry link (Jaki jest cel instrukcji LEA?) opisując znaczenie lea, ale format lea (co jest 3 arg wewnątrz nawiasów) nie jest jasny.

jeśli ktoś może jasno wyjaśnić odpowiedzi na powyższe pytania, zostanie to bardzo docenione. wciąż staram się znaleźć odpowiedzi na te pytania, chociaż wiele próbowałem z google.

jeszcze jedno pytanie. pokazałem wpisy tabeli symboli dla obu odsunięć 5 i 9 poniżej.

 Num: Value Size Type Bind Vis Ndx Name 
 5: 00000000 0 SECTION LOCAL DEFAULT 5 
 9: 00000000 0 NOTYPE GLOBAL DEFAULT UND printf' 

Pole informacyjne dla pierwszego wpisu w tabeli .rel.text to 0x05, które wskazuje indeks tablicy symboli. Pokazałem wpis tablicy symboli dla indeksu 5 powyżej, ale nie jestem w stanie zrozumieć, jak to mówi nam, że jest dla .rodata.

questionAnswers(2)

yourAnswerToTheQuestion