Каким образом функции из dll получают управление?
===================================================

 Мне казалось что динамические библиотеки работают по принципу "отображения файла в память", то есть процесс запрашивал бы дополнительную оперативную память, в которую копируется содержимое файла dll. А сами функции в dll при этом хранились бы как обычные. Как некие адреса на которые передается управление и начинается выполнение машинного кода функции.  

  

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

 При динамической линковке код не "сваливается" в один сегмент, как это обычно происходит при статической линковке, в динамической библиотеке есть сегмент кода, у каждой библиотеки он свой. Каждая динамическая библиотека отображается в определенную область адресного пространства процесса, необязательно последовательную. Те страницы адресного пространства, куда отображается кодовый сегмент библиотеки помечаются как исполняемые. Функция получает управление в момент вызова, адрес по которому функция расположена определяется вызывающей функцией либо через таблицу импорта, которая заполняется в процессе динамической линковки, либо через непосредственный вызов GetProcAddr.