Eu queria saber como usar o GCC no meu arquivo de origem C para despejar uma versão mnemônica do código da máquina para que eu pudesse ver em que meu código estava sendo compilado. Você pode fazer isso com Java, mas não consegui encontrar uma maneira com o GCC.
Estou tentando reescrever um método C em assembly e ver como o GCC faz isso seria uma grande ajuda.
Respostas:
Se você compilar com símbolos de depuração, poderá usar
objdump
para produzir uma desmontagem mais legível.objdump -drwC -Mintel
é legal:-r
mostra os nomes dos símbolos nas realocações (você veráputs
nacall
instrução abaixo)-R
mostra realocações de vinculação dinâmica / nomes de símbolos (útil em bibliotecas compartilhadas)-C
desmarca os nomes dos símbolos C ++-w
é o modo "amplo": ele não quebra os bytes de código de máquina-Mintel
: use a.intel_syntax noprefix
sintaxe semelhante a GAS / binutils MASM em vez da AT&T-S
: intercalar linhas de origem com desmontagem.Você poderia colocar algo como
alias disas="objdump -drwCS -Mintel"
no seu~/.bashrc
Exemplo:
fonte
-Wa,-adhln -g to gcc
. Isso pressupõe que o montador é gás e isso nem sempre pode ser o caso.-Mintel
.Se você der a bandeira ao GCC
-fverbose-asm
, ela seráfonte
objdump
-objdump -drwCS -Mintel
, então como eu posso usar algo comoverbose
comobjdump
? Para que eu possa ter comentários no código asm, assim como-fverbose-asm
no gcc?-fverbose-asm
adicionadas estão na forma de comentários na sintaxe asm da saída, não nas diretivas que colocarão algo extra no.o
arquivo. Tudo é descartado no momento da montagem. Observe a saída do compilador asm em vez da desmontagem, por exemplo, em godbolt.org, onde você pode facilmente combiná-lo com a linha de origem via mouseover e realce de cores das linhas de origem / asm correspondentes. Como remover "ruído" da saída do conjunto GCC / clang?Extraído diretamente de http://www.delorie.com/djgpp/v2faq/faq8_20.html (mas removendo erros
-c
)fonte
gcc -march=native -O3 -save-temps
. Você ainda pode usar-c
para parar na criação do arquivo de objeto sem tentar vincular, ou o que seja.-save-temps
é interessante, pois despeja de uma só vez o código exato gerado pelo código, enquanto a outra opção de chamar o compilador com-S
meios de compilar duas vezes e, possivelmente, com opções diferentes. Mas-save-temps
despeja tudo no diretório atual, o que é meio confuso. Parece que é mais uma opção de depuração para o GCC do que uma ferramenta para inspecionar seu código.Usar o
-S
switch para o GCC em sistemas baseados em x86 produz um dump da sintaxe da AT&T, por padrão, que pode ser especificada com o-masm=att
switch, da seguinte maneira:Considerando que, se você quiser produzir um dump na sintaxe da Intel, poderá usar o
-masm=intel
switch da seguinte maneira:(Ambos produzem despejos
code.c
em suas várias sintaxes, no arquivo,code.s
respectivamente)Para produzir efeitos semelhantes com o objdump, você deseja usar a opção
--disassembler-options=
intel
/att
, um exemplo (com despejos de código para ilustrar as diferenças na sintaxe):e
fonte
gcc -S -masm=intel test.c
fez não exatamente trabalho para mim, eu tenho algum cruzamento de Intel e AT & T sintaxe como esta:mov %rax, QWORD PTR -24[%rbp]
em vez disso:movq -24(%rbp), %rax
..o
arquivos e ASM, ou seja, via-Wa,-ahls -o yourfile.o yourfile.cpp>yourfile.asm
-M
opção, é o mesmo que--disassembler-options
, mas muito mais curto, por exemploobjdump -d -M intel a.out | less -N
godbolt é uma ferramenta muito útil, eles listam apenas compiladores C ++, mas você pode usar
-x c
flag para fazer com que ele trate o código como C. Ele gerará uma lista de montagem para o seu código lado a lado e você pode usar aColourise
opção para gerar barras coloridas para indicar visualmente qual código-fonte é mapeado para o assembly gerado. Por exemplo, o seguinte código:usando a seguinte linha de comando:
e
Colourise
geraria o seguinte:fonte
-masm=intel
mas e o resto?-x c
Você tentou
gcc -S -fverbose-asm -O source.c
examinar osource.s
arquivo assembler gerado ?O código do assembler gerado entra
source.s
(você pode substituí-lo pelo-o
assembler-filename ); a-fverbose-asm
opção solicita que o compilador emita alguns comentários do assembler "explicando" o código do assembler gerado. A-O
opção solicita que o compilador otimize um pouco (ele pode otimizar mais com-O2
ou-O3
).Se você quiser entender o que
gcc
está fazendo, tente passar,-fdump-tree-all
mas tenha cuidado: você receberá centenas de arquivos de despejo.BTW, o GCC é extensível através de plugins ou com MELT (uma linguagem específica de domínio de alto nível para estender o GCC; que eu abandonei em 2017)
fonte
source.s
, pois muitas pessoas esperariam uma impressão no console.-S -o-
despeja para stdout.-masm=intel
é útil se você deseja usar a sintaxe NASM / YASM. (mas usaqword ptr [mem]
, e não apenasqword
, é mais como Intel / MASM do que NASM / YASM). O gcc.godbolt.org faz um bom trabalho de organização do despejo: opcionalmente, excluindo linhas somente para comentários, rótulos não utilizados e diretivas de montagem.-Og
é ainda melhor que-O1
. Significa "otimizar para depuração" e faz o asm sem muitas otimizações difíceis / difíceis de seguir que fazem tudo o que a fonte diz. Está disponível desde o gcc4.8, mas o clang 3.7 ainda não o possui. IDK se eles decidiram contra ou o quê.Você pode usar o gdb para isso, como o objdump.
Este trecho foi retirado de http://sources.redhat.com/gdb/current/onlinedocs/gdb_9.html#SEC64
Aqui está um exemplo mostrando fonte mista + assembly para Intel x86:
fonte
set disassembly-flavor intel
comandoUse a opção -S (observação: maiúscula S) para GCC e ela emitirá o código do assembly para um arquivo com extensão .s. Por exemplo, o seguinte comando:
gcc -O2 -S -c foo.c
fonte
Eu não dei uma chance ao gcc, mas no caso do g ++. O comando abaixo funciona para mim. -g para depuração e -Wa, -adhln é passado para o assembler para listar com o código fonte
g ++ -g -Wa, -adhln src.cpp
fonte
use -Wa, -adhln como opção no gcc ou g ++ para produzir uma saída de listagem para o stdout.
-Wa, ... é para opções de linha de comando para a parte do montador (execute no gcc / g ++ após a compilação do C / ++). Invoca como internamente (as.exe no Windows). Vejo
> como --help
como linha de comando para ver mais ajuda para a ferramenta assembler dentro do gcc
fonte