i-1-b. gcc가 컴파일할 때 일어나는 일들(cont'd)

52
Tools For Programmers & Shell Programming SPARCS10 이이이 /letyoursoulbefree

Upload: trankhuong

Post on 08-Feb-2017

224 views

Category:

Documents


5 download

TRANSCRIPT

Tools For Programmers & Shell Programming

SPARCS10 이유진 /letyoursoulbefree

O. 리눅스에서 프로그래밍하는것의 의미오픈소스로서의 리눅스 - 공개 Application + 커널의 소스가 공개되어있음프로그래밍 인터페이스의 편리한 제공 - GNU 컴파일러 (gcc, gdb) - perl, LISP, Tcl/Tk 도 지원함

I. 프로그래밍 하기GNU 컴파일러

gcc 컴파일러 , gdb 디버거 펄 perlTcl/Tk– 시스템 프로그래밍에는 적합하지 않으나 X 윈도우 상에서 실행되는 프로그램 작성에 유용함

I-1. GCC 컴파일러 / GDB 디버거가장 많은 기능을 가진 컴파일러

모든 C 표준 지원 + gcc 만의 확장기능 제공C++ 컴파일러 기능 제공 + C++ 클래스 라이브러리Objective C 지원

cf. gcc 기반 컴파일러 egcs C++ 기능에는 강점을 가지나 2.0 이하 커널버전을 지원하지 않음

I-1-a.gcc 로 컴파일하기역시 처음은 Hello, World!

Vim 으로 저렇게 소스코드를 만들어 준다 gcc 에게 컴파일을 부탁해

$ gcc –o start start.c

I-1-a.gcc 로 컴파일하기 (cont’d)실행 한번 해보고

내가 아까 적은게 무슨 뜻이었을까 ?

$ gcc –o start start.c한번의 명령으로 start.c 라는 소스파일을 start 라는 실행파일로 컴파일하고 링크한 뒤 바이너리를 만든다무슨소리 ?

I-1-b. gcc 가 컴파일할 때 일어나는 일들컴파일해서 오브젝트파일 만들기

start.c 에서 start.o 파일이 생긴다어떻게 생겼지 ?

아니 이게 다 뭐야 ! 오브젝트파일이 뭐지 ?

I-1-b. gcc 가 컴파일할 때 일어나는 일들(cont’d)오브젝트 파일 (object file) 의 생성

소스코드를 단순히 기계어로 만들었을 뿐 아직 완전히 excutable 하진 않음시스템에 따라 그 형식이 다르다ELF(4 바이트 문자열 ) 로 시작한다 .

I-1-b. gcc 가 컴파일할 때 일어나는 일들(cont’d)오브젝트 파일의 링킹

링커 (linker) 가 오브젝트파일을 받아서 라이브러리로 코드를 합치고 실행파일을 만든다 .라이브러리 : 수많은 오브젝트 파일의 집합정적 라이브러리- 소스에서 사용한 함수를 포함하는 오브젝트파일을 찾아서 그 함수의 코드를 추출하여 실행파일 만들 때 붙임공유 라이브러리- 근데 그 코드가 너무 길어도 그걸 붙일까 ? 자주 사용하는 공통적인 것도 ? printf (), scanf () 이런것 들- 공유 라이브 러리를 만듭니다 -> 참조만 하는 것 실행파일에는 서브루틴대신 스텁 코드를 추가해요- 실행될 때 메모리에서 링크됨

I-1-b. gcc 가 컴파일할 때 일어나는 일들(cont’d)너무 복잡해 !

I-1-b. gcc 가 컴파일할 때 일어나는 일들(cont’d)안 복잡해 !

/usr/bin/gcc 가 전처리기 cpp0 호출 -> c 컴파일러 cc1 호출 ( 컴파일 )-> 어셈블러 호출해서 오브젝트코드 만듬 -> 링커 호출 -> 링크해서 실행파일로 만드는 과정을 gcc 가 순서대로 호출함 . 다 어디에 있지 ?/usr/lib/gcc/i486-linux-gnu/4.3 밑으로 가면 있다

어떻게 움직이는지 확인합시다 .gcc -v --save-temps -o start start.c

I-1-b. gcc 가 컴파일할 때 일어나는 일들(cont’d)

gcc -v --save-temps -o like like.c-v : 컴파일 과정을 출력하는 옵션--save-temps : 컴파일중 생기는 임시파일 안 지우는 옵션( 원래 전처리파일 *.i 와 어셈블리파일 *.s 를 /tmp 에 임시로 만들고 버리는데 이걸 안 지우게 함 )전처리기와 어셈블러를 거쳐가는 것을 볼 수 있음

ls –al 해보면 위와 같은 임시파일들이 남아있는 것을 확인 .

I-1-c. gcc 로 여러 개의 소스파일 사용하기1) $ gcc –o [ 실행파일이름 ] [ 소스 1.c] [ 소스2.c]..

