(미완성)평범한 개발자의 C 프로그래밍 이야기

linux 3.2.82 다운받고 global툴로 태그 만들기

리눅스 커널의 공식 홈페이지는 https://www.kernel.org/ 입니다. 여기에서 현재 가장 최신 버전이 뭔지, 현재 안정화 버전이 뭔지, 장기지원 버전이 뭔지 알 수 있습니다.

그리고 홈페이지에서 리눅스 커널을 tar.xz 파일로 다운받을 수 있습니다. 최신 버전을 받기 위해서는 홈페이지에 있는 tar.xz 버튼을 클릭하면 됩니다. 다운받지 않고 소스만 보려면 browse버튼을 누르면 git.kernel.org 사이트로 이동합니다. git.kernel.org에서는 소스를 웹으로 보거나 git을 이용해서 다운받을 수 있습니다. git에 대한 설명은 생략하겠습니다.

리눅스 커널의 block layer를 공부하면서 open/close/read/write의 시스템 콜을 같이 분석해보겠습니다. 커널 버전은 3.2.82를 보겠습니다. 이 글을 쓰는 시점에 가장 낮은 long-term support 버전이기 때문입니다. 최신 버전을 보는게 무조건 좋은건 아니고 오래된 버전이라도 확실히 이해하는게 더 좋다는 생각이라서 long-term support 중에 가장 낮은 버전을 골랐습니다.

소스를 받고나서 해야할 일이 하나 더 있는데 소스 태그를 만드는 것입니다. 그래야 소스 분석이 더 쉬워집니다. 전통적으로 많이 쓰는 ctags나 cscope를 써도 되고, 저처럼 emacs를 쓰는 분은 global를 써도 좋습니다.

저는 global를 주로 씁니다. global의 소개는 https://www.gnu.org/software/global/ 를 참고하세요. global의 사용법은 아주 쉽습니다. 커널 소스가 있는 디렉토리에서 gtags를 실행만하면 끝입니다.

~/study/linux$ ls
arch     crypto         fs       ipc     MAINTAINERS  net             scripts   usr
COPYING  Documentation  include  kernel  Makefile     README          security
CREDITS  drivers        init     lib     mm           REPORTING-BUGS  sound
~/study/linux$ gtags
~/study/linux$ ls
arch     Documentation  GRTAGS   init    MAINTAINERS  README          sound
COPYING  drivers        GSYMS    ipc     Makefile     REPORTING-BUGS  usr
CREDITS  fs             GTAGS    kernel  mm           scripts
crypto   GPATH          include  lib     net          security

GPATH, GRTAGS, GSYMS, GTAGS 등의 파일이 생겼습니다.

사용법도 간단합니다. 특정 함수가 어디있는지 찾고 싶으면 옵션없이 함수이름만 쓰면 됩니다.

~/study/linux$ global start_kernel
arch/alpha/boot/bootp.c
arch/alpha/boot/bootpz.c
arch/alpha/boot/main.c
init/main.c

start_kernel이라는 함수가 어디서 호출되는지를 찾고 싶으면 -r옵션을 씁니다.

~/study/linux$ global -r start_kernel
arch/frv/kernel/debug-stub.c
arch/um/kernel/skas/process_kern.c
arch/um/kernel/tt/process_kern.c
arch/x86_64/kernel/head64.c
include/asm-frv/gdb-stub.h
include/asm-x86_64/proto.h

해당 소스 파일을 더 보고싶으면 -x 옵션을 추가하면 됩니다.

~/study/linux$ global -r -x start_kernel
start_kernel      124 arch/frv/kernel/debug-stub.c     	__debug_frame->pc = (unsigned long) start_kernel;
start_kernel      160 arch/um/kernel/skas/process_kern.c extern void start_kernel(void);
start_kernel      174 arch/um/kernel/skas/process_kern.c 	start_kernel();
start_kernel      475 arch/um/kernel/tt/process_kern.c extern void start_kernel(void);
start_kernel      490 arch/um/kernel/tt/process_kern.c 	start_kernel();
start_kernel      116 arch/x86_64/kernel/head64.c 	start_kernel();
start_kernel       92 include/asm-frv/gdb-stub.h extern asmlinkage void start_kernel(void);
start_kernel       12 include/asm-x86_64/proto.h extern void start_kernel(void);
~/study/linux$ global -x start_kernel
start_kernel      134 arch/alpha/boot/bootp.c start_kernel(void)
start_kernel      262 arch/alpha/boot/bootpz.c start_kernel(void)
start_kernel      152 arch/alpha/boot/main.c void start_kernel(void)
start_kernel      416 init/main.c      asmlinkage void __init start_kernel(void)

소스 파일이 변경되서 새로 태그를 만들어야할때 gtags를 다시 실행하면 태그를 처음부터 다시 만들게되므로 시간이 오래 걸립니다. 이럴때는 새로 바뀐 부분의 태그만 생성하도록 global -u 명령을 씁니다. -v 옵션을 같이 쓰면 자세한 설명도 같이 출력됩니다.

~/study/linux$ global -vu
[Wed Oct 05 08:55:25 CEST 2016] Gtags started.
 Using default configuration.
 Tag found in '/home/gohkim/study/linux-2.6.11.12'.
 Incremental update.
 Global databases are up to date.
[Wed Oct 05 08:55:25 CEST 2016] Done.

emacs나 vim에 연동하는 부분은 홈페이지 https://www.gnu.org/software/global/ 를 참고하시면 됩니다.

예를 들어 제 .emacs에는 다음과 같이 gtags-mode를 추가했습니다. 이렇게하면 Alt + . 으로 특정 함수나 변수가 선언된 위치로 점프합니다.

;; GNU GLOBAL for source tag
(setq load-path (cons "/usr/share/emacs/site-lisp/global/" load-path))
(autoload 'gtags-mode "gtags"
  "Minor mode for browsing source code using GLOBAL" t)
(add-hook 'c-mode-common-hook
       (lambda () (gtags-mode 1)))

 

댓글

댓글 본문
작성자
비밀번호
버전 관리
gurugio
현재 버전
선택 버전
graphittie 자세히 보기