Способ загрузки ELF-программ (и отображение памяти в целом из файлов) осуществляется на основе страниц. Таким образом, используемые адреса, смещения в файлах и размер должны быть кратны размеру страницы.
Однако загрузчик программы достаточно умен, чтобы иметь дело с разделами, которые не начинаются или не заканчиваются точно на границе страницы, округляя их до границы страницы, отображая больше, чем требуется. Поэтому некоторые дополнительные данные будут загружены из файла для заполнения страницы, но к ним не следует обращаться, чтобы это не имело значения.
В вашем примере сегмент кода загружается по адресу 0x08048000 со смещением 0x0 с размером 0x448. Адрес и смещение выровнены, поэтому нужно просто округлить размер до полной страницы. Сегмент данных загружается в 0x08049448 со смещением 0x448. Они не выровнены, но совместимы - загрузчик округляет до кратной страницы (0x08049000 и 0x000) и отображает на этой странице. Обратите внимание, что в результате получается та же страница в файле, что и в сегменте кода, поэтому страница загружается по двум разным адресам: один только для чтения, а другой для чтения-записи-без общего доступа. Таким образом, код и данные в конечном итоге становятся видимыми в двух местах в образе процесса, но это неважно - код заканчивается rx на 0x8048000..0x8048447, а данные заканчиваются на rw- на 0x8049448..0x804954b, что все это вопросы.