diff --git a/curso/aula-03.org b/curso/aula-03.org index 7f11bd6..8712109 100644 --- a/curso/aula-03.org +++ b/curso/aula-03.org @@ -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 : "Eu sou imutável!\n" +(gdb) x /1gx &contador +0x403014 : 0x0000000000000000 +(gdb) x /32bx &buffer +0x40301c : 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 =/=. +- 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]]