GCC(the GNU Compiler Collection)
GNU 프로젝트의 오픈 소스 컴파일러 컬렉션, 리눅스 계열 플랫폼의 사실상 표준 컴파일러.
지원되는 언어 : C, C++, Objective-C, Fortran, Ada, Go 등등을 지원한다.
[root@centos7 proc]# gc
gconf-merge-tree gconftool-2 gcr-viewer
[test1@centos7 ~]$ yum list gcc //패키지 목록에 있는지 조회
Loaded plugins: fastestmirror
Determining fastest mirrors
* base: ftp.iij.ad.jp
* extras: mirror.kakao.com
* updates: ftp.iij.ad.jp
Available Packages
gcc.x86_64 4.8.5-44.el7 base
[test1@centos7 ~]$ rpm -qa gcc
[test1@centos7 ~]$ rpm -ql gcc
package gcc is not installed
[test1@centos7 ~]$ yum search gcc //패키지를 조회하는 명령어
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: ftp.iij.ad.jp
* extras: mirror.kakao.com
* updates: ftp.iij.ad.jp
=============================== N/S matched: gcc ===============================
gcc-c++.x86_64 : C++ support for GCC
gcc-gnat.x86_64 : Ada 95 support for GCC
gcc-objc.x86_64 : Objective-C support for GCC
gcc-objc++.x86_64 : Objective-C++ support for GCC
gcc-plugin-devel.x86_64 : Support for compiling GCC plugins
libgcc.x86_64 : GCC version 4.8 shared support library
libgcc.i686 : GCC version 4.8 shared support library
relaxngcc-javadoc.noarch : Javadoc for relaxngcc
compat-gcc-44.x86_64 : Compatibility GNU Compiler Collection
compat-gcc-44-c++.x86_64 : C++ support for compatibility compiler
compat-gcc-44-gfortran.x86_64 : Fortran support for compatibility compiler
gcc.x86_64 : Various compilers (C, C++, Objective-C, Java, ...)
gcc-gfortran.x86_64 : Fortran support
gcc-go.x86_64 : Go support
libgomp.x86_64 : GCC OpenMP v3.0 shared support library
libgomp.i686 : GCC OpenMP v3.0 shared support library
libmudflap.i686 : GCC mudflap shared support library
libmudflap.x86_64 : GCC mudflap shared support library
libmudflap-devel.i686 : GCC mudflap support
libmudflap-devel.x86_64 : GCC mudflap support
libquadmath.i686 : GCC __float128 shared support library
libquadmath.x86_64 : GCC __float128 shared support library
libquadmath-devel.i686 : GCC __float128 support
libquadmath-devel.x86_64 : GCC __float128 support
relaxngcc.noarch : RELAX NG Compiler Compiler
Name and summary matches only, use "search all" for everything.
[test1@centos7 ~]$ gcc -v
-bash: gcc: command not found
gcc 컴파일러 설치 전 | gcc 설치 후 |
[test1@centos7 ~]$ rpm -qa gcc [test1@centos7 ~]$ rpm -ql gcc package gcc is not installed [test1@centos7 ~]$ gcc -v -bash: gcc: command not found [root@centos7 proc]# gc //탭탭을 통해 관련 명령어가 없음을 알 수 있음 gconf-merge-tree gconftool-2 gcr-viewer |
[root@centos7 ~]# rpm -qa |grep gcc gcc-4.8.5-44.el7.x86_64 libgcc-4.8.5-44.el7.x86_64 root@centos7 ~]# rpm -ql |grep gcc rpm: no arguments given for query [root@centos7 ~]# gc gcc gcc-nm gconf-merge-tree gcov gcc-ar gcc-ranlib gconftool-2 gcr-viewer [root@centos7 ~]# gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper Target: x86_64-redhat-linux Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl= /builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog= /builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux Thread model: posix gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) [root@centos7 ~]# which gcc /bin/gcc |
*YUM
-redhat 계열 패키지 관리 프로그램인 RPM기반의 시스템을 위한 자동 업데이터 겸 패키지 설치/제거 도구
yum 명령어로 yum list 패키지명,
yum search 컴파일러 프로그램 찾고 싶을 때, 패키지 명을 작성하면, 찾을 수 있다.
인터넷 상에 있는 데이터베이스 패키지 내용과 local(서버 자기자신)에 갖고 있는 패키지내용을 동기화 시키기 위해
yum clean all ; yum update를 하는 것임.
https://www3.ntu.edu.sg/home/ehchua/programming/cpp/gcc_make.html
gcc 동작이 잘되는지 확인
hello.c 라는 소스코드를 만들어서 출력파일을 만들어지는지 확인하는 과정이다.
gcc 입력파일 출력파일 순으로 했으며,
옵션인 -o 는 output으로 hello라는 명칭을 주었다.
gcc hello.c -o hello 로 명령어를 수행했다.
2.컴파일러
해당 실습을 비유하면 다음과 같다.
순서 | |
hello.c | 소스코드로서 처음에 vi 로 작성한파일이다. |
전처리기 | 전처리기: 헤더(#include), 매크로(#define) 처리 //현재는 헤더파일(standard io->stdio)을 처리를 해서 |
hello.i | 전처리기를 통해 확장된 소스 코드를 포함한 중간 파일을 만들어진다. |
컴파일러 | 시스템 프로세서용 어셈블리 코드로 변환해주는 것이며, 인간이 이해할수 있는 언어를 컴퓨터(서버)의 CPU가 이해하기 쉬운 언어로 번역하는 과정이다. |
hello.s | 어셈블리 파일 |
어셈블러 | 어셈블리 코드를 기계어로 변환 |
hello.o | 오브젝트 파일 |
링커 | library linking (확장자 .lib나 .a파일로 변환되는 과정이다. |
hello.exe | 실행파일 |
순서는 hello.c -> 전처리기 -> hello.i ... => hello.exe 순서이며, 각각의 중간 과정을 확인하겠다.
Step1 전처리기 과정 #cpp hello.c > hello.i
해당 vi hello.i를 열어보면 절대경로 /usr/include/stdio.h" 뿐만 아니라 아주 많은 라인들로 이루어져 있다.
중간파일을 만드는 것이 전처리기의 역할!
.c 또는 .cpp 또는 .h로 소스코드가 전처리기를 통해
헤더를 포함하고, 확장된 소스코드를 포함한 중간 단계의 파일이
hello.i로 된다. 해당 파일 확인해본 결과 842줄로 용량이 17K가량 되는 파일이다.
[root@centos7 gcc_test]# cpp hello.c > hello.i
[root@centos7 gcc_test]# vi hello.i
[root@centos7 gcc_test]# ls -alrth
total 36K
drwxr-xr-x 3 root root 22 Oct 29 23:40 ..
-rw-r--r-- 1 root root 62 Oct 29 23:44 hello.c
-rwxr-xr-x 1 root root 8.4K Oct 29 23:45 hello
-rw-r--r-- 1 root root 17K Oct 29 23:58 hello.i
drwxr-xr-x 2 root root 49 Oct 30 00:00 .
[root@centos7 gcc_test]# cat hello.i |wc -l
842
Step2 컴파일러 과정 #gcc -S hello.i
*gcc의 S옵션 = 객체 코드 대신 어셈블리 코드를 생성하도록 지정 결과 어셈블리파일은 "hello.s"
** #man gcc를 통해서 다양한 옵션들을 확인할 수 있다
어셈블리언어는 각각의 운영체제가 돌아가고 있는 CPU(intel,AMD)가 이해할 수 있는 언어이다.
앞에 나왔던 hello.i 파일을 다음 명령어를 수행한다.
[root@centos7 gcc_test]# gcc -S hello.i
[root@centos7 gcc_test]# ls -alrth
total 40K
drwxr-xr-x 3 root root 22 Oct 29 23:40 ..
-rw-r--r-- 1 root root 62 Oct 29 23:44 hello.c
-rwxr-xr-x 1 root root 8.4K Oct 29 23:45 hello
-rw-r--r-- 1 root root 17K Oct 29 23:58 hello.i
drwxr-xr-x 2 root root 64 Oct 30 00:31 .
-rw-r--r-- 1 root root 434 Oct 30 00:31 hello.s
[root@centos7 gcc_test]# vi hello.s
Step3 어셈블리 과정 #as -o hello.o hello.s
hello.o라는 object file을 만드는 명령어이며, 실제로 우리 인간이 읽기엔 애매한 파일이다.
/bin 파일같은 경우에도 저런식으로 나온다.
[root@centos7 gcc_test]# as -o hello.o hello.s
[root@centos7 gcc_test]# ls -alrth
total 44K
drwxr-xr-x 3 root root 22 Oct 29 23:40 ..
-rw-r--r-- 1 root root 62 Oct 29 23:44 hello.c
-rwxr-xr-x 1 root root 8.4K Oct 29 23:45 hello
-rw-r--r-- 1 root root 17K Oct 29 23:58 hello.i
-rw-r--r-- 1 root root 434 Oct 30 00:31 hello.s
drwxr-xr-x 2 root root 79 Oct 30 00:45 .
-rw-r--r-- 1 root root 1.5K Oct 30 00:45 hello.o
[root@centos7 gcc_test]# cat hello.o |wc -l
4
[root@centos7 gcc_test]# vi hello.o
cf)
첫쨰줄 ELF는 실행가능한 binary 또는 object file 등의 형식을 규정한 것이다.
그래서 ELF 파일은 ELF Header 가 맨 앞에 위치하고, program Headers table 과 section headers table이 그 뒤에 위치한다.
#readelf -h hello.o 로 명령어를 수행하면 다음 정보들을 알 수 있다.
[root@centos7 gcc_test]# readelf -h hello.o
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: REL (Relocatable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x0
Start of program headers: 0 (bytes into file)
Start of section headers: 664 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 0 (bytes)
Number of program headers: 0
Size of section headers: 64 (bytes)
Number of section headers: 13
Section header string table index: 10
Step4 링킹 과정 #ld -o hello.o hello
'lecture > linux 개발환경' 카테고리의 다른 글
gdb & core dump (0) | 2021.10.31 |
---|