Microsoft PowerPoint - 06_(Linux)_(Fundamental)_C_Programming

Similar documents
PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

임베디드리눅스기초

Microsoft PowerPoint - chap01-C언어개요.pptx

C++ Programming

vi 사용법

C++ Programming

untitled

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

슬라이드 1

Microsoft PowerPoint - System Programming Lab Week1.ppt [호환 모드]

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

PowerPoint 프레젠테이션

<4D F736F F F696E74202D20C1A632C0E520C7C1B7CEB1D7B7A5B0B3B9DFB0FAC1A4>

강의10

Microsoft PowerPoint - 08-C-App-19-Quick-Preprocessor

버퍼오버플로우-왕기초편 10. 메모리를 Hex dump 뜨기 앞서우리는버퍼오버플로우로인해리턴어드레스 (return address) 가변조될수있음을알았습니다. 이제곧리턴어드레스를원하는값으로변경하는실습을해볼것인데요, 그전에앞서, 메모리에저장된값들을살펴보는방법에대해배워보겠습

Microsoft PowerPoint - chap-02.pptx

Microsoft PowerPoint - chap06-2pointer.ppt

Microsoft PowerPoint - chap12-고급기능.pptx


PowerPoint 프레젠테이션

Microsoft PowerPoint - 03_(C_Programming)_(Korean)_Pointers

본 강의에 들어가기 전

Microsoft PowerPoint - additional01.ppt [호환 모드]

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

슬라이드 1

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

PowerPoint 프레젠테이션

C언어 및 실습 C Language and Practice

untitled

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

Sena Technologies, Inc. HelloDevice Super 1.1.0

PowerPoint 프레젠테이션

Microsoft PowerPoint - 08_(C_Programming)_(Korean)_Preprocessing

PowerPoint 프레젠테이션

gdb 사용법 Debugging Debug라는말은 bug를없앤다는말이다. Bug란, 컴퓨터프로그램상의논리적오류를말하며, 이것을찾아해결하는과정이바로, debugging이다. 초기컴퓨터들은실제벌레가컴퓨터에들어가서오작동을일으키는경우가있었다고하며, 여기서 debug 이라는말이

Microsoft PowerPoint - chap03-변수와데이터형.pptx

Microsoft PowerPoint - 1장 C 프로그래밍 시작하기 pptx

OCW_C언어 기초

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - [2009] 02.pptx

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

untitled

금오공대 컴퓨터공학전공 강의자료

untitled

PowerPoint 프레젠테이션

슬라이드 1

PowerPoint 프레젠테이션

슬라이드 1

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

OCW_C언어 기초

KEY 디바이스 드라이버

쉽게 풀어쓴 C 프로그래밍

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap-02.pptx

C 프로그래밊 개요

윤성우의 열혈 TCP/IP 소켓 프로그래밍

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

PowerPoint Presentation

K&R2 Reference Manual 번역본

C 언어 프로그래밊 과제 풀이

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft PowerPoint - chap10-함수의활용.pptx

C++-¿Ïº®Çؼ³10Àå

중간고사

1 장 C 언어복습 표준입출력배열포인터배열과포인터함수 const와포인터구조체컴파일러사용방법 C++ 프로그래밍입문

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

PowerPoint 프레젠테이션

Microsoft PowerPoint - ch 전처리기, 다중 소스파일 pm1015

<B1E2BCFAB9AEBCAD5FB9DABAB4B1D45F F F64746F72732E687770>

컴파일러

Microsoft PowerPoint - Chapter8.pptx

Microsoft PowerPoint - chap08-1 [호환 모드]

C# Programming Guide - Types

Microsoft PowerPoint - lab14.pptx

Microsoft PowerPoint - Chapter_04.pptx

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

untitled

개발도구

기술문서 LD_PRELOAD 와공유라이브러리를사용한 libc 함수후킹 정지훈

금오공대 컴퓨터공학전공 강의자료

프로그래밍개론및실습 2015 년 2 학기프로그래밍개론및실습과목으로본내용은강의교재인생능출판사, 두근두근 C 언어수업, 천인국지음을발췌수정하였음

EA0015: 컴파일러

11장 포인터

Microsoft PowerPoint - chap-11.pptx

Microsoft PowerPoint - chap06-5 [호환 모드]

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

Microsoft PowerPoint oshw1.ppt [호환 모드]

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

