바이너리 유틸리티

김민세·2022년 11월 1일
0
post-thumbnail

바이너리 유틸리티

바이너리 유틸리티는 오브젝트 포멧의 파일을 조작할 수 있는 프로그램이다.

  • objdump: 라이브러리나 ELF 형식의 파일을 어셈블리어로 출력
  • as: 어셈블러
  • ld: 링커
  • addr2line: 주소를 파일과 라인으로 출력
  • nm: 오브젝트 파일의 심벌을 출력
  • readelf: ELF 파일의 내용을 출력

오브젝트 파일: 컴파일러가 생성한 중간 단계 파일

오브젝트 파일 형식 세 가지 주요 유형


objdump 바이너리 유틸리티

리눅스 커널 어셈블리 코드와 섹션 정보를 볼 수 있는 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로 원하는 함수의 어셈블리 코드만 볼 수 있다.

profile
김민세

0개의 댓글