При загрузке двоичного исполняемого файла в память его можно разобрать или даже просмотреть с помощью шестнадцатеричного редактора и символов из кода сборки. Они всегда начинаются с чего-то вроде 0x804 ... который я предполагаю, это раздел памяти программы. Но мой вопрос заключается в том, что поскольку эти адреса не являются, скажем, смещениями с начала программы, как двоичный файл узнает, где он будет загружен в память?