Я пытаюсь понять перемещения в ELF, но у меня возникли некоторые проблемы с документацией по этому вопросу, которая довольно загадочна.Например, уравнения перемещения описывают 3 параметра, S, A и P. Теперь я понял, что A - это просто добавление, которое является некоторым числом, используемым для помощи в расчете перемещения, а S - это "Значение символа, для которогоindex находится в записи перемещения " (что совпадает с именем функции, верно?), но как насчет P?Руководство описывает его как «место перемещения блока хранения», но что это вообще означает?
Я только что нашел пример, чтобы проиллюстрировать это: предположим, у нас есть 2 объектных файла, obj1.o и obj2.o .Первый ссылается на функцию foo (), которая находится внутри obj2.o .
objdump -d obj1.o выход:
Disassembly of section .text:
00000000 <func>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 ec 08 sub $0x8,%esp
6: e8 fc ff ff ff call 7 <func+0x7>
b: c9 leave
c: c3 ret
Теперь, readelf показывает, что это перемещение R_386_PC32 , уравнение которого: S + A - P .
После объединениядва файла для создания полноценного исполняемого файла, перемещены , записи перемещения, по-видимому, исправлены:
objdump -d relocated
test: file format elf32-i386
Disassembly of section .text:
080480d8 <func>:
80480d8: 55 push %ebp
80480d9: 89 e5 mov %esp,%ebp
80480db: 83 ec 08 sub $0x8,%esp
80480de: e8 05 00 00 00 call 80480e8 <foo>
80480e3: c9 leave
80480e4: c3 ret
80480e5: 90 nop
80480e6: 90 nop
80480e7: 90 nop
080480e8 <foo>:
80480e8: 55 push %ebp
80480e9: 89 e5 mov %esp,%ebp
80480eb: 5d pop %ebp
80480ec: c3 ret
Так что, похоже, компоновщик выполнил следующие вычисления: S +A - P: 0x80480e8 + 0xfffffffc - 0x80480df
Мои вопросы:
- Откуда берется значение P?
- Какой смысл иметьа добавление?