커널 안에서 정의된 여러 구조체들을 보는 중에 구조체내의 멤버의 옵셋 값을 쉽게 알 수 있는 방법이 있지 않을까해서
구글 검색을 해보니 pahole이라는 명령어가 있다. dwarves 패키지에 포함된 프로그램이다.
설치 :
$ sudo apt-get install dwarves
사용 예 :
$ pahole vmlinux // 커널에 정의된 type들을 보여주는데도 시간이 무지 걸린다.
$ pahole -E vmlinux > type_list.txt // -E : 내부 멤버에 대해서도 전개.
최근 빌드된 vmlinux 에서 아래와 같이 인식하지 못하는 TAG로 비정상 종료되는 문제가 있다.
(Ubuntu 12.04 의 pahole 서 발생)
die__process_function: DW_TAG_INVALID (0x4109) @ <0x187b8> not handled!
최신 버전에 수정이 된 듯 하여 최신 버전을 받아서 빌드하기로 결정.
최신 버전을 아래와 같이 받을 수 있다.
$ git clone https://git.kernel.org/cgit/devel/pahole/pahole.git/
빌드 설명을 README 파일을 참고 (cmake가 필요하다)
1. install cmake ($ sudo apt-get install cmake)
2. mkdir build
3. cd build
4. cmake -D__LIB=lib ..
5. make install
빌드를 하려니 패키지가 없다고 불평이다.
$ cmake -D__LIB=lib ..
-- The C compiler identification is GNU
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Checking availability of DWARF and ELF development libraries
-- Could NOT find dwarf include dir
-- Could NOT find libdw include dir
-- Could NOT find libebl library
-- Could NOT find libdw library
-- Could NOT find libelf library
libdw-dev libelf-dev 를 설치했지만, libebl은 ubuntu 패키지로 존재하지 않는다.
일부 수정이 필요하다. (libdw 로 단순히 이름 바꾸기)
diff --git a/cmake/modules/FindDWARF.cmake b/cmake/modules/FindDWARF.cmake
index f4feec4..d3bb17a 100644
--- a/cmake/modules/FindDWARF.cmake
+++ b/cmake/modules/FindDWARF.cmake
@@ -38,7 +38,7 @@ find_library(ELF_LIBRARY
)
find_library(EBL_LIBRARY
- NAMES ebl
+ NAMES dw
PATHS /usr/lib /usr/local/lib /usr/lib64 /usr/local/lib64 ~/usr/local/lib ~/usr/local/lib64
)
설치 후 만약 shared library path를 못찾는다면, sudo ldconfig 로 갱신.