ISP and CodeVisionAVR C Compiler.hwp

강의의목표 Compiled Language vs. Interpreted Language 차이이해 Compiling의의미이해 Compiling의결과물확인 통합개발환경구축 Eclipse 통합개발환경을통한예제의 Bulid 및실행 Formatter 등의편집지원기능, Refer

PowerPoint Template

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

Transcription:

GNU/Linux 리눅스 C 프로그래밍 (Linux C programming) Seo, Doo-Ok Clickseo.com clickseo@gmail.com

목 차 GNU 프로젝트 LLVM 프로젝트 2

GNU 프로젝트 GNU 프로젝트 GCC GDB GNU make LLVM 프로젝트 3

GNU 프로젝트 GCC (GNU Compiler Collection) 4

GCC GCC(GNU Compiler Collection) : gcc.gnu.org GNU C Compiler 1987년 5월, 리처드스톨만 (Richard Stallman) GNU 프로젝트의컴파일러로작성» 1987년 3월, GCC 0.9 (first beta release)» 1987년 5월, GCC 1.0» 1987년 12월, C++ 컴파일러확장 GCC 1.15.3 (g++) GNU Compiler Collection 대부분의유닉스계열운영체제의표준컴파일러로채택 GNU 운영체제의공식컴파일러그리고 GNU/Linux 및 BSD 계열운영체제 공식지원언어» C(gcc), C++(g++), Objective-C, Fortran(gfortran), Ada(GNAT), Go(gccgo)» Java(gcj) : GCC 7.1 버전부터지원중단 2018년 1월, GCC 7.3 GNU General Public License(GNU GPL) 2007년 10월, GCC 4.2.2 부터 GPLv3 5

gcc : 컴파일과정 gcc : 컴파일과정 (1/3) 프로그램을차례로실행시키는툴 일반적으로 gcc 를컴파일러라고한다. 소스파일을이용해실행파일을만들때까지필요한프로그램을차례로실행시키는툴이다. xxx.c 전처리 ccp xxx.i 컴파일 xxx.s 어셈블 xxx.o cc1 as 링크 ld a.out 원시파일 (Source File) 전처리된파일어셈블리어파일오브젝트파일실행파일 [clickseo@localhost ~]$ gcc hello.c [clickseo@localhost ~]$./a.out Hello World!!! 6

gcc : 파일확장자 gcc : 컴파일과정 (2/3) gcc 는파일확장자에따라처리방법이다르다. 대표적인확장자 :.c gcc 로전처리기, 컴파일, 어셈블, 링크과정을거쳐야실행파일이완성 확장자 종류 처리방법.c C, 원시파일 (Source File) gcc 로전처리, 컴파일, 어셈블, 링크.cc.cpp C++, 원시파일 (Source File) g++ 로전처리, 컴파일, 어셈블, 링크.i 전처리된 c 소스코드 gcc 로컴파일과어셈블, 링크.ii 전처리된 c++ 소스코드 g++ 로컴파일과어셈블, 링크.s 어셈블리어로된파일 어셈블과링크.S 어셈블리어로된파일 전처리와어셈블, 링크.o 목적파일 (Object File) 링크.a.so 컴파일된라이브러리파일 링크 7

gcc : 컴파일과정 (3/3) 예제 6-1 : gcc 컴파일과프로그램실행 #include <stdio.h> int main(void) { printf ( Hello Linux\n ); } return 0; [clickseo@localhost ~]$ gcc hello.c [clickseo@localhost ~]$./a.out Hello Linux [clickseo@localhost ~]$ 8

gcc : 옵션 (1/6) gcc : 옵션 옵션 의미 -o 지정된파일명으로실행파일생성 : 이진파일 (Binary File) -c 목적파일생성 ( 단, 링킹과정은수행하지않는다 ) -E 원시소스파일을전처리과정까지만실행하고컴파일을중단한다. -I 표준디렉터리가아닌위치에있는헤더파일의디렉터리지정 ( 디렉터리목록추가 ) -L 라이브러리파일을검색하는디렉터리목록을추가 -l 라이브러리파일을컴파일시링크 -g -ggdb 이진파일에표준디버깅정보를포함하여컴파일 gdb 를이용하여디버깅하기위해서는 g 옵션을이용하여컴파일해야한다. 이진파일에 gdb 만이이해할수있는많은디버깅정보를포함 -O 컴파일코드최적화 -O level 컴파일최적화 level 단계지정 -D FOO=BAR 명령라인에서 BAR 값을가지는 FOO 라는선행처리기매크로를정의한다. -static 정적라이브러리에링크한다. 9

