본문 바로가기

대학교 2학년 1학기/리눅스 프로그래밍

프로그램 개발 도구

728x90

프로그램 개발 도구 (C언어)

- 컴파일: gcc, make

- 디버깅: gdb

- 라이브러리 유지: ar

 

gcc: 컴퓨터가 이해할 수 있는 기계어 형태로 변환하는 작업을 하는 툴

전처리 단계 -> 컴파일 단계 -> 어셈블 단계 -> 링크 단계

 

1. 전처리 단계

cpp: 소스파일의 #include#define과 같은 전처리기 부분을 처리. 헤더를 삽입하고 실행 문장의 매크로를 상수로 반환

2. 컴파일 단계

- 어셈블리어로 된 파일을 생성 (파일이 생성되지만 보통 디스크에는 저장되지 않음)

3. 어셈블 단계

- 어셈블리어 파일을 기계가 이해할 수 있는 오브젝트 파일로 변환

4. 링크 단계

- 오브젝트 파일은 라이브러리 함수에 해당하는 코드가 없어서 실행할 수 없다. 또한 여러 파일로 이루어진 프로그램의 경우에도 파일 간의 연결 과정이 이루어져 있지 않기 때문에 실행할 수 없다. 이러한 라이브러리 함수나 다른 오브젝트 파일들을 연결해주는 작업이 링크 단계이다.

 

gcc파일 확장자

.c : C 소스 파일

.i : 전처리된 C 파일 (-P 옵션)

.s : 어셈블리어로 된 파일 (-S 옵션)

.o : 오브젝트 파일 (-c 옵션)

.a .so : 컴파일된 라이브러리 파일

 

컴파일 과정

.c 확장자를 가진 파일을 생성하여 저장한다.

gcc "소스파일이름"의 구조를 입력하면 gcc를 이용하여 컴파일을 진행한다.

a.out이라는 파일이 추가로 생성되고 "./a.out"을 입력하여 실행한다.

 

gcc 옵션

-c : 소스 파일을 컴파일만 하고 링크를 수행하지 않는다. 오브젝트 파일이 생성된다. (object 모듈 작성)

ex) gcc -c main.c / gcc -c hi.c -> gcc main.o hi.o -o test2

cf) 실행 파일이 만들어지기 전인 오브젝트 파일은 나중에 링크하는 것이 가능하다. 이 기능으로 수정시

전체 파일이 아닌 해당 소스가 들어있는 오브젝트 파일만 수정하면 된다.

만약 h1.c 파일이 수정되었다고 하면 gcc -c hi.c -> gcc mian.o hi.o -o test2

-o : 바이너리 형식의 출력 파일 이름을 지정한다. 지정하지 않으면 기본 출력인 a.out이 적용되어 결과물이 만들어진다.

ex) gcc -o file file.c (실행 파일 이름을 a.out이 아닌 file로 지정)

-g : 바이너리 파일에 표준 디버깅 정보를 포함시킨다.

 

 

ar: 많은 파일들을 하나의 묶음 파일에 보관

 

make : 수정된 파일들에 따라 필요한 작업만 하도록 처리하는 명령어

- 다중 모듈 프로그램에서 수정된 부분만 재 컴파일

makefile: 어떤 일을 해야 하는지 make에 알려줄 정보를 담고 있는 파일

- makefile 작성 및 규칙

targetList: dependencyList

       commandList (줄 시작 부분에 탭 키 필수)

- targetList : 목적 파일 목록 (공백 문자로 구분)

- dependencyList : 의존 파일 목록 (공백 문자로 구분), 없으면 무조건

- commandList : 명령어 목록 (명령열, 여러 줄 가능)

동작: 처음 나오는 targetList의 파일들에서 시작해서 dependencyList 파일들을 찾아가면서 commandList 명령어를 실행

 

파일 구성 조건

- 실행파일 myprog 는 main.c myprog.c를 컴파일하여 생성

- main.c myprog.c 는 모두 myprog.h 를 포함

makefile 예시

myprog : main.o myprog.o

      gcc -o myprog main.o myprog.o

main.o: main.c myprog.h

      gcc -c main.c

myprog.o: myprog.c myprog.h

      gcc -c myprog.c

 

리눅스 소스 레벨 디버거: gdb

Gdb 사용법

- run (r) : 실행을 시작

- next (n) : 한 줄 실행 후 다음 줄에서 정지

- step (s) : next와 같으나 함수인 경우 함수의 소스코드로 이동

- quit (q) : gdb 종료

- print (p) : 변수의 현재 값 출력

- list (l) : 소스코드 출력

- break (b) : 정지점 설정 (실행 중 정지할 소스코드 위치 지정)

- info break (i b) : 지정된 정지점들의 목록 출력

- delete (d) : 정지점 삭제

- continue (c) : 다음 정지점을 만날 때까지 실행을 계속

- backtrace (bt) : 현재 실행 중인 함수까지의 호출 과정 정보 출력

 

 

 

728x90

'대학교 2학년 1학기 > 리눅스 프로그래밍' 카테고리의 다른 글

소프트웨어 관리  (0) 2022.06.23
리눅스 부팅과 종료  (0) 2022.06.23
사용자 관리  (0) 2022.05.20
쉘 스크립트 프로그래밍 (2)  (0) 2022.05.19
쉘 스크립트 프로그래밍 (1)  (0) 2022.05.19