Hubungan antara cc1 dan gcc?

23

Saya mencoba menginstal Ruby di direktori home saya di server Linux (tanpa akses root), yang tentu saja memerlukan penggunaan gcc. Hal terdekat yang dapat saya temukan adalah direktori dengan nama itu yang (jika Anda cukup dalam) berisi cc1:

>: find / -iname gcc 2> /dev/null
/usr/libexec/gcc


>: tree -if /usr/libexec/gcc
/usr/libexec/gcc
/usr/libexec/gcc/x86_64-redhat-linux
/usr/libexec/gcc/x86_64-redhat-linux/4.1.1
/usr/libexec/gcc/x86_64-redhat-linux/4.1.1/cc1
/usr/libexec/gcc/x86_64-redhat-linux/4.1.2 -> 4.1.1

Fakta bahwa pengalihan CC1 ke GCC di Wikipedia tampaknya menyiratkan sesuatu yang dekat dengan identitas, namun tidak ada penyebutan lain tentang CC1 di halaman GCC selain catatan tentang pengalihan, dan Googling belum memberi saya sesuatu yang berguna, dan upaya saya untuk menggunakan cc1di tempat gcctelah gagal.

Apa sebenarnya hubungan di antara mereka? Dan apakah itu memberi saya harapan untuk mengkompilasi Ruby di mesin ini?

iconoclast
sumber

Jawaban:

28

GCC memiliki sejumlah fase untuk kompilasi, dan menggunakan perintah internal yang berbeda untuk melakukan setiap fase. C khususnya pertama-tama diolah dengan cpp, kemudian dikompilasi menjadi perakitan, dirakit ke dalam bahasa mesin, dan kemudian dihubungkan bersama.

cc1 adalah perintah internal yang mengambil file bahasa C preprocessed dan mengubahnya menjadi assembly. Itu bagian aktual yang mengkompilasi C. Untuk C ++, ada cc1plus, dan perintah internal lainnya untuk bahasa yang berbeda.

Ada buku di Wikibooks yang menjelaskan proses dengan gambar .

Sayangnya, cc1 adalah perintah internal dan hanya satu bagian dari instalasi, dan jika hanya itu yang Anda miliki, Anda tidak akan dapat mengkompilasi.

Alan Shutko
sumber
2
Istilah yang biasa adalah "ujung depan".
Keith Thompson
1
Apakah Anda yakin ini membutuhkan file C yang sudah diproses? Saya tampaknya bisa cc1file dengan #includedan #definearahan
extremeaxe5
10

gccadalah nama suite cchanya kompiler C dari suite ini.

kata ccitu juga nama generik untuk setiap c compiler yang diberikan di bawah sistem unix, misalnya tidak jarang menemukan variabel lingkungan yang disebut CCdalam skrip bangunan yang diberikan atau mengkonfigurasi skrip, dan jika Anda ingin menjadi bertele-tele, variabel ini biasanya menunjuk ke ac kompiler yang tidak selalu melakukan penautan objek yang dikompilasi, itu biasanya digunakan untuk merujuk ke kompiler yang "hanya" dikompilasi. ccfrom gccis, bagaimanapun, dapat menghasilkan executable yang sudah selesai sehingga dapat melakukan langkah terakhir ini dengan linkernya juga.

kata cc1yang sering kali digunakan "secara internal" atau ketika membaca dokumen GNU ( contoh ), kata ini juga digunakan untuk menamai pustaka terkait gcc berdasarkan bahasa atau kompiler yang dimiliki (dalam hal ini cc1 = milik c compiler).

Infact jika Anda bertanya gccapa arti kata itucc1

gcc -print-prog-name=cc1

seharusnya menjawab dengan path untuk pustaka untuk kompiler cc, jadi Anda mencoba untuk mengeksekusi sesuatu yang merupakan pustaka dan bukan dieksekusi nyata.

jauh lebih mudah untuk mengingat CC sebagai c compiler dan menyederhanakan segalanya, melewati cc1 ini, Anda tidak perlu tahu bagaimana hal-hal bekerja secara internal kecuali jika Anda ingin memulai perjalanan panjang.

pengguna2384250
sumber
4

Seperti yang disebutkan lainnya, gccmenggunakan cc1.

Cara yang tepat di mana cc1dan sub-program lainnya seperti cppdan lddipanggil dilakukan ditentukan oleh format file spesifikasi .

File spec saat ini dapat dilihat dengan:

gcc -dumpspecs

Bagian yang relevan tampaknya adalah:

*cc1_options:
%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}} %{!iplugindir*:%{fplugin*:%:find-plugindir()}} %1 %{!Q:-quiet} %{!dumpbase:-dumpbase %B} %{d*} %{m*} %{aux-info*} %{fcompare-debug-second:%:compare-debug-auxbase-opt(%b)}  %{!fcompare-debug-second:%{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}}%{!c:%{!S:-auxbase %b}}  %{g*} %{O*} %{W*&pedantic*} %{w} %{std*&ansi&trigraphs} %{v:-version} %{pg:-p} %{p} %{f*} %{undef} %{Qn:-fno-ident} %{Qy:} %{-help:--help} %{-target-help:--target-help} %{-version:--version} %{-help=*:--help=%*} %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}} %{fsyntax-only:-o %j} %{-param*} %{coverage:-fprofile-arcs -ftest-coverage}

Dan Anda dapat menggunakan file spesifikasi Anda sendiri dengan:

gcc -specs=<specs-file>

Tentu saja, opsi baris perintah yang diteruskan ke GCC secara tidak langsung mengubah bagaimana sub-proses dipanggil. Tetapi memanipulasi file spek memberi Anda fleksibilitas yang lebih besar dan memungkinkan Anda melakukan hal-hal yang tidak bisa dilakukan opsi command line, misalnya /programming/7493620/inhibit-default-library-paths-with-gcc

Anda dapat mengamati apa yang sedang dijalankan dengan mudah:

gcc -v hello_world.c |& grep cc1

Output sampel:

/usr/lib/gcc/x86_64-linux-gnu/4.8/cc1 -quiet -v -imultiarch x86_64-linux-gnu hello_world.c -quiet -dumpbase hello_world.c -mtune=generic -march=x86-64 -auxbase hello_world -version -fstack-protector -Wformat -Wformat-security -o /tmp/ccvcVNAX.s
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
sumber
1

cc1 adalah preprocessor dan kompiler, yang inputnya adalah kode sumber C dan output adalah kode assembly.

Anda dapat melihat cc1adalah salah satu perintah yang dipanggil (yang pertama, sebenarnya) dengan mengeluarkan (sintaks tergantung pada versi):
gcc-8 -v SOMESOURCE.c

flow2k
sumber