gcc : 옵션 (2/6) gcc : 옵션 옵션 -ansi -traditional -MM 의미 ANSI/ISO C 표준을지원 : 표준과충돌하는 GNU 확장안을취소 ANSI 호환코드를보장안함과거스타일의함수정의형식과같이전통적인 K&R C 언어형식을지원 make 호환의의존성목록을출력 -V 컴파일의각단계에서사용되는명령출력 10

gcc : 옵션 (3/6) gcc : -o 옵션 실행파일생성시이름지정 : 이진파일 (Binary File) 지정하지않을시 a.out 의기본실행파일생성 일반형식 gcc -o [ outputfilename ] [ sourcefilename ] gcc [ sourcefilename ] -o [ outputfilename ] 출력파일과소스파일의순서는바뀌어도상관없다. [clickseo@localhost ~]$ gcc o hello hello.c 11

gcc : 옵션 (4/6) gcc : -E 옵션 원시파일을전처리과정만을실행하고, 컴파일중단 [clickseo@localhost ~]$ gcc E hello.c [clickseo@localhost ~]$ gcc E hello.c > prehello 12

gcc : 옵션 (5/6) gcc : -c 옵션 목적파일 (Object File) 생성 : 확장자.o 파일 원시파일 (Source File) 을목적파일로만컴파일하고, 링크과정생략 [clickseo@localhost ~]$ gcc c hello.c [clickseo@localhost ~]$ gcc o hello hello.o [clickseo@localhost ~]$ gcc hello.o # hello 실행파일생성 # a.out 실행파일생성 13

gcc : 옵션 (6/6) gcc : -I 옵션 표준디렉터리가아닌위치에있는헤더파일의디렉터리를지정한다. 소스파일과헤더파일이다른경로에존재할때사용한다. [clickseo@localhost ~]$ gcc main.c I < 헤더파일이있는디렉터리경로및이름 > // myheader.h #define AGE 20 // main.c #include <stdio.h> #include "myheader.h" int main(void) { printf("%d \n", AGE); return 0; } 14

분할컴파일 gcc : 분할컴파일 (1/2) 분할컴파일 : 여러파일로분리작성된하나의프로그램을컴파일 // main.c // hi.c extern void hi(void); #include <stdio.h> int main(void) void hi(void) { { hi(); printf ( Linux World \n ); return 0; return; } } 링킹 main.o + hi.o test 15

gcc 옵션 : 분할컴파일 (2/2) 분할컴파일 : -c 옵션 분할컴파일 : 목적파일과실행파일생성후실행결과 [clickseo@localhost ~]$ gcc c main.c [clickseo@localhost ~]$ gcc c hi.c [clickseo@localhost ~]$ gcc main.o hi.o o test [clickseo@localhost ~]$ gcc main.c hi.c -o linux 16

라이브러리 라이브러리지정옵션 (1/4) 자주사용되는유용한함수에대해오브젝트파일을모아둔것 시스템에서제공하는라이브러리디렉터리 : /usr/lib lib 로시작하고 ar 명령어에의해생성, 확장자.a 17

라이브러리지정옵션 (2/4) 라이브러리생성절차 오브젝트파일생성 [clickseo@comlab /]$ gcc -c plus.c minus.c 라이브러리파일생성 [clickseo@comlab /]$ ar r libmy.a plus.o minus.o 라이브러리에자체에정보추가 [clickseo@comlab /]$ ranlib libmy.a [clickseo@comlab /]$ ar rs libmy.a 헤더파일생성 라이브러리옵션지정을포함한 gcc 컴파일 18

라이브러리지정옵션 (3/4) 라이브러리지정옵션 -I 옵션 표준라이브러리가헤더파일을찾는헤더경로를추가한다. -L 옵션 표준라이브러리가디렉터리를추가한다. -l 옵션 표준라이브러리이외의라이브러리를링크하려고할때사용 예 ) 수학라이브러리 (math.h) 를사용하려고한다면... gcc 명령행끝에 -lm을추가하여 libm 라이브러리를링크시켜야한다. 19

