1 / 81

GCC & Shell Script

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 정말 많은 언어들을 지원하는 컴파일러 세트 !

kane
Download Presentation

GCC & Shell Script

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr GCC & Shell Script KAIST 11 SPARCS 11 Rodumani(정 창제)

  2. 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

  3. GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr GCC KAIST 11 SPARCS 11 Rodumani(정 창제)

  4. 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 와 함께 주로 많이 쓰이는 디버거

  5. GCC의 가장 기본! GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr 컴파일러이므로 컴파일 시켜보자! Helloworld.c $ gcc –o HelloworldHelloworld.c

  6. GCC의 가장 기본! GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • $ls • $./Helloworld//실행구문 • 잘 컴파일 되었다! $gcc –o HelloworldHellworld.c

  7. 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]을 통해서 실행파일로 만들 수 있다.

  8. GCC 명령 기본구문 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • 이렇게 깨알같은 로그들을 볼 수 있다. $ gcc–v –o HelloworldHelloworld.c

  9. GCC 명령 기본구문 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • 전처리파일..? 어셈블리파일..? 컴파일 과정을 살펴보자! • $ gcc--save-temps –o HelloworldHelloworld.c • 컴파일 과정중에 생긴 전처리파일(.i)과 어셈블리 파일(.s)을 지우지 않고 저장한다!

  10. GCC 의 컴파일 과정 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr

  11. Link GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr 오브젝트 파일에 표준라이브러리, 혹은 오브젝트 파일끼리 서로 연결하여 실행파일을 만드는 것.

  12. 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) 재배치 가능한 오브젝트 파일의 특별한 타입으로, 로드-타임이나 런-타임때 동적으로 메모리로 로드되고 링킹될 수 있는 것을 가리킨다.

  13. 2. Library GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • 소프트웨어를 만들 때 쓰이는 클래스나 서브루틴들의 모임을 가리키는 말이다.(Wikipedia) • 수 많은 오브젝트 파일의 집합(letyoursoulbefree) • 정적 라이브러리 • 컴파일러가 소스 파일을 컴파일할 때 참조되는 프로그램 모듈이다. 링크 된 뒤에 라이브러리의 내용이 프로그램에 포함된다. • 동적 라이브러리 • 동적 라이브러리는 프로그램 수행 도중 해당 모듈이 필요할 때 불러쓰는 프로그램 모듈. 자주 불려오는 공통적인 것들이 주로 저장되어 있다.(코드에 반복되어 들어가는 것을 방지!) • 윈도에서는 주로 DLL 확장자를 가지며, 리눅스에서는 주로 SO 확장자를 가진다. • 리눅스에서는 /lib/에 저장되어있다. • printf(), scanf() 등이 대표적 동적 라이브러리에 있는 함수들

  14. GCC 의 컴파일 과정 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr

  15. gcc & ld GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr ld:별도로 존재하는 프로그램.gcc의 일부가 아니다. gcc와 ld는 매우 친한 친구 사이이다! gcc는 대부분의 프로그램에서 사용하고 있는 ‘표준’ 라이브러리를 잘 알고있어서 ld에게 링크를 지시한다.

  16. 다중소스 컴파일 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • Helloworld.c처럼 하나의 파일만 작성하는 프로그램은 거의 없다! • 다중소스 컴파일을 해야한다! • rodumani.c와 noname.c로 파일이 나뉘어져 있고 boolgom이라는 실행파일을 만드려면, • $ gcc –o boolgomrodumani.cnoname.c • 참 쉽죠!

  17. 다중소스 컴파일 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는 일련의 과정을 알아서 다 해준다!

  18. 문제점…? GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr gcc –o boolgomrodumani.cnoname.c 위와 같은 컴파일은 rodumani.c 만 변경해도 noname.c까지 전부 다 다시 컴파일한다. 대규모 프로젝트에선 꽤나 많은 시간 손실이 발생한다. 그래서 make명령과 Makefile을 이용하여 대체할 수 있다.

  19. Make GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • make 의 목표 : • 가장 적은 단계를 거쳐 파일을 만드는 것. • 이러한 유연성을 위해 파일을 생성하기 위해 어떤 파일이 필요한지 기록(MakeFile)해 둔다. • 어떤 파일의 변화는 파일시스템에서 파일 속성에 있는 Timestamp를 가지고 추적한다.

  20. 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함수 선언

  21. MakeFile Example GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr Calculator.h

  22. MakeFile Example GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr calculator.c

  23. MakeFile Example GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr cal_main.c

  24. MakeFile Example GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr $ gcc –o calculator cal_main.ccalculator.c

  25. MakeFile Example GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr 같은 소스폴더의 내부에 makefile이나 Makefile로 명령을 만들어 둔다.

  26. MakeFile Example GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • 만약 다시 make 한다면? $make calculator

  27. MakeFile Example GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • 수정을 해보자! • cal_main.c

  28. MakeFile Example GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • 수정을 해보자! • $ make calculator • cal_main.c의 변화를 감지하고 calculator를 다시 빌드한다.

  29. Makefile문법규칙 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • 명령을 시작하기 전에는 항상 TAB을 넣어야 한다. • 절대로 SPACE가 아님을 명심하자! • #으로 시작하는 행은 주석처리된다. • 이외의 자세한 문법에 관해서는 • http://www.gnu.org/software/make/manual/make.html • 러닝 리눅스, 한빛미디어

  30. gcc코드 최적화 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • -O 옵션을 주면 최적화를 진행한다. • -O1 에서 –O3 정도를 사용한다. • 숫자가 높을수록 더 높은수준의 최적화가 이루어지나 컴파일 시간은 오래걸린다.

  31. 디버깅 코드의 활성화 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • -g 옵션을 주면 오브젝트 파일에 디버깅 코드를 비롯해 많은 정보들을 포함시킨다. • gdb와 같은 디버거를 이용해 프로그램을 추적할 수 있다. • 파일 크기가 매우 커진다는 단점! • 정적 라이브러리와 링크되어야만 한다. • 프로그램을 개발하여 테스트할 때만 –g 옵션을 사용하고 최종 배포시 제거하고 컴파일 한다. • -O(최적화옵션) 과 함께 사용가능하나 가끔 디버거에서 이상하게 보일 수 있다. 보통 –g옵션을 사용할 때는 –O를 사용하지 않는다.

  32. 나만의 라이브러리 만들기 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까지 실행을 시켜준다.

  33. 나만의 라이브러리 사용하기 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • 해더파일을 먼저 만들어주어야 한다. • [libstuff].h 안에 extern [호출코드] 식으로 들어있어야한다. • Ex) libstuff.h • extern float suare(float); • extern int factorial(int, int); ..

  34. 나만의 라이브러리 사용하기 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를 찾게한다.

  35. GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr GDB KAIST 11 SPARCS 11 Rodumani(정 창제)

  36. GDB 사용-기본 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • $ gdb [Filename] • 기초 명령어 • help : 도움말 • run : 프로그램을 끝까지 실행 (단,breakpoint 가 있을경우 멈춘다.) • quit : 종료 • list : 코드의 내용을 보여준다. (단, 실행중에는 지금까지 실행된 곳 이후부터 보여준다. 컴파일 시에 –g옵션을 주었을 경우에만 유효한다.)

  37. GDB 사용-기본 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • breakpoint 설정 • Break (혹은 b) • $ run

  38. GDB 사용-기본 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • next & step • 두 명령 모두 코드의 다음으로 진행하는 명령을 한다. • next의 경우 같은 함수 안에서만 다음행까지 진행된다. • step의 경우 호출된 함수 속으로도 추적해 들어간다. • line 10에 BreakPoint를 설정한 다음 next, step을 각각 실행시키면?

  39. step GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr 4번째 줄에 있는 add함수의 내용으로 들어갔다가 다시 main 함수의 13번 줄로 돌아온다.

  40. next GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr 바로 다음인 13 번 줄로 넘어간다.

  41. next & step GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr 프로그램에서 에러가 발생하는데 정확히 어느 함수에서 에러가 발생하는지 모르겠을 때 next를 통해 에러가 나는 함수를 찾고,step 을 통해 그 함수 속을 관찰한다.

  42. GDB 사용-기본 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • print • 변수에 저장된 값을 확인하는데 사용한다.

  43. GDB 사용 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr ptype: 변수의 타입이나 함수의 반환값, 인자 들의 타입을 알 수 있다.

  44. GDB 사용-기본 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • info : 디버깅 중인 프로그램의 정보 확인 • info program : 프로그램 상태확인 • info locals : 현재 함수내의 모든 변수의 값들을 보여준다.(wing ide : stack data의 역할)

  45. 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으로 이동

  46. GDB 사용- 실행중인 프로그램 디버깅하기 GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr 실행중인 Process에 대해서도 GDB를 attach시켜 디버그 할 수 있다. $gdb [name] (gdb) attach [pid] 반대로 detach 를하면 attach 되었던 프로그램을 놓아준다.

  47. GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr Shell & Shell Script KAIST 11 SPARCS 11 Rodumani(정 창제)

  48. GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr 명령어 해석기 명령을 Kernel로 전달 사용자와 순수 운영체제 사이를 연결시켜주는 기능을 수행하는 중간적인 존재 bash, csh, ksh, sh, tchs,zsh..등 여러 종류들이 존재한다. bash가 가장많이 사용된다. Shell

  49. Shell GCC,GDB & Shell Script. rodumani@sparcs.kaist.ac.kr • 지금 사용하는 쉘을 확인하자! • $echo $SHELL • 로그인 쉘을 바꾸려면? • $ chsh • 반영하려면 다시 로그인 해야 한다. • (+쉘도 프로그램이므로 다른쉘을 실행시킬 수 있다. –변규홍 선배님의 조언)

  50. 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: 커서의 위치부터 행의 처음까지 삭제

More Related