Почему LD отображает разделы таким образом для ELF64 в Ubuntu 18.04? - PullRequest
1 голос
/ 15 апреля 2020

Использование

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

1 Ответ

1 голос
/ 15 апреля 2020

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

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

.data будет be @ 0x600000

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...