plus.c 라이브러리지정옵션 (4/4) 라이브러리생성예제 int plus (int x, int y) { return x+y; } minus.c int minus (int x, int y) { return x-y ; }./lib/libmy.h extern int plus(int, int); extern int minus (int, int); 20

GNU 프로젝트 GDB (GNU Debugger) 21

GDB (1/2) GDB(GNU Project debugger) 1988년, 리처드스톨만 (Richard Stallman) GNU 소프트웨어시스템을위한기본디버거 컴퓨터프로그램의실행을추적하고수정할수있는많은기능을제공 https://www.gnu.org/software/gdb/ GDB 릴리즈 2018 년 1 월, GDB 8.1 라이선스 : GNU General Public License(GNU GPL) 22

GDB (2/2) GDB : 주요특징 다양한프로그래밍언어지원 C, C++, Objective-C, Fortran, Ada 그리고 Go, Rust 등의프로그래밍언어지원 주요특징 프로그램의내부변수들의값을모니터링하거나변경가능 프로그램의일반적인실행과정과독립적으로함수호출이가능 명령어를통해서메모리, 스택, 시그널, 레지스터등의정보를보는것이가능 제한적으로멀티프로세스멀티스레드디버깅가능 원격디버깅 임베디드시스템을디버깅할때사용되는원격모드지원 GDB가한머신상에동작하고, 디버그할프로그램은다른머신상에서동작 23

gdb : 실행과종료 (1/2) gdb : 프로그램실행과종료 gcc 컴파일시 g 옵션을이용하여컴파일 -g 옵션을붙이면디버깅정보가실행파일에삽입된다. -g 옵션을붙이지않으면어셈블리코드만보면서디버깅해야한다. gdb 실행 [clickseo@localhost ~]$ gdb [ programname ] # 일반적인방법 # 치명적예외상황 [clickseo@localhost ~]$ gdb [ programname ] [ corefilename ] # 수행중인프로세스 [clickseo@localhost ~]$ gdb [ programname ] [ processid ] gdb 종료 (gdb) d (gdb) Ctrl + d 24

gdb : 프로그램실행 gdb : 실행과종료 (2/2) [clickseo@localhost ~]$ gcc -g -o hellodebug hello.c [clickseo@localhost ~]$ gdb hellodebug gdb 실행 25

gdb : 명령어 (1/6) gdb : List l : (List) gdb 를이용한프로그램소스출력 다시소문자 l 을누르거나 Enter 를입력하면나머지소스부분이출력된다. Enter 는이전명령의반복을의미한다. 명령내용 l l - l n l functionname l file.c:n l file.c:functionname main 함수를기점으로프로그램소스출력출력된행의이전행출력 n 번째행을기점으로프로그램소스출력지정된함수의소스출력 file.c 파일의 n 번째행을기준으로출력 file.c 파일의 functionname 함수부분출력 (gdb) l 10 # 10 행의소스를보려고할때... (gdb) l main # main 함수부분을보려고할때... 26

GDB : Break Point b : (Break Point) 중단점설정 gdb : 명령어 (2/6) 프로그램의수행을어느곳에서멈출것인지를결정 명령 내용 b n b functionname b n if var = 0 b file.c:n b file.c:functionname b +n b -n n 번째행에서중단점설정 functionname 함수의시작부분에중단점설정 n 번째행에중단점를설정하는데, 변수 var 값이 0 일때작동 file.c 파일의 n 번째행에중단점설정 file.c 파일의 functionname 함수에중단점설정현재행에서 n 개행이후지점에중단점설정현재행에서 n 개행이전지점에중단점설정 b *0x8049000 메모리주소 0x8049000 에중단점설정 ( 어셈블러디버깅시사용 ) (gdb) b 10 # 10 행에서중단점을설정할때 (gdb) b main # main 함수에서중단점을설정할할때... 27

GDB : Break Point gdb : 명령어 (3/6) d : (Break Point) 중단점설정해제 명령 내용 d d n d functionname d file.c:10 d file.c:functionname 모든중단점설정삭제 n 번째행의중단점설정삭제 functionname 함수의시작부분에중단점설정삭제 file.c 파일의 10행의중단점설정삭제 file.c 파일의 functionname 함수의중단점설정삭제 전체출력 : 설정된중단점정보 (gdb) info b (gdb) info breakpoints 28

