1 / 52

Tools For Programmers & Shell Programming

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

baird
Download Presentation

Tools For Programmers & Shell Programming

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. Tools For Programmers & Shell Programming SPARCS10 이유진/letyoursoulbefree

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

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

  4. I-1. GCC컴파일러 / GDB 디버거 • 가장 많은 기능을 가진 컴파일러 • 모든 C표준 지원 + gcc만의 확장기능 제공 • C++컴파일러 기능 제공 + C++클래스 라이브러리 • Objective C 지원 • cf. gcc기반 컴파일러 egcs • C++ 기능에는 강점을 가지나 2.0이하 커널버전을 지원하지 않음

  5. I-1-a.gcc로 컴파일하기 • 역시 처음은 Hello, World! • Vim으로 저렇게 소스코드를 만들어 준다 • gcc에게 컴파일을 부탁해 • $ gcc –o start start.c

  6. I-1-a.gcc로 컴파일하기(cont’d) • 실행 한번 해보고 • 내가 아까 적은게 무슨 뜻이었을까? • $ gcc –o start start.c • 한번의 명령으로 start.c라는 소스파일을 start 라는 실행파일로 컴파일하고 링크한 뒤 바이너리를 만든다 무슨소리?

  7. I-1-b. gcc가 컴파일할 때 일어나는 일들 • 컴파일해서 오브젝트파일 만들기 • start.c에서 start.o파일이 생긴다 • 어떻게 생겼지? • 아니 이게 다 뭐야! 오브젝트파일이 뭐지?

  8. I-1-b. gcc가 컴파일할 때 일어나는 일들(cont’d) • 오브젝트 파일(object file)의 생성 • 소스코드를 단순히 기계어로 만들었을 뿐 아직 완전히 excutable하진 않음 • 시스템에 따라 그 형식이 다르다 • ELF(4바이트 문자열)로 시작한다.

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

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

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

  12. I-1-b. gcc가 컴파일할 때 일어나는 일들(cont’d) • gcc -v --save-temps -o like like.c • -v : 컴파일 과정을 출력하는 옵션 • --save-temps : 컴파일중 생기는 임시파일 안 지우는 옵션 (원래 전처리파일*.i와 어셈블리파일 *.s를 /tmp에 임시로 만들고 버리는데 이걸 안 지우게 함) • 전처리기와 어셈블러를 거쳐가는 것을 볼 수 있음 • ls –al 해보면 위와 같은 임시파일들이 남아있는 것을 확인.

  13. 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 • 위에서 말한 귀찮은 일을 알아서 친절하게 처리해줌

  14. I-1-c. gcc로 여러 개의 소스파일 사용하기(cont’d) • make • 가장 적은 단계를 거쳐 파일을 만든다. ->소스코드가 여러 개일 때 다 컴파일 할 필요 없게 • 파일을 생성하려면 어떤 파일이 필요한지 기록함. • 소스와 같은 디렉토리에makefile이라고 작성.

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

  16. I-1-c. gcc로 여러 개의 소스파일 사용하기(cont’d) • make • 가장 적은 단계를 거쳐 파일을 만든다. ->소스코드가 여러 개일 때 다 컴파일 할 필요 없게 • 파일을 생성하려면 어떤 파일이 필요한지 기록함. • 명령은 시작하기 전에 탭을, #은 주석을 기록할때. • 소스와 같은 디렉토리에makefile이라고 작성. • $ make result 하면 만들어짐 • 타임스탬프를 보고 새 파일인지 확인함

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

  18. 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하는 식으로 정적라이브러리를 쓸 수 있다

  19. 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에 있을 경우

  20. I-1-e. GDB디버거 • $ gdb파일이름 • Gdb의 실행 : $ gdb파일이름 • help를 입력하면 명령 정보가 나옴 • run : 종료될때까지 실행됨 • until n : n번째 줄까지 실행 • quit : gdb를 종료하고 나옴

  21. I-1-e. GDB디버거(cont’d) • list • gcc로 컴파일할 때 –g 옵션을 줬을때 만 유효함 • 실제 코드를 보여줌

  22. I-1-e. GDB디버거(cont’d) • Break (혹은 b) • Breakpoint 설정 • run 해보면

  23. I-1-e. GDB디버거(cont’d) • next와 step • 두 명령 모두 코드의 바로 다음 줄을 진행 • step은 호출된 다음 함수가 있을경우 거기로 진행 • next는 같은 함수 안에서만 다음 줄을 진행. 만약 다음 함수가 있으면 호출 내용을 전부 실행 • print • 변수에 저장된 값을 확인할 수 있음

  24. I-1-e. GDB디버거(cont’d) • ptype : 변수의 타입이나 struct, typedef의 정의 등 상세한 정보를 확인할 수 있음. • 구조체가 있을 경우 type = structstructname{ }으로 표현되어 구조체 structname의 정의를 알려준다.

  25. 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바이트

  26. I-1-e. GDB디버거(cont’d) • info : 디버깅 중인 프로그램의 상태정보 확인 • info program : 프로그램의 실행 상태 보여줌 • info locals : 현재 함수 내의 모든 local변수와 변수값 보여줌

  27. I-1-e. GDB디버거(cont’d) • disas : 주어진 함수에 대해 disassemble함. • 실행 파일의 바이너리를 어셈블리 코드로 만들어 주면서 인스트럭션을 볼 수 있다. • disas [주소1] [주소2] : 주어진 주소 범위에 대해 디스어셈블 • Disas [함수명] : 주어진 함수에 대해 디스어셈블

  28. I-1-e. GDB디버거(cont’d) • disas : 주어진 함수에 대해 disassemble함. • 실행 파일의 바이너리를 어셈블리 코드로 만들어 주면서 인스트럭션을 볼 수 있다. • disas [주소1] [주소2] : 주어진 주소 범위에 대해 디스어셈블 • Disas [함수명] : 주어진 함수에 대해 디스어셈블

  29. I-1-e. GDB디버거(cont’d) • finish • 실행중인 내부 함수로부터 밖으로 빠져나감 • quit • gdb를 마침. 아직 실행 중일때는 프로그램이 실행 중이라는 경고메시지 나옴

  30. I-1-f. GDB디버거/코어파일의 분석 • 코어 파일의 분석 • 파일이 실행되다가 비정상적으로 종료될 경우 그 때의 메모리 이미지를 덤프한 것. • $ gdb level3 core • 파일 level3이 비정상종료되면서 덤프된 것을 gdb로 확인

  31. I-1-f. GDB디버거/코어파일의 분석 • 코어 파일의 분석 • 파일이 실행되다가 비정상적으로 종료될 경우 그 때의 메모리 이미지를 덤프한 것. • $ gdb level3 core • 파일 level3이 비정상종료되면서 덤프된 것을 gdb로 확인

  32. I-1-f. GDB디버거/코어파일의 분석 • Backtrace : 충돌한 시점에서 현재 call stack 상태를 보여줌. • frame n : call stack의 스택프레임 중에 n번째꺼 선택.

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

  34. I-1-g. GDB디버거/실행중에 디버깅하기 • 실행중인 프로그램 디버깅하기 • gdb로 실행중인 프로그램 실행 한 뒤 attach로 pid를 붙임 • gdb가 실행되면 attach [pid]를 쓰면 됨 • 여기서는 (gdb) attach 17958

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

  36. I-1-g. GDB디버거/실행중에 디버깅하기 • 실행중인 프로그램 디버깅하기 • gdb가 실행중인 프로세스에 붙으면 프로그램을 일시중지시키고 제어권을gdb로 가져온다 • attach와 반대로 detach하면 gdb를 프로세스에서 떼어낸다 ->소스파일을 수정하고 다시 컴파일하면 됨.

  37. 2. 쉘 프로그래밍 • 들어가기 전에 ㅡ쉘이란? • 명령어 해석기 • 사람이 쓰는걸 받아서 커널로 전달 • csh, bash, ksh, tcsh등이 있음 • 휠 세미나 자료 복습합시다 ㅋ_ㅋ • 쉘마다 조금씩 차이가 있어요 • 지금 무슨 쉘을쓰고있을까 • $ cat /etc/passwd

  38. 2. 쉘 프로그래밍

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

  40. 2-1. 스크립트를 만들어요 • 시작은 hello world부터 • 편집기를 열고 씁시다 – vi 사용 • 권한에 –x추가 (실행될 수 있게) • ./hello

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

  42. 2-1-a.변수 만들기 • 변수 만들기(2) • 두 줄의 차이가 어떻게 다를까?

  43. 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 가 같은지 검사한다

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

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

  46. 2-1-b. 제어문(4) - case • Case문 • ./filetype

  47. 2-1-b. 제어문(5) - select • select문 • ./select

  48. 2-1-b. 제어문(6) - while • While문 : while do ~ done • ./while

  49. 2-1-b. 제어문(6) - for • for문 • ./for

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

More Related