Uso de comandos básicos do GCC
O GCC é um conjunto de compiladores da linguagem de programação desenvolvidos pelo projeto GNU, que podem lidar com a linguagem
C , C ++, Fortran, Pascal, Objective-C, Java e assim por diante. O GCC geralmente é o compilador preferido para software de plataforma cruzada. gcc é o nome do driver compilado no pacote GCC.
Se o computador for um sistema x86-64 bits, para compilar no conjunto de instruções IA-32,
execute o seguinte comando primeiro:
sudo apt-get install build-essential module-assistant
sudo apt-get install gcc-multilib g++-multilib
A seguir, demonstraremos esse processo produzindo um programa simples de linguagem C hello.c, como hello world.
#include <stdio.h>
int main()
{
printf("Hello,world\n");
return 0;
}
O arquivo de origem hello.c passa por quatro processos: pré-processamento, compilação, montagem e vinculação e, finalmente, gera um arquivo de objeto executável. O diagrama esquemático é o seguinte:
O driver do compilador gcc no Linux pode realizar cada etapa do processo acima, que será explicado abaixo:
gcc –E hello.c –o hello.i
Pré-compile o programa hello.c A pré-compilação consiste em processar os comandos cujo programa de origem inicia com o caractere # .Para isso, o include
conteúdo do arquivo .h é incorporado ao arquivo do programa de origem. Para arquivos de texto, use .i como a extensão, conforme mostrado na figura a seguir:
gcc –S hello.i –o hello.s
Compile hello.i para gerar um programa de origem em linguagem assembly com .s como extensão.O arquivo compilado ainda é um arquivo de texto.
gcc –c hello.s –o hello.o
Monte o arquivo hello.s para gerar um arquivo de destino realocável com .o como extensão.O arquivo montado é um arquivo binário. O conteúdo é 0, 1 significa instruções da máquina, dados e outras informações.
gcc hello.o –o hello
Este comando vincula vários arquivos de objeto realocáveis e funções de biblioteca padrão em um arquivo executável. Neste exemplo, o link vincula o arquivo hello.o ao módulo de destino realocável printf.o, onde a função de biblioteca padrão printf reside para gerar o arquivo de destino executável hello.
Execute a instrução de entrada olá executável do arquivo
./hello
A descrição acima é uma conversão passo a passo do programa de linguagem C em um arquivo de destino executável. Você também pode usar o comando
gcc hello.c –o hello
Compile hello.c diretamente no arquivo de objeto executável hello.
Ao compilar o programa C com o comando gcc, várias opções são adicionadas, como o seguinte comando:
gcc -o0 -m32 -g hello.c -o hello
Por exemplo, se você adicionar -O0, a torre indica o nível de otimização usado durante a compilação, 0 significa que nenhuma otimização é usada para compilação e a opção -m32 significa que ela é compilada nas instruções de x86-32 bits. Se o computador for um processador de 64 bits, sem essa opção, ele será compilado em um conjunto de instruções x86-64. -g significa trazer informações de depuração (a depuração em uma única etapa deve ser adicionada).
Uso do comando objdump
O arquivo de destino é composto por 01 sequência de instruções da máquina, dados e outras informações.Não pode ser aberto com um editor de texto.Como posso ver o conteúdo do arquivo de destino? A resposta é que você pode usar a ferramenta objdump para desmontar arquivos de objetos binários, desmontar arquivos de objetos realocáveis e arquivos de objetos executáveis.
Usamos um programa c como exemplo, o nome do programa gdbtest.c.
#include "stdio.h"
int main()
{
int x=3,y=5,z;
z=x+y;
printf("z=%d\n",z);
return 0;
}
O comando gcc pode ser compilado no arquivo de objeto realocável de gdbtest.o e no arquivo de objeto executável de gdbtest, respectivamente.
gcc -E -g -m32 gdbtest.c -o gdbtest.i
gcc -S -g -m32 gdbtest.i -o gdbtest.s
gcc -c -g -m32 gdbtest.s -o gdbtest.o
gcc -o0 -m32 -g gdbtest.c -o gdbtest
É recomendável usar a opção -S no comando objdump e usá-la junto com a opção -g no comando gcc.
Use o seguinte comando:
objdump –S gdbtest.o>gdbtesto.txt
objdump –S gdbtest>gdbtest.txt
Para desmontar esses dois arquivos, -S significa adicionar código-fonte ao conteúdo desmontado para facilitar o entendimento da correspondência entre o programa de origem da linguagem C e as instruções no nível da máquina IA-32. O símbolo '>' significa salvar o conteúdo desmontado no arquivo, aqui ele é salvo como um arquivo de texto, para impedir que o conteúdo seja enviado para a tela demais para leitura.
O conteúdo do arquivo de desmontagem do arquivo de objeto relocável do gdbtest.o é o seguinte:
O conteúdo desmontado do arquivo de objeto executável:
Uma diferença importante entre arquivos de objetos realocáveis e arquivos de objetos executáveis é se o endereço da instrução começa no endereço 0. O arquivo de destino realocável é um módulo independente que conclui uma subtarefa; portanto, o endereço de cada módulo começa no endereço 0, mas as instruções e os dados no arquivo de destino executável têm um determinado endereço, que é A alocação de mapeamento de endereço de memória fixa também é o endereço que pode ser visto durante a etapa de depuração. Não é um endereço físico de memória, mas um endereço virtual.
Uso de ferramentas de depuração GDB
Iniciar ferramenta de depuração do GDB
Inicie a ferramenta de depuração do GDB e carregue o arquivo executável depurado.
Comando | Efeito | |
---|---|---|
1 | gdb [nome do arquivo executável] | Inicie a ferramenta de depuração do GDB e carregue o arquivo executável |
2 | 1.gdb 2. arquivo [nome do arquivo executável] |
Inicie a ferramenta de depuração do GDB para carregar o arquivo executável |
Definir um ponto de interrupção
Defina um ponto de interrupção para interromper o programa no ponto de interrupção, o que é conveniente para verificar o status do programa.
Comando | Efeito |
---|---|
quebrar principal | Defina um ponto de interrupção na entrada da função principal |
break gdbtest.c: 3 | Defina um ponto de interrupção na linha 3 do programa de origem di sa gdbtest.c |
Iniciar o programa
Inicie e execute o programa já carregado, o programa será interrompido no primeiro ponto de interrupção das configurações de execução.
Comando | Efeito |
---|---|
corre | Inicie o programa e o programa será interrompido no ponto de interrupção |
Exibir o status atual do programa enquanto está em execução
-
A posição atual do ponto
de interrupção do programa Significado: reflete quais instruções o programa executou e qual instrução executar em seguida.
eip register: salve o endereço da próxima instrução a ser executada.e Exibir o conteúdo de todos os registros e eip Exibir apenas o conteúdo do registro eip -
Conteúdo geral do registro: ir eax ebx ecx edx (ou ir)
-
Conteúdo da unidade de memória: x / 8xb Oxffd2bc
O comando x é usado para visualizar o conteúdo da unidade de armazenamento, seguido por algumas opções de parâmetros.
Os dados indicam o número de unidades de dados a serem exibidas.
x representa o conteúdo da unidade de armazenamento, em formato hexadecimal.
b indica a largura da unidade de armazenamento a ser exibida e os
dados a seguir indicam o endereço inicial da unidade de armazenamento a ser exibida pela exibição de bytes (w: exibição por 4 bytes) .O conteúdo de x / 8xb Oxffd2bc significa que, a partir da unidade de endereço de Oxffd2bc, o conteúdo da unidade de armazenamento de 8 bytes é exibido e expresso em hexadecimal.
-
Exibir o status atual do tempo de execução
Nota: IA-32 usa a pilha para suportar chamadas de procedimentos aninhadas, parâmetros de entrada de procedimento, endereços de retorno, valores de registro salvos, variáveis locais não estáticas no procedimento chamado etc. serão salvos na pilha.
Informações do quadro da
pilha: intervalo atual do quadro da pilha: ir esp ebp (ponteiro superior da pilha esp e ponteiro inferior da pilha ebp)Bytes do quadro da pilha atual: y = R [ebp] -R [esp] +4 (Não é um comando, mas um método de cálculo)
Exiba o conteúdo atual do quadro da pilha:
x/yxb $esp x/zxw $esp //z=y/4
Continue executando a próxima instrução ou instrução
Comando | Efeito |
---|---|
e | Execute uma instrução de máquina |
s | Executar uma instrução c |
Depuração de saída
Comando | Efeito |
---|---|
Sair | Sair do processo de depuração do GDB |
O conteúdo que compartilhei com você desta vez está aqui. Acho que é uma boa ideia apoiar o editor, com certeza é a sua motivação. Além disso, se você quiser aprender mais sobre o conhecimento e as habilidades profissionais do computador, apresente meu blog pessoal Beiluo.Além disso, sapatos infantis que precisam de vários materiais, você pode seguir minha conta pública do WeChat Beiluo , modelo PPT gratuito, vários materiais esperando por você Venha para liderar.