Использование
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, кажется ненужной тратой.
Намеренно, мой Приложение полностью автономно (stati c linkage) и взаимодействует с ОС исключительно через SYSCALL . Код работает, как и ожидалось, и я даже удалил содержимое с 0x600000 -> 0x60030f без негативных последствий, но мне все еще интересно, почему это происходит.