С использованием
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 без каких-либо негативных последствий, но мне все еще любопытно, почему это происходит.