C프로그래밍 도구 컴퓨터공학과 강성인
vi 에디터의 다중 파일 편집 파일 버퍼 파일버퍼 관련 명령 :ls - 버퍼의 내용을 나열 :b[N] - N번 버퍼로 이동 :bw[N] - N번 버퍼를 삭제, N이 없으면 현재의 버퍼 삭제 :bf, :bl - 첫 번째, 마지막 버퍼로 이동 :sb[N] - 창을 수평 분할하여 N번 버퍼를 로드
vi 에디터의 다중 창 사용 다중 창 기능 다중 창 기능 관련 명령 : vi 에디터의 화면을 분할해서 사용하는 방법 Ctrl+w n : 새로운 수평 창 생성 Ctrl+w s : 현재파일을 두개의 수평창으로 나눔 Ctrl+w v : 새로운 수직창 생성 Ctrl+ww : 창을 순차적으로 이동 Ctrl+wr : 창을 순차적으로 위치이동 Ctrl+w _ : 수평분할에서 창의 크기 최대화 Ctrl+w | : 수직분할에서 창의 크기 최대화 Ctrl+w = : 창의크기를 모두 균등하게 분할
11.1 C 언어 번역(컴파일): cc or gcc, make 디버깅: dbx, gdb 라이브러리 유지: ar 프로파일링: prof (수행감시 최적화) 소스코드를 지원하는 도구: sccs
gcc GNU에서 만든 c 컴파일러 현전하는 컴파일러 중 가장 많은 CPU 아키텍처를 지원, ARM, DEC, AVR, i386, SPARC, … gcc는 실제 컴파일 과정을 담당하는 것이 아닌, 전처리기, c컴파일러, 어셈블러, 링커를 각각 호출하는 역할을 한다. /usr/lib/gcc-lib/i386-redhat-linux/3.2.2 전처리기 cpp0 test.c test.i C 컴파일러 cc1 test.s 어셈블리 파일 어셈블러 as test.o 오브젝트 링커 ld test.exe 실행 gcc 컴파일 과정
gcc 옵션 -S 어셈블리 파일로 컴파일, filename.s 파일 생성 -c 어셈블러(as)로 어셈블까지만 수행, 링크는 수행하지 않는다. filename.o 파일 생성 -w 모든 경고메시지 제거 -W -Wall -Wall 은 모든 모호한 문법에 대한 경고 메시지 출력, -W 합법적이지만 모호한 코딩에 대한 부가적인 정보제공 -O[최적화레벨] 최적화 레벨 : 0, 1, 2, 3, s -g gdb에게 제공하는 정보를 바이너리에 삽입한다. gdb로 디버깅 시에 소스를 보면서 디버깅이 가능해진다. -L, -l -L[라이브러리 디렉토리] : 라이브러리를 찾을 디렉토리 지정, -l[라이브러리 이름] : 링크할 라이브러리 지정 -o 실행 파일 이름 지정
11.2 단일모듈 프로그램 프로그램 번역 프로그램 작성 및 실행 컴파일 하기 gcc SourceFile -o ExecutableFile -o : 실행 파일 이름 명시, 디폴트는 a.out (예) $ gcc reserve.c a.out 실행파일 생성 $ gcc reserve.c -o reverse reverse 실행파일 생성 에러발생 메시지 출력, 실행파일 생성 안됨 에러 수정 후 컴파일 성공 실행 파일 생성 프로그램 작성 및 실행 소스 파일 작성 :emacs, vi 편집기 사용 번역(Compile) 링크(Link) 실행
11.3 다중 모듈 프로그램 다중모듈 프로그램 재사용 함수 목적 모듈 링크 새 프로그램 개발 시 기존의 프로그램 활용 cut and paste : 동일코드중복 다중모듈 프로그램 : 함수 공유, 유용 재사용 함수 특정 기능 수행부분을 별도로 독립시켜 번역 목적 모듈끼리 링크 시켜 실행(reusable) 목적 모듈 작성 : gcc의 -c 옵션 사용 목적 모듈 링크 gcc -c SourceList : -c 옵션 사용 gcc -c reverse.c main1.c reverse.o, main.o 목적모듈 생성 gcc reverse.o main1.o -o main1 main1 실행파일 생성
$gcc -c palindrome.c $gcc -c main2.c $gcc reverse.o palindrome.o main2.o -o main2 $ls -l reverse.o palindrome.o main2.o main2 -rwxr-xr-x 1 sikang sikang 12172 May 28 22:35 main2* -rw-r--r-- 1 sikang sikang 964 May 28 22:35 main2.o -rw-r--r-- 1 sikang sikang 788 May 28 22:35 palindrome.o -rw-r--r-- 1 sikang sikang 772 May 28 21:46 reverse.o $main2 palindrome("cat")=0 palindrome("noon")=1
11.3 다중 모듈 프로그램 Ld 여러 목적모듈 링크 시에 호출되는 유닉스의 독립적인 로더 명시된 목적모듈과 라이브러리 모듈을 서로 링크하여 실행파일 생성 ld -n -Lpath* objModule* library* -lx* [ -o outputfile] -o : 실행파일이름 지정, 디폴트는 a.out -n : 동적 링크 모듈에 반대되는 독립적 수행파일 생성 -lx : ld의 표준 디렉토리(/lib, /usr/lib, /usr/local/lib) 탐색 libx.a 이름의 라이브러리 탐색 -L : -lx 옵션에 탐색경로 추가 (위 세 경로 외) Ex) ld –n /lib/crt0.o main1.o reverse.o –lc –o main1 목적모듈: /lib/crt0.o 라이브러리모듈: /lib/libc.a
11.3 다중 모듈 프로그램 다중모듈 프로그램 유지 make ar sccs (Source Code Control System) 유닉스 파일 의존 시스템 목적모듈과 실행 파일의 최신버전의 유지를 보증 ar 유닉스 파일 보관 시스템 목적 모듈을 저장 sccs (Source Code Control System) 유닉스 소스 코드 관리 시스템 소스 파일과 헤더 파일들의 각 버전을 추적
11.4 유닉스 파일 의존 시스템 : Make 기능 다중 모듈 프로그램의 재사용을 유지하고, 프로그램 수정에 대한 재번역을 최소화 makefile 파일의 상호 의존 관계의 목록 make make파일을 참조하여 파일을 최신버전으로 개정 make [ -f makefile ] -f : 파일이름 명시, 기본이름 : makefile 복수개의 파일과 목적 파일 컴파일 makefile 이름에 제한이 없으나 파일 이름 뒤에 .make 표기 권장
11.4 유닉스 파일 의존 시스템 : Make makefile 작성 및 규칙 targetList : dependencyList commandList targetList : 목적 파일 목록 dependencyList : 의존 파일 목록 commandList: 명령어 목록 main1 : main1.o reverse.o gcc main1.o reverse.o -o main1 main1.o : main1.c reverse.h gcc -c main1.c reverse.o : reverse.c reverse.h gcc -c reverse.c
11.4 유닉스 파일 의존 시스템 : Make main1 main1.o reverse.o main1.c reverse.h (예) 규칙을 순서대로 조사하면서 상호 의존 트리를 작성 make는 leaf노드에서 root노드까지 진행하면서 부모 노드의 마지막 수정시간이 자식노드의 수정시간보다 이전이거나 없으면 명령어 목록대로 수행 main1 main1.o reverse.o main1.c reverse.h reverse.c
11.4 유닉스 파일 의존 시스템 : Make make 실행 (예) $ make [-f main2.make] makefile 이 아닌 경우 결과) cc -c main2.c cc -c palindrome.c cc main2.o reverse.o palindrome.o –o main2 Make Rules: make 시스템의 추론기능 컴파일 명령의 제거 가능 cc –c *.c 소스파일명의 제거 가능 *.c *.o
11.4 유닉스 파일 의존 시스템 : Make Make Rules: make 시스템의 추론기능 컴파일 명령의 제거 가능 cc –c *.c main2: main2.o reverse.o palindrome.o cc main2.o reverse.o palindrome.o -o main2 main2.o: main2.c palindrome.h cc –c main2.c => 생략가능 reverse.o: reverse.c reverse.h cc –c reverse.c => 생략가능 palindrome.o: palindrome.c palindrome.h reverse.h cc –c palindrome.c => 생략가능
11.4 유닉스 파일 의존 시스템 : Make Make Rules: make 시스템의 추론기능 소스파일명의 제거 가능 *.c *.o main2: main2.o reverse.o palindrome.o cc main2.o reverse.o palindrome.o -o main2 main2.o: main2.c palindrome.h reverse.o: reverse.c reverse.h palindrome.o: palindrome.c palindrome.h reverse.h
11.4 유닉스 파일 의존 시스템 : Make touch 매크로(Macros) 그 외 정보들 지정된 파일의 수정일자를 현재의 시스템 시간으로 변경 touch -c { fileName } + -c : 지정한 파일이 없을 경우 파일 생성 금지 매크로(Macros) make에서 지원하는 기능 make 파일 내에 모든 $(token)는 replacementText로 대치 token = replacementText Ex) CFLAGS= -o CFLAGS= -p 그 외 정보들 $ man make
11.5 유닉스 파일 보관 시스템 : AR ar makefile의 단점 ar (archive) 유틸리티 : 목적모듈을 구성하고 그룹화 시키기 위한 유닉스 파일 보관 시스템 librarian으로 알려짐 .a 확장자를 갖는 특별한 archive 형식의 파일 생성 archive 파일에 어떤 유형의 파일이라도 추가하고, 삭제하고, 바꾸고, 덧붙인다. archive의 목차(table of content)를 제공한다. ar 사용자가 archive를 생성하고, 다룰 수 있게 한다. archive 파일로부터 필요로 하는 목적 모듈은 필요에 따라 자동적으로 링크 목적모듈 링크 시에 유틸리티에 대한 매개변수 감소로 효율성 증대
11.5 유닉스 파일 보관 시스템 : AR ar key archiveName fileName + archiveName key Archive 파일명, .a로 끝나도록 되어 있음 key d archive로부터 파일을 삭제 q 이미 존재하고 있어도 archive 파일의 끝에 덧붙임 r 파일이 archive 내에 존재하지 않으면 추가하고 , 존재하면 현재 버전을 치환 t 표준출력으로 archive의 목차를 보여 줌 x archive로부터 파일들을 현재의 디렉토리로 복사 v 긴 출력으로 보여 줌
11.5 유닉스 파일 보관 시스템 : AR Archive의 생성 파일의 추가 첫 번째 파일 추가 시에 자동 생성 파일의 추가 명명된 archive에 파일을 추가, 없을 시 생성 ar r archiveName { fileName } + 파일 덧붙이기 기존의 archive 파일에 목록이 있어도 무조건 덧붙임 ar q archiveName { fileName } + 기존 파일의 존재 여부를 검사 하지 않아 빠름
11.5 유닉스 파일 보관 시스템 : AR 목차 얻기 ar t archiveName { fileName } + 파일 제거 ar d archiveName { fileName }+ 파일 추출 archive로부터 파일들을 현재의 디렉토리로 복사, 디폴트는 모든 파일 추출 ar x archiveName { fileName } +
$cc -c reverse.c palindrome.c main2.c $ar r string.a reverse.o palindrome.o $ar t string.a reverse.o palindrome.o $cc main2.o string.a -o main2 $main2 palindrome("cat")=0 palindrome("noon")=1 $ar d string.a reverse.o $ar r string.a reverse.o $ar t string.a palindrome.o reverse.o $rm palindrome.o reverse.o rm: remove regular file `palindrome.o'? y rm: remove regular file `reverse.o'? y $ls *.o main2.o $ar x string.a reverse.o main2.o reverse.o
11.5 유닉스 파일 보관 시스템 : AR Make 시스템을 이용한 archive 유지 makefile내에 목적 모듈을 대신하여 archive 파일을 선언 할 수 있음 =>Archive의 이름 뒤에 목적 파일 이름을 괄호 안에 위치 archive 파일의 유지 상태에 따라 makefile이 자동적으로 유지 main2: main2.o string.a(reverse.o) string.a(palindrome.o) cc main2.o string.a –o main2 main2.o: palindrome.h string.a(reverse.o): reverse.h string.a(palindrome.o): palindrome.h reverse.h
11.5 유닉스 파일 보관 시스템 : AR Archive 순서 정하기 ranlib archive + 기본적으로 목적 모듈의 순서는 무관함 목적모듈 생성에 있어서 순서에 영향을 받을 경우(구형) loader 와 tsort를 이용해 archive 파일 내의 순서 정렬 ar cr string2.a `lorder string.a | tsort` 목차(A table of Contents) 생성 ranlib : 명시된 archive에 목차를 추가 archive내에 _SYMDEF라는 엔트리를 삽입함 ranlib archive + 예) ranlib string.a
매크로의 사용 매크로의 정의 NAME=string 매크로 사용규칙 미리 정의된 매크로 매크로의 참조 : 소괄호나 중괄호로 둘러싸고 앞에 ‘$’를 붙인다. 정의되지 않은 매크로를 참조할 때는 NULL문자열로 치환된다. 중복된 정의는 최후에 정의된 값을 사용한다. 매크로 정의 시 이전에 정의된 매크로를 참조해서 정의할 수 있다. NAME= my $(NAME) 미리 정의된 매크로 AS = as (어셈블러) ASFLAGS = (어셈블러 옵션) CC = cc(or gcc) (C 컴파일러) CFLAGS = (C 컴파일러의 옵션) CXX = g++(C++컴파일러) LD = ld (링크) LDFLAGS = (링크 옵션) CPP = cc –E (전처리기) 내부 매크로 $* : 확장자가 없는 현재 파일의 목표 파일 $@ : 현재의 목표파일 $^ : 현재 목표파일의 종속항목 리스트 $< : 현재의 목표파일 보다 더 최근에 갱신된 종속항목리스트(확장자 규칙) $? : 현재의 목표파일 보다 더 최근에 갱신된 종속항목리스트
Make 파일 예제 main2: main2.o reverse.o palindrome.o cc main2.o reverse.o palindrome.o -o main2 main2.o: main2.c palindrome.h cc –c main2.c reverse.o: reverse.c reverse.h cc –c reverse.c palindrome.o: palindrome.c palindrome.h reverse.h cc –c palindrome.c CC = gcc CFLAGS = -W -Wall TARGET = main2 OBJECTS = main2.o reverse.o palindrome.o $(TARGET): $(OBJECTS) $(CC) $(CFLAGS) $^ -o $@ main2.o: palindrome.h reverse.o: reverse.h palindrome.o: palindrome.h reverse.h
11.9 유닉스 디버거 : gdb 디버그를 위한 프로그램 준비 실행방법 종료방법 : Ctrl + d : cc의 -g 옵션으로 프로그램을 번역 gcc에서도 –g 옵션 ⇒ 목적 모듈 내에 여러 디버깅 정보 포함 실행방법 gdb [프로그램명] gdb [프로그램명] [실행중인 PID] 종료방법 : Ctrl + d 소스보기 : l l [행번호] l [파일명]:[함수명] set listsize 20 : 출력되는 행의 수를 20으로 변경 브레이크 포인트 : b, cl, d b file.c:func : file.c 파일의 func 함수의 시작 부분에 설정 b 10 : 10행에 설정 b +2 : 현재 행에서 2개 행 이후 지점에 설정 b -2 : 현재 행에서 2개 행 이전 지점에 설정 info b: 현재 설정된 브레이크 포인트를 출력 브레이크 포인트 지우는 명령: cl 포인트어드레스 d : 모든 브레이크 포인트 삭제
프로그램 수행 u : 반복문에서 빠져나온다. r arg1 arg2 : arg1과 arg2를 인자로 프로그램 수행 k : 프로그램 수행 종료 s : 브레이크 포인트에서 멈춘 프로그램에서 현재 행을 수행하고 멈춘다. n : s와 같은 기능이나 브레이크 포인트에 있는 함수 호출 시 내부로 들어가지 않고 바로 수행 c : 브레이크 포인트를 만날 때 까지 계속 수행 u : 반복문에서 빠져나온다. finish : 현재 수행하는 함수의 끝으로 이동한다. return : 현재 수행중인 함수를 빠져 나온다.
변수 값 추적 출력형식 p /[출력형식] [변수명] : 해당 변수 값 p ‘파일명’::[변수명] : 특정 파일의 전역변수 p [함수명]::[변수명]: 특정 함수의 static 변수 info locals : 현재 상태의 지역변수 리스트 출력형식 t : 2진수로 출력 o : 8진수로 출력 d : 부호가 있는 10진수(int)로 출력 u : 부호가 없는 10진수(unsigned int)로 출력 x : 16진수로 출력 c : 최초 1바이트 값을 문자형으로 출력 f : 부동 소수점 값 형식으로 출력