■ gcc
- gcc : Linux C 언어 Compiler
#gcc -dumpversion : gcc 버전 체크
# sudo yum group install "Development Tools" : gcc나 libc6-dev 등의 개발 패키지 설치(CentOS)
# sudo apt-get install build-essential : Ubuntu
■ make
- make : 하나의 프로젝트를 효율적으로 관리하고 일관성 있게 관리하기 위하여 Makefile이라는 형식을 사용하는 유틸리티
# vi Makefile : Makefile 생성
ex>
CC=gcc // $(CC)는 gcc로 치환
TARGET=foo // $@는 foo로 치환, $(TARGET)은 $@를 의미
OBJS=foo.o bar.o
CFLAGS=-g -Wall // -g: gdb에서 제공하는 정보를 바이너리에 삽입(디버깅), -Wall 모든 모호한 코딩에 대해서 경보를 보내는 옵션
all: $(TARGET) // make all 명령어 입력 시, all의 모든 구성 요소들 실행
$(TARGET): $(OBJS)
$(CC) -o $@ $(OBJS) // foo.o와 bar.o를 빌드하여 foo라는 실행파일 생성
foo.o: foo.c
gcc -c $(CFLAGS) foo.c // foo.c를 컴파일하여 foo.o라는 Object 파일 생성
bar.o: bar.c
gcc -c bar.c // bar.c를 컴파일하여 foo.o라는 Object 파일 생성
clean:
rm -f foo foo.o bar.o // make clean 명령어 입력 시, 해당 명령 실행
rm -f *.o
rm -f $(TARGET)
=> 위의 의미는 아래와 같다
목표: 목표를 만드는데 필요한 구성 요소들...
목표를 달성하기 위한 명령 1
목표를 달성하기 위한 명령 2
.....
내장 변수
CC: 컴파일러
CFLAGS: 컴파일 옵션
OBJS: 중간 산물, Object 파일 목록
SRCS: Source 파일
TARGET: 빌드 대상(실행 파일) 이름
LDFLAGS: 링커 옵션
LDLIBS: 링크 라이브러리
자동 변수
$@: 현재 Target 이름
$%: 현재 Target이 의존하는 대상들의 전체 목록
$<: 첫 번째 전제 조건의 이름
$^: 모든 전제 조건의 이름
지원함수
$(subst from, to, text): text 문자열 중에서 from에 해당하는 문자열을 to에 해당하는 문자열로 대체하는 것, substitution(치환)
$(wildcard pattern): 해당 패턴과 매칭되는 파일들을 불러온다.
$(patsubst pattern, replacement, text): subst와 다른 점은 특정 문자열이 아닌 특정 패턴을 대체한다는 것과 공백 문자로 각 단어를 구분한다는 것이다.
$(nodir names...): names에 입력된 파일명들 중에서 경로라고 판단되는 부분은 제거.
# ./configure (옵션) : 환경 설정해주는 명령어(스크립트), 컴파일 옵션이 설정되어 있는 Makefile이 만들어진다.
# make config : 설정 작업
# make dep : 파일 의존성을 검사
# make clean : 만든 파일들을 지우고 깨끗한 상태로 만든다, Makefile의 clean 레이블을 검색하여 실행
# make modules : 커널 모듈을 만든다
# make modules_install : 커널 모듈을 인스톨한다
# make install : make를 통해 만들어진 설치 파일(Setup)을 설치한다, Makefile의 install 레이블을 검색하여 실행
ex>
target:
cd obj ;\ // ;는 명령어를 분리한다는 의미, \는 한 줄에 쓸 것을 여러 줄로 나누어 쓴다는 의미
HOST_DIR=/home/e ;\
mv *.o $HOST_DIR
=> ;\를 쓰는 이유는 원래는 각 명령은 각자의 서브 쉘에서 실행된다. 각 명령이 하나로 연결되려면 ;\를 써줘야 한다.
■ gcc Build Fail Error Message 정리
- parse error : C 언어의 문법이 틀린 경우
- no such file on directory: a.out : 해당 Directory에 해당 File이 존재하지 않는 경우
- segment fault: NULL 포인터를 참조하거나 배열의 범위를 넘어서서 접근하면 발생
■ gdb
- gdb : GNU Debugger, 리눅스 디버거
* gdb를 위해 gcc에 -g 옵션 추가(gcc -g -Wall 추가)
gdb 명령어
- gdb [실행 파일 이름] : gdb 실행
- run <arg1 arg2 ...>: 프로그램 수행, argument는 선택사항
- backtrace : 현재 실행 중인 함수가 호출된 역순으로 함수들이 열거된다(역추적)
=> ___strtoll_l_internal() <- atoi() <- main() 순
- frame 2 : n 번 스택으로 프레임 변경
- list : 소스의 내용이 출력된다.
- list [function name] : 해당 함수 내용 출력
- list [번호] : 해당 번호 줄 기본으로 내용 출력
- set listsize 20 : 한 번에 출력하는 행의 개수 설정
- info locals : 현재 상태에서 어떤 지역변수들이 있는지 확인
- print l-value : 해당 L-Value의 값 확인
- printf [Function name] : 함수의 주소 값 확인
- break [번호] : 해당 번호 줄 breakpoint 설정
- break [Function name] : 해당 함수 breakpoint 설정
- info break : breakpoint 정보 확인
- clear [번호] : 해당 번호 줄 breakpoint 삭제
- clear [Function name] : 해당 함수 breakpoint 삭제
- step : 현재 출력된 행을 수행 후 멈춤, 함수의 경우 함수의 내부로 들어가 수행
- next : 현재 출력된 행을 수행 후 멈춤, 함수의 경우 함수를 수행하고 넘어간다
- return <Value> : 현재 함수를 수행하지 않고 빠져나감. Value 설정 시, Return Value는 해당 값으로 반환
- quit, Ctrl + d : 종료
'Coding' 카테고리의 다른 글
Java Basic - IO Stream (0) | 2020.08.25 |
---|---|
커널 모듈(개발 및 수정) (0) | 2020.05.04 |