Написав загрузчик для ядра Windows (и пространства пользователей Windows) раньше: он работает одинаково. по сути, все двоичные файлы имеют то, что называется IAT (например, http://msdn.microsoft.com/en-us/magazine/cc301808.aspx это вечная классическая статья). Когда загрузчик выделил память для DLL, он скопирует туда DLL и прочитает IAT DLL для всех символов, которые ему нужны (по имени), а затем ищет имена в разделе экспорта основной DLL Windows (например, , kernel32.dll), и заполните его прочитанным адресом. все необходимые файлы должны быть прочитаны и заполнены адресом, прежде чем DLL сможет продолжить выполнение.
Linux тоже работает одинаково ..... будь то пользовательское пространство или ядро. Структура ELF называет это таблицей перемещения.
http://www.bravegnu.org/gnu-eprog/linker.html
Надеюсь, что поможет :-) (детали похожи на x86 arch).