complementos sobre .bss
This commit is contained in:
parent
9780039c11
commit
48683c6037
1 changed files with 61 additions and 1 deletions
|
@ -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]]
|
||||
|
|
Loading…
Add table
Reference in a new issue