Здравствуйте, у меня вопрос по разделам BSS и DATA

Я пытаюсь изучить NASM... Я попытался сделать базовую программу с 1 инициализированными и 1 неинициализированными данными {буфер -> неинициализированный, буфер2 -> инициализированный}:

SECTION .data
    buffer2 dw 0x4140
SECTION .bss
    buffer resb 64
SECTION .text
    _start:
        mov byte [buffer], 1
        mov byte [buffer2], 2

потом собрал с nasm -f elf64 test.S, получил test.o файл, потом пытался искать адреса с которых начинаются обе секции, но они указывают на один и тот же адрес.. понятия не имею почему.. ds:00


test.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <_start>:
   0:   c6 04 25 00 00 00 00    mov    BYTE PTR ds:0x0,0x1
   7:   01
   8:   c6 04 25 00 00 00 00    mov    BYTE PTR ds:0x0,0x2
   f:   02

Поэтому я попытался найти объяснение, и единственное решение, которое я нашел, было в выводе readelf -S test.o:

There are 8 section headers, starting at offset 0x40:

Section Headers:
  [Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
  [ 0]                   NULL             0000000000000000  00000000
       0000000000000000  0000000000000000           0     0     0
  [ 1] .data             PROGBITS         0000000000000000  00000240
       0000000000000002  0000000000000000  WA       0     0     4
  [ 2] .bss              NOBITS           0000000000000000  00000250
       0000000000000040  0000000000000000  WA       0     0     4
  [ 3] .text             PROGBITS         0000000000000000  00000250
       0000000000000010  0000000000000000  AX       0     0     16
  [ 4] .shstrtab         STRTAB           0000000000000000  00000260
       0000000000000037  0000000000000000           0     0     1
  [ 5] .symtab           SYMTAB           0000000000000000  000002a0
       00000000000000c0  0000000000000018           6     8     8
  [ 6] .strtab           STRTAB           0000000000000000  00000360
       000000000000001e  0000000000000000           0     0     1
  [ 7] .rela.text        RELA             0000000000000000  00000380
       0000000000000030  0000000000000018           5     3     8

BSS и DATA имеют разный размер.. но я так и не понял, почему в objdump он передает на один и тот же адрес...

Спасибо!


person Como Stas    schedule 19.01.2021    source источник
comment
test.o – это объектный файл. Истинные адреса buffer и buffer2 пока неизвестны и будут заполнены при линковке. Свяжите объект с полной программой и разберите ее, чтобы увидеть истинные адреса.   -  person fuz    schedule 19.01.2021
comment
Да! Спасибо!   -  person Como Stas    schedule 19.01.2021
comment
Я связал объектный файл и получил mov BYTE PTR ds:0x402000,0x2 и mov BYTE PTR ds:0x402004,0x1   -  person Como Stas    schedule 19.01.2021
comment
Если вам интересно, BSS расшифровывается как Block Started by Symbol. Некоторые ассемблеры для других машин (например, мэйнфреймы IBM) также имеют BES, что означает блок, заканчивающийся символом, символ, который может указывать на вершину стека. Таким образом, в разделе BES, эквивалентном mystack resb 256, будет установлено mystack в конец блока из 256 байтов, адрес | смещение на следующий байт после блока из 256 байт.   -  person rcgldr    schedule 19.01.2021