810 likes | 1.14k Views
GCC & Shell Script . KAIST 11 SPARCS 11 Rodumani (정 창제 ). Contents. GCC & GDB GCC (GNU C Compiler) GDB (GNU Project Debugger) Shell & Shell Script Shell? Shell Script. GCC. KAIST 11 SPARCS 11 Rodumani (정 창제 ). GCC & GDB . GCC GNU Compiler Collection 정말 많은 언어들을 지원하는 컴파일러 세트 !
E N D
GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr GCC & Shell Script KAIST 11 SPARCS 11 Rodumani(정 창제)
Contents GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • GCC & GDB • GCC (GNU C Compiler) • GDB (GNU Project Debugger) • Shell & Shell Script • Shell? • Shell Script
GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr GCC KAIST 11 SPARCS 11 Rodumani(정 창제)
GCC & GDB GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • GCC • GNU Compiler Collection • 정말 많은 언어들을 지원하는 컴파일러 세트! • C,C++,Objective-C, Java, etc… • 모든 C표준 지원 +GCC 확장기능 제공 • C++ 컴파일러 +STL 전체 C++ Class Lib. 지원 • GNU Project C & C++ Compiler • GDB • GNU Project Debugger • GCC 와 함께 주로 많이 쓰이는 디버거
GCC의 가장 기본! GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr 컴파일러이므로 컴파일 시켜보자! Helloworld.c $ gcc –o HelloworldHelloworld.c
GCC의 가장 기본! GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • $ls • $./Helloworld//실행구문 • 잘 컴파일 되었다! $gcc –o HelloworldHellworld.c
GCC 명령 기본구문 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • $ gcc [SourceFile1] [SourceFile2] … • 기본적으로 a.out이라는 파일이 생성된다. • $ gcc –o [Export FileName] [SrFile1] [SrFile2] .. • 순서가 매우 중요! • (특히 SourceFile이 하나일경우 헷갈리기 쉽다.) • $gcc –c [SourceFile] • [SourceFile]과 같은이름의 오브젝트 파일(~.o)만 생성된다. • $gcc –o [Export FileName] [Object File]을 통해서 실행파일로 만들 수 있다.
GCC 명령 기본구문 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • 이렇게 깨알같은 로그들을 볼 수 있다. $ gcc–v –o HelloworldHelloworld.c
GCC 명령 기본구문 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • 전처리파일..? 어셈블리파일..? 컴파일 과정을 살펴보자! • $ gcc--save-temps –o HelloworldHelloworld.c • 컴파일 과정중에 생긴 전처리파일(.i)과 어셈블리 파일(.s)을 지우지 않고 저장한다!
GCC 의 컴파일 과정 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr
Link GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr 오브젝트 파일에 표준라이브러리, 혹은 오브젝트 파일끼리 서로 연결하여 실행파일을 만드는 것.
1. Object File GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr 소스코드를 단순히 기계어로 만들었을 뿐 아직 완전히 실행가능한 상태는 아니다. Relocatableobject file.(재배치가능 Obj-File) 바이너리 코드와 데이터를 가지고 있으며, 실행가능한 오브젝트 파일을 만들기 위해 컴파일-타임때 재배치 가능한 다른 오브젝트 파일들과 결합될 수 있는 것을 가리킨다. Executable object file.(실행가능 Obj-File) 바이너리 코드와 데이터를 가지고 있으며, 메모리로 직접 로드되어 실행될 수 있는 것을 가리킨다. Shared object file.(공유 Obj-File) 재배치 가능한 오브젝트 파일의 특별한 타입으로, 로드-타임이나 런-타임때 동적으로 메모리로 로드되고 링킹될 수 있는 것을 가리킨다.
2. Library GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • 소프트웨어를 만들 때 쓰이는 클래스나 서브루틴들의 모임을 가리키는 말이다.(Wikipedia) • 수 많은 오브젝트 파일의 집합(letyoursoulbefree) • 정적 라이브러리 • 컴파일러가 소스 파일을 컴파일할 때 참조되는 프로그램 모듈이다. 링크 된 뒤에 라이브러리의 내용이 프로그램에 포함된다. • 동적 라이브러리 • 동적 라이브러리는 프로그램 수행 도중 해당 모듈이 필요할 때 불러쓰는 프로그램 모듈. 자주 불려오는 공통적인 것들이 주로 저장되어 있다.(코드에 반복되어 들어가는 것을 방지!) • 윈도에서는 주로 DLL 확장자를 가지며, 리눅스에서는 주로 SO 확장자를 가진다. • 리눅스에서는 /lib/에 저장되어있다. • printf(), scanf() 등이 대표적 동적 라이브러리에 있는 함수들
GCC 의 컴파일 과정 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr
gcc & ld GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr ld:별도로 존재하는 프로그램.gcc의 일부가 아니다. gcc와 ld는 매우 친한 친구 사이이다! gcc는 대부분의 프로그램에서 사용하고 있는 ‘표준’ 라이브러리를 잘 알고있어서 ld에게 링크를 지시한다.
다중소스 컴파일 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • Helloworld.c처럼 하나의 파일만 작성하는 프로그램은 거의 없다! • 다중소스 컴파일을 해야한다! • rodumani.c와 noname.c로 파일이 나뉘어져 있고 boolgom이라는 실행파일을 만드려면, • $ gcc –o boolgomrodumani.cnoname.c • 참 쉽죠!
다중소스 컴파일 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • $ gcc –o boolgomrodumani.cnoname.c • 위의 명령은 다음 명령과 동일하다. • $gcc –c rodumani.c • $gcc –c noname.c • $gcc -o boolgomrodumani.ononame.o • 각각의 파일을 ObjectFile로 만들고 다시 링크시켜주는 것! • gcc는 일련의 과정을 알아서 다 해준다!
문제점…? GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr gcc –o boolgomrodumani.cnoname.c 위와 같은 컴파일은 rodumani.c 만 변경해도 noname.c까지 전부 다 다시 컴파일한다. 대규모 프로젝트에선 꽤나 많은 시간 손실이 발생한다. 그래서 make명령과 Makefile을 이용하여 대체할 수 있다.
Make GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • make 의 목표 : • 가장 적은 단계를 거쳐 파일을 만드는 것. • 이러한 유연성을 위해 파일을 생성하기 위해 어떤 파일이 필요한지 기록(MakeFile)해 둔다. • 어떤 파일의 변화는 파일시스템에서 파일 속성에 있는 Timestamp를 가지고 추적한다.
MakeFile Example GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • Calculator: • cal_main:main함수를 포함 • calculator.c : add,minus,multiple,divide함수 정의 • calculator.h : add,minus,multiple,divide함수 선언
MakeFile Example GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr Calculator.h
MakeFile Example GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr calculator.c
MakeFile Example GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr cal_main.c
MakeFile Example GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr $ gcc –o calculator cal_main.ccalculator.c
MakeFile Example GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr 같은 소스폴더의 내부에 makefile이나 Makefile로 명령을 만들어 둔다.
MakeFile Example GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • 만약 다시 make 한다면? $make calculator
MakeFile Example GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • 수정을 해보자! • cal_main.c
MakeFile Example GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • 수정을 해보자! • $ make calculator • cal_main.c의 변화를 감지하고 calculator를 다시 빌드한다.
Makefile문법규칙 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • 명령을 시작하기 전에는 항상 TAB을 넣어야 한다. • 절대로 SPACE가 아님을 명심하자! • #으로 시작하는 행은 주석처리된다. • 이외의 자세한 문법에 관해서는 • http://www.gnu.org/software/make/manual/make.html • 러닝 리눅스, 한빛미디어
gcc코드 최적화 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • -O 옵션을 주면 최적화를 진행한다. • -O1 에서 –O3 정도를 사용한다. • 숫자가 높을수록 더 높은수준의 최적화가 이루어지나 컴파일 시간은 오래걸린다.
디버깅 코드의 활성화 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • -g 옵션을 주면 오브젝트 파일에 디버깅 코드를 비롯해 많은 정보들을 포함시킨다. • gdb와 같은 디버거를 이용해 프로그램을 추적할 수 있다. • 파일 크기가 매우 커진다는 단점! • 정적 라이브러리와 링크되어야만 한다. • 프로그램을 개발하여 테스트할 때만 –g 옵션을 사용하고 최종 배포시 제거하고 컴파일 한다. • -O(최적화옵션) 과 함께 사용가능하나 가끔 디버거에서 이상하게 보일 수 있다. 보통 –g옵션을 사용할 때는 –O를 사용하지 않는다.
나만의 라이브러리 만들기 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • 자주 사용하는 루틴에 대해 나만의 라이브러리를 만들 수 있다. • $gcc –c 를 이용해서 objectfile을 만든 뒤, • $ar r libstuff.a source1.o source2.o … • libstuff.a라는 archive가 생성된다. • $ ranliblibstuff.a를 통해 라이브러리 인덱스를 만들어주면 끝! • $arrslibstuff.a source1.0 source2.o … • ranlib까지 실행을 시켜준다.
나만의 라이브러리 사용하기 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • 해더파일을 먼저 만들어주어야 한다. • [libstuff].h 안에 extern [호출코드] 식으로 들어있어야한다. • Ex) libstuff.h • extern float suare(float); • extern int factorial(int, int); ..
나만의 라이브러리 사용하기 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • 만들어진 libstuff.h와 libstuff.a는 어떻게 사용해야 하나.. • 보통 사용자 정의 *.h 파일과 *.a파일은 보통 각각 user디렉토리에 있는 include,lib속에 저장한다. • $ gcc –I../include –L../lib –o output a.cb.c –lstuff • -lstuff라는 인수는 Linker에게 ../lib속에서 libstuff.a라는 파일을 찾아서 링크하게 한다. • ex ) –lmath libmath.a를 찾게한다.
GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr GDB KAIST 11 SPARCS 11 Rodumani(정 창제)
GDB 사용-기본 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • $ gdb [Filename] • 기초 명령어 • help : 도움말 • run : 프로그램을 끝까지 실행 (단,breakpoint 가 있을경우 멈춘다.) • quit : 종료 • list : 코드의 내용을 보여준다. (단, 실행중에는 지금까지 실행된 곳 이후부터 보여준다. 컴파일 시에 –g옵션을 주었을 경우에만 유효한다.)
GDB 사용-기본 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • breakpoint 설정 • Break (혹은 b) • $ run
GDB 사용-기본 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • next & step • 두 명령 모두 코드의 다음으로 진행하는 명령을 한다. • next의 경우 같은 함수 안에서만 다음행까지 진행된다. • step의 경우 호출된 함수 속으로도 추적해 들어간다. • line 10에 BreakPoint를 설정한 다음 next, step을 각각 실행시키면?
step GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr 4번째 줄에 있는 add함수의 내용으로 들어갔다가 다시 main 함수의 13번 줄로 돌아온다.
next GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr 바로 다음인 13 번 줄로 넘어간다.
next & step GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr 프로그램에서 에러가 발생하는데 정확히 어느 함수에서 에러가 발생하는지 모르겠을 때 next를 통해 에러가 나는 함수를 찾고,step 을 통해 그 함수 속을 관찰한다.
GDB 사용-기본 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • print • 변수에 저장된 값을 확인하는데 사용한다.
GDB 사용 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr ptype: 변수의 타입이나 함수의 반환값, 인자 들의 타입을 알 수 있다.
GDB 사용-기본 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • info : 디버깅 중인 프로그램의 정보 확인 • info program : 프로그램 상태확인 • info locals : 현재 함수내의 모든 변수의 값들을 보여준다.(wing ide : stack data의 역할)
GDB 사용 – 코어파일 분석 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr Core File : 파일이 실행되다가 비정상 종료되었을 때의 메모리 이미지를 덤프한 것. $gdb [filename] core 를 통해 core파일을 열어낼 수 있다. Backtrace : 충돌이 발생한 지점의 call stack 상태를 보여준다. frame n : call stack 중 n번째의 stackframe을 보여준다. up : 현재보다 위에 있는 stackframe으로 이동 down : 현재보다 아래에 있는 stackframe으로 이동
GDB 사용- 실행중인 프로그램 디버깅하기 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr 실행중인 Process에 대해서도 GDB를 attach시켜 디버그 할 수 있다. $gdb [name] (gdb) attach [pid] 반대로 detach 를하면 attach 되었던 프로그램을 놓아준다.
GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr Shell & Shell Script KAIST 11 SPARCS 11 Rodumani(정 창제)
GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr 명령어 해석기 명령을 Kernel로 전달 사용자와 순수 운영체제 사이를 연결시켜주는 기능을 수행하는 중간적인 존재 bash, csh, ksh, sh, tchs,zsh..등 여러 종류들이 존재한다. bash가 가장많이 사용된다. Shell
Shell GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • 지금 사용하는 쉘을 확인하자! • $echo $SHELL • 로그인 쉘을 바꾸려면? • $ chsh • 반영하려면 다시 로그인 해야 한다. • (+쉘도 프로그램이므로 다른쉘을 실행시킬 수 있다. –변규홍 선배님의 조언)
Shell GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • 유용한 단축키들 • Ctrl+C: interrupt key (명령 중지) • Ctrl+z : suspend key(백그라운드로 보냄) • fg : foreground로 다시 불러옴 • Ctrl+H : Backspace와 동일 • Ctrl+U: 커서의 위치부터 행의 처음까지 삭제