바이너리 유틸리티는 오브젝트 포멧의 파일을 조작할 수 있는 프로그램이다.
오브젝트 파일: 컴파일러가 생성한 중간 단계 파일
오브젝트 파일 형식 세 가지 주요 유형
리눅스 커널 어셈블리 코드와 섹션 정보를 볼 수 있는 objdump
를 사용해 볼 것이다. 오브젝트 파일로는 리눅스 커널을 빌드하면 생성되는 vmlinux
를 활용한다.
vmlinux
: 리눅스가 지원하는 목적 파일 포맷들 중 하나에서 리눅스 커널을 포함하는 정적으로 링크된 실행 파일이다
objdump Usage: objdump <option(s)> <file(s)> Display
를 작성하여 지정 옵션을 볼 수 있다.
라즈비안에서는 기본적으로 바이너리 유틸리티를 사용할 수 있어서 바이너리 유틸리티를 따로 설치할 필요가 없다.
mkdir
를 통해 /home/pi/kernel_obj
라는 디렉터리를 만든다.
cd kernelobj/
로 디렉터리에 들어간다.
cp ../rpi_kernel_src/out/vmlinux .
를 통해 리눅스 커널 이미지 생성 폴더에 있는 vmlinux
파일을 복사한다.
cp 복사할 파일경로 이동할 파일경로
형식을 지키지 않았다는 것이다...
은 현재 디렉터리의 상위 파일로 가는 것이다..
은 현재 디렉터리를 가르키는 것이다.objdump -x vmline | more
를 통해 vmlinux
의 헤더 정보를 확인이 가능하다.
04~06번째 줄에서는 아키텍처 이름과 스타트업 코드의 위치를 표시한다
스타트업 코드 주소가 0x80008000인 것을 알 수 있다.
스타트업 코드: 이미지가 처음 실행될 때 동작하며, 어셈블리 코드로 구성돼 있다. 보통 시스템 초기 설정을 수행하고 arm
모드별로 스택 주소를 설정한다.
13~24번째 줄은 섹션 정보이다.
objdump -d vmlinux
명령어를 입력하는 vmlinux
에서 어셈블리 코드를 출력할 수 있다
이것을 해보면 느낄 것이다. 너무 많은 어셈블리 코드가 출력돼 어셈블리 코드를 보기 어렵다. 그래서 옵션을 지정해 특정 함수 어셈블리 코드를 보는 방법을 알아 볼 것이다.
커널 이미지를 빌드하면 함께 생성되는 System.map
파일을 cp
를 통해 갖고 온다.
System.map
파일을 열어보면 심벌별 주소를 확인할 수 있다.주소 출력 결과는 16진수 형식이다.
objdump --start-address=시작주소 --stop-address=끝주소 -d vmlinux
로 원하는 함수의 어셈블리 코드만 볼 수 있다.