Coding

Linux Programming 정리

heyoon2j 2020. 4. 24. 21:51

■ 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