GDB : 프로그램실행및종료 r : (run) 프로그램실행 gdb : 명령어 (4/6) 명령 내용 r r argc1 argc2 k 프로그램실행 argc1 과 argc2 를인자로프로그램실행 프로그램수행종료 r 명령을수행하면이전에설정한중단점부분에서멈춘다. 29

GDB : 프로그램진행 프로그램진행 gdb : 명령어 (5/6) 명령 내용 s n c u finish return (step) 현재행수행후정지 ( 함수호출시, 함수내부로디버깅모드진입 ) (gdb) s 5 : s 를 5 번입력한것과동일 (next) 현재행수행후정지 ( 함수호출시, 함수수행후다음행으로이동 ) (gdb) n 5 : n 을 5 번입력한것과동일 (continue) 중단점을만날때까지계속진행 (until) 현재루프를종료현재함수를수행하고종료현재함수를수행하지않고종료 return 100 현재함수를수행하지않고종료 ( 반환값은 100) si 현재의명령을수행 ( 함수호출시, 함수내부로디버깅모드진입 ) ni 현재의명령을수행 ( 함수호출시, 함수수행후다음행으로이동 ) 30

GDB : Watch Point gdb : 명령어 (6/6) 어떤변수값이바뀔때마다브레이크를걸고싶을때사용 변수값이어떻게바뀌는지그리고어떤코드가바꾸는지에대해서확인할때편리 (gdb) watch variablename 31

gdb : 명령어실습 (1/6) 예제프로그램 [ 실습예제 ] bugprg.c #include <stdio.h> struct time { int hour; int min; int sec; } gtime = {1,2,3}, gtimes[4]; [ 실습예제 ] bugprg.c int gethour(short sw) { if(sw) return 2; else return hello(); } int main() { int lval = 2331, i; char *lstr = I like you. ; struct time *pt = &gtime; char *array[4] = { one, two, three }; int hello() { int i = 10; while(i--); return 4; } } for(i = 0; i < 100; i++) { printf( array[i] = %s\n, array[i]); gtime.hour += gethour(i % 2); } return 0; 32

소스보기 (cont d) gdb : 명령어실습 (2/6) 33

Break Point (cont d) gdb : 명령어실습 (3/6) main 함수에브레이크포인트설정 34

Break Point (cont d) gdb : 명령어실습 (4/6) 브레이크포인트리스트확인 35

프로그램실행 (cont d) gdb : 명령어실습 (5/6) r (run) 을이용해프로그램수행 브레이크포인트를걸어준 main 함수에서멈춘다. 36

프로그램실행 (cont d) gdb : 명령어실습 (6/6) s 와 n 명령어의차이점 37

gdb : 변수와레지스터 (1/10) 변수와레지스터값검사 디버거를사용하는목적은특정한시점에서메모리값과레지스터값을알기위함이다. 전체변수의출력 어떤상태에서어떤지역변수들이있으며각각의값들은무엇인지보인다. (gdb) info locals 개별변수의출력 (gdb) p [ 변수명 ] (gdb) p [ 함수명 ] # 해당변수값출력 # 해당함수의주소값출력 포인터변수의출력 (gdb) p [ 포인터변수명 ] # 해당포인터변수값출력 38

gdb : 변수와레지스터 (2/10) 변수와레지스터값검사 (cont d) 레지스터값출력 (gdb) p $[ 레지스트명 ] 전체레지스터값출력 (gdb) info registers 39

gdb : 변수와레지스터 (3/10) 변수와레지스터값검사 (cont d) 출력형식의지정 (gdb) p/[ 출력형식 ] [ 변수 ] ex) p lval : lval 변수값이 10진수형태로출력 p/x lval : lval 변수값이 16진수형태로출력 출력형식의종류 t o d u x c f a 형식 내용 2진수로출력 8진수로출력부호가있는 10진수로출력 (int) 부호가없는 10진수로출력 (unsigned int) 16진수로출력최초 1바이트값을문자형으로출력부동소수점값형식으로출력가장가까운심볼의오프셋을출력 40

