Saya bertanya-tanya bagaimana cara menggunakan GCC pada file sumber C saya untuk membuang versi mnemonik dari kode mesin sehingga saya bisa melihat kode apa yang sedang dikompilasi. Anda dapat melakukan ini dengan Java tetapi saya belum dapat menemukan cara dengan GCC.
Saya mencoba untuk menulis ulang metode C dalam perakitan dan melihat bagaimana GCC melakukannya akan sangat membantu.
Jawaban:
Jika Anda mengompilasi dengan simbol debug, Anda dapat menggunakan
objdump
untuk menghasilkan pembongkaran yang lebih mudah dibaca.objdump -drwC -Mintel
itu bagus:-r
menunjukkan nama simbol pada relokasi (sehingga Anda akan melihatputs
dalamcall
instruksi di bawah ini)-R
menunjukkan relokasi / nama simbol yang menghubungkan dinamis (berguna untuk perpustakaan bersama)-C
demangles nama simbol C ++-w
adalah mode "lebar": ini tidak membungkus baris-kode byte mesin-Mintel
: gunakan GAS / binutils seperti MASM.intel_syntax noprefix
sintaks alih-alih AT&T-S
: baris sumber interleave dengan pembongkaran.Anda bisa memasukkan sesuatu seperti
alias disas="objdump -drwCS -Mintel"
di~/.bashrc
Contoh:
sumber
-Wa,-adhln -g to gcc
. Ini mengasumsikan bahwa assembler adalah gas dan ini mungkin tidak selalu demikian.-Mintel
.Jika kamu memberi GCC bendera
-fverbose-asm
, itu akansumber
objdump
-objdump -drwCS -Mintel
, jadi bagaimana saya bisa menggunakan sesuatu sepertiverbose
denganobjdump
? Sehingga saya dapat memiliki komentar dalam kode asm, seperti halnya-fverbose-asm
dalam gcc?-fverbose-asm
ditambahkan adalah dalam bentuk komentar dalam sintaks asm dari output, bukan arahan yang akan memasukkan apa pun tambahan dalam.o
file. Semuanya dibuang pada waktu berkumpul. Lihatlah output asm compiler alih - alih disassembly, misalnya pada godbolt.org di mana Anda dapat dengan mudah mencocokkannya dengan baris sumber melalui mouseover dan penyorotan warna dari garis sumber / asm yang sesuai. Bagaimana cara menghapus "noise" dari output rakitan GCC / clang?Ripped langsung dari http://www.delorie.com/djgpp/v2faq/faq8_20.html (tetapi menghapus yang salah
-c
)sumber
gcc -march=native -O3 -save-temps
. Anda masih dapat menggunakan-c
untuk berhenti pada pembuatan objek-file tanpa mencoba menautkan, atau apa pun.-save-temps
menarik karena kesedihan dalam satu pergi kode yang dihasilkan kode yang tepat, sedangkan opsi lain memanggil kompiler dengan-S
cara kompilasi dua kali, dan mungkin dengan opsi yang berbeda. Tapi-save-temps
kesedihan semua dalam direktori saat ini, yang agak berantakan. Sepertinya itu lebih dimaksudkan sebagai opsi debug untuk GCC daripada alat untuk memeriksa kode Anda.Menggunakan
-S
peralihan ke GCC pada sistem berbasis x86 menghasilkan dump sintaks AT&T, secara default, yang dapat ditentukan dengan-masm=att
sakelar, seperti:Sedangkan jika Anda ingin menghasilkan dump dalam sintaks Intel, Anda bisa menggunakan
-masm=intel
sakelar, seperti:(Keduanya menghasilkan dumps
code.c
ke berbagai sintaks mereka, ke dalam filecode.s
masing-masing )Untuk menghasilkan efek yang serupa dengan objdump, Anda ingin menggunakan
--disassembler-options=
intel
/att
switch, contoh (dengan dump kode untuk menggambarkan perbedaan dalam sintaks):dan
sumber
gcc -S -masm=intel test.c
tidak persis pekerjaan untuk saya, saya punya beberapa blasteran dari Intel dan AT & T sintaks seperti ini:mov %rax, QWORD PTR -24[%rbp]
, bukannya ini:movq -24(%rbp), %rax
..o
dan file ASM, yaitu via-Wa,-ahls -o yourfile.o yourfile.cpp>yourfile.asm
-M
opsi, itu sama--disassembler-options
tetapi jauh lebih pendek, misalnyaobjdump -d -M intel a.out | less -N
godbolt adalah alat yang sangat berguna, daftar mereka hanya memiliki kompiler C ++ tetapi Anda dapat menggunakan
-x c
flag untuk membuatnya memperlakukan kode sebagai C. Ini kemudian akan menghasilkan daftar perakitan untuk kode Anda berdampingan dan Anda dapat menggunakanColourise
opsi untuk menghasilkan batang berwarna untuk secara visual menunjukkan kode sumber mana yang dipetakan ke rakitan yang dihasilkan. Misalnya kode berikut:menggunakan baris perintah berikut:
dan
Colourise
akan menghasilkan yang berikut:sumber
-masm=intel
tetapi bagaimana dengan yang lain?-x c
Apakah Anda mencoba
gcc -S -fverbose-asm -O source.c
kemudian melihat ke dalamsource.s
file assembler yang dihasilkan ?Kode assembler yang dihasilkan masuk ke
source.s
(Anda bisa menimpanya dengan-o
assembler-nama file ); yang-fverbose-asm
pilihan meminta compiler untuk memancarkan beberapa komentar assembler "menjelaskan" kode assembler yang dihasilkan. The-O
pilihan meminta compiler untuk mengoptimalkan sedikit (bisa mengoptimalkan lebih dengan-O2
atau-O3
).Jika Anda ingin memahami apa yang
gcc
sedang dilakukan coba lewati-fdump-tree-all
tapi hati-hati: Anda akan mendapatkan ratusan file dump.BTW, GCC dapat dikembangkan melalui plugin atau dengan MELT (bahasa khusus domain tingkat tinggi untuk memperpanjang GCC; yang saya tinggalkan pada tahun 2017)
sumber
source.s
, karena banyak orang akan mengharapkan hasil cetakan di konsol.-S -o-
dumps ke stdout.-masm=intel
sangat membantu jika Anda ingin menggunakan sintaks NASM / YASM. (Tapi itu menggunakanqword ptr [mem]
, bukan hanyaqword
, jadi lebih seperti Intel / MASM daripada NASM / YASM). gcc.godbolt.org melakukan pekerjaan yang bagus untuk merapikan tempat sampah: secara opsional menghapus garis komentar saja, label yang tidak digunakan, dan arahan assembler.-Og
itu bahkan lebih baik daripada-O1
. Ini berarti "optimalkan untuk debugging" dan buat asm tanpa terlalu banyak optimasi rumit / sulit diikuti yang melakukan semua yang dikatakan sumber. Sudah tersedia sejak gcc4.8, tapi dentang 3.7 masih belum memilikinya. IDK jika mereka memutuskan menentangnya atau apa.Anda dapat menggunakan gdb untuk objdump seperti ini.
Kutipan ini diambil dari http://sources.redhat.com/gdb/current/onlinedocs/gdb_9.html#SEC64
Berikut ini adalah contoh yang menunjukkan sumber campuran + perakitan untuk Intel x86:
sumber
set disassembly-flavor intel
perintah.Gunakan -S (note: capital S) untuk beralih ke GCC, dan itu akan memancarkan kode assembly ke file dengan ekstensi .s. Misalnya, perintah berikut:
gcc -O2 -S -c foo.c
sumber
Saya belum memberikan suntikan ke gcc, tetapi dalam kasus g ++. Perintah di bawah ini berfungsi untuk saya. -g untuk build debug dan -Wa, -adhln diteruskan ke assembler untuk dicantumkan dengan kode sumber
g ++ -g -Wa, -adhln src.cpp
sumber
gunakan -Wa, -adhln sebagai opsi pada gcc atau g ++ untuk menghasilkan output listing ke stdout.
-Wa, ... adalah untuk opsi baris perintah untuk bagian assembler (jalankan di gcc / g ++ setelah kompilasi C / ++). Itu dipanggil sebagai internal (as.exe di Windows). Lihat
> as --help
sebagai baris perintah untuk melihat lebih banyak bantuan untuk alat assembler di dalam gcc
sumber