툴체인 사용법

EEEFFEE·2023년 11월 15일

System Programming

목록 보기
3/19

23.11.15 최초 작성

1. gcc


gcc [옵션] [결과 파일] [소스 파일1] [소스 파일2]...

	--help : 간단한 옵션을 출력
	--version 또는 -v : gcc의 버젼을 출력
    -o : 출력 파일명을 지정
    -c : 링킹 과정을 진행 하지 않고 .o 파일인 오브젝트 파일까지만 생성
    -S : 어셈블러까지 진행 하지 않고, 컴파일러까지의 출력인 .S 어셈블러 파일을 생성
    -E : 컴파일러까지 진행 하지 않고, 전처리까지의 출력인 .i 파일을 생성
    -O1 ~ -O3 : 최적화 수준을 지정. 숫자가 클수록 높은 수준의 최적화.
    -g : 디버깅을 위한 정보를 컴파일 하면서 생성
    -D : define 을 할수 있는 옵션
    -l : 라이브러리 이름을 지정
    -L : 추가 라이브러리 디렉토리를 지정
    -W : 모든 에러 메시지 출력
    -w : 모든 에러 메시지를 출력 하지 않음
    -I : 추가 헤더 파일이 있는 디렉토리를 지정

2. gdb

2.1 gdb 시작 & 종료


gdb <프로그램>						//파일명(.o)인 파일 디버깅 시작
gdb -p <pid>						//pid 기준 디버깅 시작
...
run	[인자]							//gdb 실행 (인자 있을 경우 인자 정보를 가지고 시작)
kill								//디버깅 중인 프로그램 중지
q									//gdb 종료

2.2 진행 명령어

  1. step & next & jump

step(s) [숫자]							//숫자 만큼 라인 수행 (함수 수행 시 함수 안으로 진입)
next(n) [숫자]							//숫자 만큼 라인 수행 (함수 수행 시 다음라인 진행)	
stepi 									//step 어셈블리어 단위 수행
nexti 									//next 어셈블리어 단위 수행

u										//현재 루프 탈출

jump *[]								//값으로 강제적 분기 (주소, 행번호, 함수명 가능)

  1. breakpoint

break / b []							//실행 중 해당 지점에서 멈춤 (주소, 행번호, 함수명 가능)
break info								//현재 breakpoint 정보 출력
clear									//breakpoint 삭제
delete									//모든 breakpoint 삭제

continue 								//다음 브레이크 포인트까지 수행
finish 									//현재 함수가 결과를 반환할 때 까지 수행

  1. watchpoint

watch <변수>								//변수가 변경될 때 마다 break 실행되며 값을 보여 줌

  1. 출력

display <변수 이름>						//실행 중 변수값 지속적으로 출력

print(p) <>							//변수 & 레지스터 & 포인터 값 출력

<>
(변수 이름)
($레지스터 이름)
(*포인터 이름)

p'[파일명]'::[변수명]						//특정 파일의 전역변수 출력
p[함수명]::[변수명]						//특정 함수의 static 변수명 출력
  1. 메모리 값 출력

x/[n][출력형식][범위 단위][]				//메모리 값 출력 

  [n] : 출력 줄 수 지정

      [출력형식] 
      x : 16진법 표기
      o : 8진법 표기
      u : 10진법 표기 (부호 없음)
      t : 2진법 표기

                [범위 단위] (기본 4 byte)
                b : 1 byte 단위 표기(byte)
                h : 2 byte 단위 표기(half word)
                w: 4 byte 단위 표기(word) 
                g : 8 byte 단위 표기(giant)

						[] : 메모리 주소 / 함수 명

  1. 스택 상태 검사

info f									//스택 프레임 내용 출력
info args								//함수 호출 시 인자 출력
info catch								//함수의 exception handler 출력
info threads							//스레드 리스트 출력

bt										//전체 스택 프레임 출력
up										//상위 스택 프레임 이동
down									//하위 스택 프레임 이동

backtrace								//함수 콜 스택 출력


2.3 fork 디버깅


set follow-fork-mode-[child/parent]				//설정 시 fork()이후 child 프로세스 디버깅 
										//기본값 parent

show follow-fork-mode					//fork()에 대한 현재 디버거 응답 상태를 나타냄

set detach-on-fork [on|off]				//fork()이후 프로세스 하나를 detach할건지(on) parent / child 둘다 제어할 것인지 설정 (off, 하나는 중지상태)

show detach-on-fork

3. ELF 분석도구 (Binutils)

3.1 readelf

  • elf 파일의 내용을 보여주는 프로그램

readelf -f <파일명>						//파일 해더 조회
		-l								//프로그램 해더 조회
		-S								//섹션 해더 조회
		-e								//전체 해더 조회
		-s								//심볼 테이블 조회
		-r								//재배치 정보 조회
		-d								//동적 세그먼트 조회
		-a								//elf의 모든 정보 조회

3.2 objdump

  • 라이브러리, 컴파일된 오브젝트 모듈, 공유 오브젝트 파일, 독립 실행파일 등의 바이너리 파일들의 정보를 보여주는 프로그램

objdump [옵션] <파일명>

		-t								//심볼테이블 확인 
		-S								//어셈블리어로 디스어셈블한 소스 전체 출력
		-h								//섹션 헤더 확인
		-s								//구역별로 나눠서 내용을 출력
		-D								//전부 디버깅
		-d								//디스 어셈블

3.3 strace

  • 시스템 호출, 신호 전달자, 프로세스 상태의 변화를 포함하는 프로세스와 리눅스 커널 간 상호 작용을 감시하는데 사용하는 프로그램

strace [옵션] <파일명 (binary형식)>

		-e <시스템콜>					//조회 대상의 시스템 콜을 한정해서 출력
        -e trace=<시스템콜1,시스템콜2..>	//시스템 콜 여러개를 한정해서 출력
        -o <파일명>						//결과를 파일에 저장
        -p <PID>						//특정 프로세스의 시스템 콜 추적
        -t								//라인 별 시간정보 함께 출력
        -c								//조회하는 시스템 콜 통계 정보 출력

0개의 댓글