gdb : 변수와레지스터 (4/10) 변수와레지스터값검사 (cont d) 화면에변하는변수값을자동으로디스플레이하기 (gdb) display [ 변수명 ] display 명령은지역변수를디스플레이하는데함수가바뀌어서변수의스코프범위를벗어나면해당변수를디스플레이하지않는다. display 관련명령어 명령어 내용 display [ 변수명 ] 변수값을매번화면에디스플레이한다. display/[ 출력형식 ] [ 변수명 ] 변수값을출력형식으로디스플레이한다. undisplay [ 디스플레이번호 ] 디스플레이설정을없앤다. disable display [ 디스플레이번호 ] 디스플레이를일시중단한다. enable display [ 디스플레이번호 ] 디스플레이를다시활성화한다. 41

gdb : 변수와레지스터 (5/10) 변수와레지스터값검사 (cont d) 전체변수의출력 (for 문으로이동후실행 ) 42

gdb : 변수와레지스터 (6/10) 변수와레지스터값검사 (cont d) 전역변수리스트출력 43

gdb : 변수와레지스터 (7/10) 변수와레지스터값검사 (cont d) 개별변수의출력 44

gdb : 변수와레지스터 (8/10) 변수와레지스터값검사 (cont d) 포인터변수의출력 45

gdb : 변수와레지스터 (9/10) 변수와레지스터값검사 (cont d) 출력형식의지정 46

gdb : 변수와레지스터 (10/10) 변수와레지스터값검사 (cont d) display 명령 47

GNU 프로젝트 GNU make 48

make 파일 (1/5) make 파일 test a.o b.o c.o x.o y.o z.o a.c b.c c.c x.c y.c z.c 49

make 파일 (2/5) make 파일 make 파일은애플리케이션의구성방법을 make에알려주는텍스트파일 대상 (target) : 대상에의존되는파일 1 [ 파일 2 ] [tab 간격 ] 명령 (command) 예제 ) 대상 test : test.c 의존부분 (dependents) 또는선결조건 (prerequisites) gcc test.c -o test 명령 : 대부분컴파일호출, 명령을사용시에는반드시텝문자로시작해야함. 50

make 파일 (3/5) make 파일생성시주의사항 각요소를구분하는데있어콤마 (,) 같은건사용하지않고공백으로한다. 명령을시작하기전에는항상 <TAB> 을넣는다. 절대스페이스키나다른키는사용해선안된다. 그밖의다른곳에서는 TAB 을사용하지말라. make 파일내에서항목의순서는중요하지않다. make 는어떤파일이어느곳에의존적인지알아내어올바른순서로명령을 수행한다. 51

make 파일예제 make 파일 (4/5) [ 예제 1] test1.c #include <stdio.h> #include a.h void func1(); void func2(); main() { printf( test1\n ); func1 (); func2 (); } [ 예제 2] test2.c #include <stdio.h> #include a.h #include b.h extern void func1() { printf( test2 \n ); } [ 예제 3] test3.c #include <stdio.h> #include b.h #include c.h extern void func2() { printf( test3 \n ); } 52

make 파일예제 (cont d) make 파일 (5/5) 1 헤더파일생성 [clickseo@comlab /]$ touch a.h [clickseo@comlab /]$ touch b.h [clickseo@comlab /]$ touch c.h 2 make 파일생성 [makefile] test: test1.o test2.o test3.o gcc -o test test1.o test2.o test3.o test1.o: test1.c a.h gcc -c test1.c test2.o: test2.c a.h b.h gcc -c test2.c test3.o: test3.c b.h c.h gcc -c test3.c 3 make 실행 53

매크로 (Macro) make 파일 : 문법규칙 (1/8) make 파일을작성하다보면같은파일이름을여러번써야하는경우가있다. 이런경우에매크로를사용하면편리하고명령을단순화시킬수있다. M_NAME = value 매크로사용시대소문자모두가능 보통대문자로쓰는것이관례이다. make 파일상단에정의 54

make 파일 : 문법규칙 (2/8) 매크로사용예제 [makefile] OBJF = test1.o test2.o test3.o test: $(OBJF) gcc -o test $(OBJF) test1.o: test1.c a.h gcc -c test1.c test2.o: test2.c a.h b.h gcc -c test2.c test3.o: test3.c b.h c.h gcc -c test3.c clean: rm $(OBJF) 매크로정의 $(OBJF) = test1.o test2.o test3.o 55

내부매크로 make 파일 : 문법규칙 (3/8) 내부매크로의미 $@ 현재목표파일의이름 $* 확장자를제외한현재목표파일의이름 $< 현재필수조건파일중첫번째파일이름 $? 현재대상보다최근에변경된필수조건파일이름 $^ 현재모든필수조건파일들 56