이건 이 세개의 명령과 같다$ gcc –c 소스 1.c$ gcc –c 소스 2.c

…$ gcc –o 실행파일이름 오브젝트 1.o 오브젝트 2.0 하지만 5 개 이상의 소스로 구성되어 있다면 어떨까 ?

차례대로 컴파일해야지 , 그런데 하나를 고쳤다면 ?안 고친 소스까지 전부 다시 컴파일 해야함 ㅠㅠ2) makefile

위에서 말한 귀찮은 일을 알아서 친절하게 처리해줌

I-1-c. gcc 로 여러 개의 소스파일 사용하기(cont’d)

make가장 적은 단계를 거쳐 파일을 만든다 .

-> 소스코드가 여러 개일 때 다 컴파일 할 필요 없게 파일을 생성하려면 어떤 파일이 필요한지 기록함 . 소스와 같은 디렉토리에 makefile 이라고 작성 .

I-1-c. gcc 로 여러 개의 소스파일 사용하기(cont’d)

I-1-c. gcc 로 여러 개의 소스파일 사용하기(cont’d)

make가장 적은 단계를 거쳐 파일을 만든다 .

-> 소스코드가 여러 개일 때 다 컴파일 할 필요 없게 파일을 생성하려면 어떤 파일이 필요한지 기록함 .명령은 시작하기 전에 탭을 , # 은 주석을 기록할때 . 소스와 같은 디렉토리에 makefile 이라고 작성 .$ make result 하면 만들어짐타임스탬프를 보고 새 파일인지 확인함

I-1-d. gcc 의 다른 기능들최적화프로그램의 소스코드에 대해 가장 빠르고 가능한 한 작은 코드를 선택함 .-O 옵션 ) $ gcc –O –o hello hello.c -O( 또는 – O1) 부터 – O3 까지 있으며 숫자가 커질수록 더 높은 수준의 최적화 ( 컴파일 시간은 더 오래 걸림 )디버깅 코드의 활성화-g 옵션 : 오브젝트 파일에 디버깅 코드를 비롯해 디버거를 사용할 때 필요한 다른 많은 정보를 추가함 정적 라이브러리와 링크되어야 하므로 바이너리 크기와 오브젝트 파일크기가 커짐개발하면서 테스트할 때만 쓰고 마지막엔 – g 옵션 없이 컴파일 하는 것을 권장 .

I-1-d. gcc 의 다른 기능들라이브러리 만들기자주 사용하는 루틴에 대해서 라이브러리를 만들어주기 : 오브젝트 파일로부터$ ar r library.a level3.o start.o$ gcc –shared –o library.so level3.0 start.0

라이브러리 인덱스를 만들어서 링커가 라이브러리에서 필요한 걸 찾을 수 있게 하자$ ranlib library.a두가지를 한번에 하려면 $ ar rs library.a level3.o start.0다음에 쓸 때는 #include library.h 하는 식으로 정적라이브러리를 쓸 수 있다

