2013-09-21 2 views
1

Я не могу полностью понять, как работает таблица переходов адресов.Таблица переходов адресов

В общем случае при компиляции файла компилятор знает, где устанавливать функции dll в памяти, но как только приложение выполняется, некоторые из адресов функций могут изменять их местоположение в памяти из-за конфликта между адресами.

Например: Компилятор загружает функцию GetModuleHandle по адресу 40000 и как-то есть другая функция GetModuleFileName, которая загружается по тому же адресу.

В зависимости от того, как функции доступны в приложении, загрузчик окон добавит вторую функцию в таблицу перехода по адресу и когда будет вызвана первая функция, загрузчик будет проходить через таблицу перехода адреса и изменить адрес функций на главный адрес для вызова, а первая функция перейдет в таблицу переходов адреса

Это так, как работает таблица переходов адреса?

+0

Трудно понять смысл вашего примера, но все, что вы хотели знать о связывании в [этой статье в журнале] (http://msdn.microsoft.com /en-us/magazine/cc301808.aspx). –

ответ

1

Таблицы филиалов - это всего лишь список инструкций goto (jump), которые могут указывать в любом месте.

В вашем примере таблица ветвей является блоком кода, который живет на уровне 40000. Смещение от этого вычисляется, а затем фактическая команда перехода переходит на 40000 + смещение.

Вот некоторые псевдокод:

# x can be one of 0 1 2 
     y = x*8;     # create offset 4 is the size of instructions 
     goto jumptable(y);   # branch into 'table' of branch instructions 
/* start of branch table */  # 
# your 40000: 
jumptable: 
     goto errorfunc1;   # x= 0 oops 
     goto func2;    # x= 1 
     goto func7;    # x= 2 
#... rest of branch table 
errorfunc1: 
    call oops; 
func2:  
    call function2; 
func7: 
    call function7;  
Смежные вопросы