Распечатка 10.2 Модификация адресов, выполняемая загрузчиком

Предыдущая  Содержание  Следующая V*D*V

Распечатка 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);

}

 

Предыдущая  Содержание  Следующая