Notas básicas de estudo para sistemas de computador (1) - o uso de comandos básicos de GCC, objdump, GBD

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 includeconteú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

  1. 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
  2. Conteúdo geral do registro: ir eax ebx ecx edx (ou ir)

  3. 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.

  4. 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.
Beilu

Acho que você gosta

Origin www.cnblogs.com/xiangjunhong/p/12749675.html
Recomendado
Clasificación