I-1-d. gcc 의 다른 기능들헤더파일을 먼저 만들어줘야 한다[ 라이브러리이름 ].h 안에 extern 호출할코드 식으로 들어있어야 함컴파일 할 때$ gcc –I[ 헤더 경로 ] –L[ 라이브러리 경로 ] –o 실행파일 소스 – lstuff-lstuff 는 라이브러리 경로에 있는 라이브러리 파일을 링크할 때 읽어오도록 한다ex)gcc –I../include –L../lib –o file file.c –lstuff

- 내가 만든 라이브러리 파일이 ../lib 에 있고 헤더 파일은 ../include 에 있을 경우

I-1-e. GDB 디버거$ gdb 파일이름

Gdb 의 실행 : $ gdb 파일이름

help 를 입력하면 명령 정보가 나옴run : 종료될때까지 실행됨until n : n 번째 줄까지 실행quit : gdb 를 종료하고 나옴

I-1-e. GDB 디버거 (cont’d)list

gcc 로 컴파일할 때 – g 옵션을 줬을때 만 유효함

실제 코드를 보여줌

I-1-e. GDB 디버거 (cont’d)Break (혹은 b)

Breakpoint 설정

run 해보면

I-1-e. GDB 디버거 (cont’d)next 와 step

두 명령 모두 코드의 바로 다음 줄을 진행step 은 호출된 다음 함수가 있을경우 거기로 진행next 는 같은 함수 안에서만 다음 줄을 진행 . 만약 다음 함수가 있으면 호출 내용을 전부 실행

print변수에 저장된 값을 확인할 수 있음

I-1-e. GDB 디버거 (cont’d)ptype : 변수의 타입이나 struct, typedef 의 정의 등 상세한 정보를 확인할 수 있음 .

구조체가 있을 경우 type = struct structname{ } 으로 표현되어 구조체 struct-name 의 정의를 알려준다 .

I-1-e. GDB 디버거 (cont’d)x : 메모리에 저장된 값을 조사함

x/nfu 로 사용 (n: 반복횟수 / f: 출력양식 /u: 단위 )f) x:16 진수 0:8 진수 t:2 진수 s: 문자열 c: 문자u) b:byte h:2 바이트 w:4 바이트

I-1-e. GDB 디버거 (cont’d)info : 디버깅 중인 프로그램의 상태정보 확인

info program : 프로그램의 실행 상태 보여줌info locals : 현재 함수 내의 모든 local변수와 변수값 보여줌

I-1-e. GDB 디버거 (cont’d)disas : 주어진 함수에 대해 disassemble 함 .

실행 파일의 바이너리를 어셈블리 코드로 만들어 주면서 인스트럭션을 볼 수 있다 .disas [ 주소 1] [ 주소 2] : 주어진 주소 범위에 대해 디스어셈블Disas [ 함수명 ] : 주어진 함수에 대해 디스어셈블

I-1-e. GDB 디버거 (cont’d)disas : 주어진 함수에 대해 disassemble 함 .

실행 파일의 바이너리를 어셈블리 코드로 만들어 주면서 인스트럭션을 볼 수 있다 .disas [ 주소 1] [ 주소 2] : 주어진 주소 범위에 대해 디스어셈블Disas [ 함수명 ] : 주어진 함수에 대해 디스어셈블

I-1-e. GDB 디버거 (cont’d)finish

실행중인 내부 함수로부터 밖으로 빠져나감 quit

gdb 를 마침 . 아직 실행 중일때는 프로그램이 실행 중이라는 경고메시지 나옴

I-1-f. GDB 디버거 / 코어파일의 분석코어 파일의 분석파일이 실행되다가 비정상적으로 종료될 경우 그 때의 메모리 이미지를 덤프한 것 .

$ gdb level3 core파일 level3 이 비정상종료되면서 덤프된 것을 gdb 로 확인

I-1-f. GDB 디버거 / 코어파일의 분석코어 파일의 분석파일이 실행되다가 비정상적으로 종료될 경우 그 때의 메모리 이미지를 덤프한 것 .

