520 likes | 696 Views
Tools For Programmers & Shell Programming. SPARCS10 이유진 / letyoursoulbefree. O. 리눅스에서 프로그래밍하는것의 의미. 오픈소스로서의 리눅스 - 공개 Application + 커널의 소스가 공개되어있음 프로그래밍 인터페이스의 편리한 제공 - GNU 컴파일러 ( gcc , gdb ) - perl , LISP, Tcl / Tk 도 지원함. I. 프로그래밍 하기. GNU 컴파일러
E N D
Tools For Programmers & Shell Programming SPARCS10 이유진/letyoursoulbefree
O. 리눅스에서프로그래밍하는것의 의미 • 오픈소스로서의리눅스 - 공개 Application + 커널의 소스가 공개되어있음 • 프로그래밍 인터페이스의 편리한 제공 - GNU컴파일러(gcc, gdb) - perl, LISP, Tcl/Tk도 지원함
I. 프로그래밍 하기 • GNU 컴파일러 • gcc컴파일러, gdb디버거 • 펄perl • Tcl/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 • 라이브러리 인덱스를 만들어서 링커가 라이브러리에서 필요한 걸 찾을 수 있게 하자 • $ ranliblibrary.a • 두가지를 한번에 하려면 $ arrslibrary.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 = structstructname{ }으로 표현되어 구조체 structname의 정의를 알려준다.
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. 쉘 프로그래밍 • 쉘 스크립트에서 자주 쓰는 명령어 알기 • 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)-if • If문 : 참이라면 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) - case • Case문 • ./filetype
2-1-b. 제어문(5) - select • select문 • ./select
2-1-b. 제어문(6) - while • While문 : while do ~ done • ./while
2-1-b. 제어문(6) - for • for문 • ./for
2-1-c. 함수만들기 • 함수만들기 funcname() { 여기에 넣는 내용! } • ./add