complementos sobre .bss

This commit is contained in:
Blau Araujo 2025-05-19 11:36:00 -03:00
parent 9780039c11
commit 48683c6037

View file

@ -387,7 +387,6 @@ Ou com o =xxd=, utilizando as opções =-s= (/skip/) e =-l= (/length/):
** Inspeção da seção .data
#+begin_src asm
section .data
contador dq 0 ; preenche 8 bytes (qword) com 0x00 em 'contador'
#+end_src
@ -547,6 +546,66 @@ Verificando a alteração do valor no endereço =contador=:
$2 = (long *) 0x1
#+end_example
** Inspecionando a seção .bss
#+begin_src asm
section .bss
buffer resb 32 ; reserva 32 bytes no endereço 'buffer
#+end_src
Neste trecho, nós utilizamos a diretiva =resb= para /reservar/ 32 bytes no
endereço representado pelo rótulo =buffer=. Mas, como vimos, a seção =.bss= é
referenciada nas tabelas de seções e do programa, mas não ocupa espaço no
arquivo. Portanto, não é possível visualizar seu conteúdo se o programa
não estiver sendo executado ou com um depurador. Por isso, nós examinaremos
os dados na seção com o GDB:
#+begin_example
:~$ gdb sections
Reading symbols from sections...
(gdb)
#+end_example
Desta vez, vamos utilizar o ponto de entrada do programa como ponto de
parada e vamos executá-lo:
#+begin_example
(gdb) break _start
Breakpoint 1 at 0x401000: file sections.asm, line 20.
(gdb) run
Starting program: /home/blau/git/pbn/curso/exemplos/03/sections
Breakpoint 1, _start () at sections.asm:20
20 mov rax, 1 ; syscall: write
#+end_example
Neste ponto, todas as seções de dados estão carregadas e nós podemos
examiná-las (comando =x=):
#+begin_example
(gdb) x /1s &msg
0x402000 <msg>: "Eu sou imutável!\n"
(gdb) x /1gx &contador
0x403014 <contador>: 0x0000000000000000
(gdb) x /32bx &buffer
0x40301c <buffer>: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x403024: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x40302c: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x403034: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
#+end_example
Como podemos ver, a diretiva =resb= preencheu com zeros os 32 bytes reservados
na seção =.bss=.
*Notas sobre o comando =x=, do GDB:*
- Examina os dados em um endereço de memória.
- O endereço pode ser passado na forma =&RÓTULO= (endereço do rótulo).
- A formatação dos dados é feita com =/<QTD><TIPO><BASE>=.
- O =TIPO= pode ser bytes (=b=), 2 bytes (=h=, de /half-word/), 4 bytes (=w=, /word/),
8 bytes (=g=, de /giant word/), string (=s=) ou caracteres (=c=).
- A =BASE= =x= refere-se à exibição de números em hexadecimal.
* Exercícios propostos
1. Crie um exemplo em C onde seja possível observar as seções =.text=, =.rodata=,
@ -585,3 +644,4 @@ $ echo $?
- =man 5 elf=
- [[https://wiki.osdev.org/ELF][OS Dev: ELF]]
- https://refspecs.linuxfoundation.org/elf/elf.pdf
- [[https://bolha.dev/blau_araujo/gdb-pratico][Anotações do curso de introdução ao GDB]]