значение R_386_32 / R_386_PC32 в разделе .rel.text эльфа
Чтобы понять концепцию перемещения, я написал простую программу chk.c следующим образом:
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 }
его эквивалентный ассемблерный код с использованием «objdump -d chk.o» является :
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
и .rel.text раздел с использованием readelf выглядит следующим образом:
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
у меня есть следующие вопросы, основанные на этом:
1) из 2-й записи в разделе .rel.text я могу понять, что значение по смещению 0x39 в разделе .text (здесь 0xfcffffff) должно быть заменено адресом символа, связанного с индексом 9 таблицы символов (& amp; это выходит за печать). Но я не могу четко понять значение 0x02 (ELF32_R_TYPE) здесь. Что R_386_PC32 указывает здесь? Может кто-нибудь, пожалуйста, объясните его значение ясно.
2) Я также не могу понять 1-ую запись. что нужно заменить со смещением 0x29 в разделе .text и почему здесь неясно. Опять же, я хочу знать значение R_386_32 здесь. я нашел один pdf elf_format.pdf, но я не могу четко понять значение слова "Тип" в разделе .rel.text из этого.
3) Также я хочу знать, что означает сборка inst & quot; lea (% edx,% eax, 1),% eax & quot ;. Хотя я нашел очень хорошую ссылку (Какова цель инструкции LEA?) описание значения слова «ле», но формат языка «ле» (каковы 3 скобки в квадратных скобках) неясен.
Если кто-то может четко объяснить ответы на вышеперечисленные вопросы, это будет с благодарностью. Я все еще пытаюсь найти ответы на эти вопросы, хотя я много пробовал с Google.
еще один вопрос. я показал записи таблицы символов для смещения 5 и 9 ниже.
Num: Value Size Type Bind Vis Ndx Name
5: 00000000 0 SECTION LOCAL DEFAULT 5
9: 00000000 0 NOTYPE GLOBAL DEFAULT UND printf'
Информационное поле для первой записи в таблице .rel.text - 0x05, которое указывает индекс таблицы символов. Я показал запись в таблице символов для индекса 5 выше, но не смог понять, как это говорит нам, что это для .rodata.