$ gdb level3 core파일 level3 이 비정상종료되면서 덤프된 것을 gdb 로 확인

I-1-f. GDB 디버거 / 코어파일의 분석Backtrace : 충돌한 시점에서 현재 call stack 상태를 보여줌 .

frame n : call stack 의 스택프레임 중에 n번째꺼 선택 .

I-1-f. GDB 디버거 / 코어파일의 분석up : 현재보다 위에 있는 스택프레임으로 이동down : 아래에 있는 스택프레임으로 이동

I-1-g. GDB 디버거 / 실행중에 디버깅하기실행중인 프로그램 디버깅하기

gdb 로 실행중인 프로그램 실행 한 뒤 attach 로 pid를 붙임

gdb 가 실행되면 attach [pid] 를 쓰면 됨여기서는 (gdb) attach 17958

I-1-g. GDB 디버거 / 실행중에 디버깅하기실행중인 프로그램 디버깅하기

I-1-g. GDB 디버거 / 실행중에 디버깅하기실행중인 프로그램 디버깅하기

gdb 가 실행중인 프로세스에 붙으면 프로그램을 일시중지시키고 제어권을 gdb 로 가져온다attach 와 반대로 detach 하면 gdb 를 프로세스에서 떼어낸다 -> 소스파일을 수정하고 다시 컴파일하면 됨 .

2. 쉘 프로그래밍들어가기 전에 ㅡ 쉘이란 ?

명령어 해석기사람이 쓰는걸 받아서 커널로 전달csh, bash, ksh, tcsh 등이 있음휠 세미나 자료 복습합시다 ㅋ _ㅋ 쉘마다 조금씩 차이가 있어요

지금 무슨 쉘을 쓰고있을까$ cat /etc/passwd

2. 쉘 프로그래밍

2. 쉘 프로그래밍쉘 스크립트에서 자주 쓰는 명령어 알기

echo “hi!” : 따옴표 안의 내용 출력grep ‘pattern’ file : 파일에서 ‘’안의 문자열 찾기cub –b column file : 파일에서 문자열을 컬럼단위로 잘라서 보여줌file filename : filename 의 파일타입 알아냄read var : 입력값을 변수 var 에 대입tee : 표준 출력되는 정보를 파일로 쓰기basename file : 디렉토리명 제외한 파일이름dirname file : 파일이름 제외한 디렉토리이름sed : 정규표현에 의한 문자열의 검색 및 치환

2-1. 스크립트를 만들어요시작은 hello world 부터

편집기를 열고 씁시다 – vi 사용

권한에 – x 추가 ( 실행될 수 있게 )./hello

2-1-a. 변수 만들기변수 만들기

2-1-a. 변수 만들기변수 만들기 (2)

두 줄의 차이가 어떻게 다를까 ?

2-1-b. 제어문 (1)-ifIf 문 : 참이라면 then 이하를 실행 거짓이면 else 이하를 실행If~~ 로 시작해서 ~~fi 로 끝남[ -f "file" ] : file 이 파일인지를 테스트 한다 .[ -x "/bin/ls" ] : /bin/ls 가 실행파일인지를 검사한다 .[ -n "$var" ] : $var 변수에 어떤 값이 대입되어 있는지를 검사한다 .[ "$a" = "$b" ] : $a 와 $b 가 같은지 검사한다

2-1-b. 제어문 (2)-if아래와 같은 쉘스크립트 test 를 짠다

./test

2-1-b. 제어문 (3)좀 더 간단히 표현하기

&& 과 ||

2-1-b. 제어문 (4) - caseCase 문

./filetype

2-1-b. 제어문 (5) - selectselect 문

./select

2-1-b. 제어문 (6) - whileWhile 문 : while do ~ done

./while

2-1-b. 제어문 (6) - forfor 문

./for

2-1-c. 함수만들기함수만들기funcname(){ 여기에 넣는 내용 !}./add

2-1-c. 함수만들기함수만들기funcname(){ 여기에 넣는 내용 !}./add

수고하셨습니다