make 파일 : 문법규칙 (4/8) 내부매크로사용예제 [makefile] OBJF = test1.o test2.o test3.o test: $(OBJF) gcc -o $@ $^ test1.o: test1.c a.h gcc -c $< test2.o: test2.c a.h b.h gcc -c $*.c test3.o: test3.c b.h c.h gcc -c $*.c clean: rm $(OBJF) 현재대상파일의이름을의미하므로 test 를나타냄 OBJF 로정의된매크로값 현재대상파일 test1.o 가의존하는필수조건파일중첫번째파일이름을의미 test1.c 확장자.c 를제외한현재대상파일의이름을의미각각 test2, test3 을의미 57

매크로치환 make 파일 : 문법규칙 (5/8) 이미정의된매크로의내용을치환으로변경 $(M_NAME:old=new) 예제 ) OBJF = test1.o test2.o test3.o SRCS = $(OBJF:.o=.c) OBJF의확장자부분이.o에서.c로바뀌게되어 SRCS에저장된다. 결국 SRCS 는 `test1.c test2.c test3.c 를의미한다. 58

명시적규칙 make 파일 : 문법규칙 (6/8) make 가해야할일을명확히지정 암시적규칙 make 내에미리정의된규칙을이용해 make파일을단순화시키는규칙 [makefile] OBJF = test1.o test2.o test3.o test: $(OBJF) gcc -o $@ $(OBJF) clean: rm $(OBJF) make 실행시오브젝트파일을암시적규칙에따라 의존하는파일을찾고컴파일러호출까지수행한다. ( 단, 내장된규칙에의해 gcc 가아니라 cc 를호출 ) 59

접미사규칙 make 파일 : 문법규칙 (7/8) 예제 ).c.o:...1 gcc -c $< $(CFLAGS)...2 1.c.o.c 라는확장자를가진파일을사용해.o 라는확장자를가진파일을만들것임을 make에알리는역할을한다. 2 $< 확장가가.c인파일명을의미한다. $(CFLAGS) C 컴파일러를위한플래그를위해미리정의된변수 60

패턴규칙 make 파일 : 문법규칙 (8/8) 암시적규칙에의존했을경우일어나는오류방지 접미사규칙과비슷하나더뛰어난기능을가짐 [makefile] OBJF = test1_d.o test2_d.o test3_d.o test: $(OBJF) gcc -o $@ $(OBJF) 확장자.c 인모든파일에대해 _d 를붙인오브젝트파일을생성하겠다는의미 %_d.o: %.c gcc -c -g $< -o $@ -g 옵션을주어컴파일시디버깅정보를삽입 clean: rm $(OBJF) 61

LLVM 프로젝트 GNU 프로젝트 LLVM 프로젝트 clang 62

LLVM 프로젝트 LLVM 프로젝트 : llvm.org The LLVM Compiler Infrastructure LLVM 하위프로젝트 LLVM Core 라이브러리 Clang 컴파일러 LLDB 디버거 libc++ 과 libc++ ABI 프로젝트 LLVM 릴리즈 2003 년 09 월, LLVM 1.0 2018 년 05 월, LLVM 7.0.0 라이선스 : University of Illinois/NCSA Open Source License MIT/X11 라이선스와 BSD 3.0 라이선스를기반으로하는라이선스 프로그래밍언어 : C++ 63

LLVM 프로젝트 : Clang Clang 컴파일러 : clang.llvm.org 2007 년 09 월, LLVM native C/C++/Objective-C Compiler 목표 : GCC 를대체하는것 GCC와 MSVC 호환컴파일러드라이버모두를제공한다. Clang 릴리즈 2017 년 03 월, Clang 4.0.0 라이선스 : University of Illinois/NCSA Open Source License 프로그래밍언어 : C++ 64

참고문헌 [1] 이종원, IT CookBook, 우분투리눅스 ( 개정판 ) : 시스템 & 네트워크, 한빛아카데미, 2018. [2] 백창우, 유닉스리눅스프로그래밍필수유틸리티, 한빛미디어. 2010. 이강의자료는저작권법에따라보호받는저작물이므로무단전제와무단복제를금지하며, 내용의전부또는일부를이용하려면반드시저작권자의서면동의를받아야합니다. Copyright Clickseo.com. All rights reserved. 65