Почему таким образом отображаются разделы LD для ELF64 в Ubuntu 18.04

С использованием

GNU ld (GNU Binutils для Ubuntu) 2.30

в make-файле

App: App.o Init.o SubRtx.o
    ld -oApp SubRtx.o Init.o App.o

App.o: App.asm
    nasm -g -felf64 App.asm -oApp.o

Init.o: Init.asm
    nasm -g -felf64 Init.asm -oInit.o

SubRtx.o: SubRtx.asm
    nasm -g -felf64 SubRtx.asm -oSubRtx.o

clean:
    rm *.o App

Сегменты отображаются следующим образом.

[ 1] .text    PROGBITS 4000b0 0000b0 00023f 00  AX  0   0 16
[ 2] .rodata  PROGBITS 4002f0 0002f0 000018 00   A  0   0 16
[ 3] .data    PROGBITS 600310 000310 0000d0 00  WA  0   0 16

В моих файлах ассемблера разделы просто объявляются как section .data и section .rodata, и по замыслу App.o - единственный файл с Раздел .data, поэтому отображается @ 0x600310

Возможно, я запутался с Windows или, может быть, даже с ELF32, но я хочу, чтобы я запомнил, что по умолчанию сегменты начинаются даже с границами 4K. IE: .data будет @ 0x600000 или, по крайней мере, 0x601000, но копирование содержимого раздела TEXT в DATA прямо с 0x400000, а затем DATA, не запускающееся до 0x310, кажется ненужной тратой.

Умышленно мое приложение полностью автономно (статическая связь) и взаимодействует с ОС исключительно через SYSCALL. Код работает так, как ожидалось, и я даже удалил содержимое из 0x600000 -> 0x60030f без каких-либо негативных последствий, но мне все еще любопытно, почему это происходит.


person Shift_Left    schedule 15.04.2020    source источник


Ответы (1)


Сегменты отображаются следующим образом.

Это разделы, а не сегменты (это не одно и то же).

.data будет @ 0x600000

Невозможно mmap сегмент данных, который начинается со смещения 0x310 в исполняемом файле, в любое место в памяти, которое не равно 0x310 размеру страницы по модулю.

См. Также это или это ответ.

person Employed Russian    schedule 15.04.2020