Распечатка 10.2 Модификация адресов, выполняемая загрузчиком |
Предыдущая Содержание Следующая |
Распечатка 10.2
/* Проверяем GOT и делаем модификацию адресов в GOT */
if (flags & FLAT_FLAG_GOTPIC) { for (rp = (unsigned long *)datapos; *rp != 0xffffffff; rp++) { unsigned long addr; if (*rp) { addr = calc_reloc(*rp, libinfo, id, 0); if (addr == RELOC_FAILED) return -ENOEXEC; *rp = addr; } } }
/* Пробегаем по записям данных переадресации и также их модифицируем */
for (i=0; i < relocs; i++) { unsigned long addr, relval;
/* Получаем адрес указателя для перерасчёта (конечно, * этот адрес сначала должен быть перемещён). */ relval = ntohl(reloc[i]); addr = flat_get_relocate_addr(relval); rp = (unsigned long *) calc_reloc(addr, libinfo, id, 1);
… …
/* Получаем значение указателя. */ addr = flat_get_addr_from_rp(rp, relval, flags); if (addr != 0) { /* * Выполняем перерасчёт адреса. PIC уже перемещён * в раздел данных в нужном порядке */ if ((flags & FLAT_FLAG_GOTPIC) == 0) addr = ntohl(addr);
addr = calc_reloc(addr, libinfo, id, 0);
… …
/* Записываем перерасчитанный указатель обратно. */ flat_put_addr_at_rp(rp, addr, relval); }
|
Предыдущая Содержание Следующая |