lecture/linux 개발환경

gcc

infra 2021. 10. 29. 22:31

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.컴파일러

 

 

gcc 컴파일 처리과정 순서

해당 실습을 비유하면 다음과 같다.

 

순서  
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