제임스딘딘의
Tech & Life

개발자의 기록 노트

[Mac OS] 맥의 OS X에서 readelf와 같은 binary utility 사용하기

제임스-딘딘 2016. 4. 4. 01:39

GNU 바이너리 유틸리티 - GNU Binutils 

맥의 OS X건, 리눅스 건, 개발을 하다 보면 디버깅 할 일이 생기게 마련이다.

디버깅시 유용한 도구중 하나가 GNU 바이너리 유틸리티(GNU Binutils)이다.

GNU 바이너리 유틸리티는 여러 종류의 오브젝트 파일 형식들을 조작하기 위한 프로그래밍 도구 모음인데, 이들은 일반적으로 GCC, make, GDB와 함께 사용하게 된다.


as - 어셈블러

ld - 링커

addr2line - 주소를 파일과 줄로 바꾼다.

ar - 아카이브(압축) 파일을 만들고, 수정하고, 해제한다.

c++filt - 맹글링된 C++ 심볼들을 원래대로 되돌린다.

nm - 오브젝트 파일의 심볼을 출력한다.

objcopy - 오브젝트 파일을 복사한다.

objdump - 오브젝트 파일에 대한 정보를 출력한다.

ranlib - 아카이브(압축)를 위한 색인을 만든다.

readelf - ELF 파일의 내용을 출력한다.

size - 전체와 부분의 크기를 출력한다.

strings - 표시할 수 있는 문자열을 출력한다.

strip - 오브젝트 파일로부터 심볼을 제거한다.

gprof - 프로파일러


GNU Binutils에 대해 좀더 자세히 알고 싶다면, 아래 링크를 통해 공식 홈페이지를 방문해보길 바란다.


GNU Binutils Homepage : http://www.gnu.org/software/binutils/binutils.html


또한, 다른 기종에 GNU Binutils를 포팅할 계획이라면, 아래 가이드가 도움이 될 것이다.


binutils proting guide : https://sourceware.org/binutils/binutils-porting-guide.txt 


binutils-porting-guide.txt



MAC에서 readelf 설치하기


나는 이 여러가지 도구중 symbol offset, relocation table 등의 정보등을 볼 때 사용하는 readelf 가 필요했는데,

OS X에는 기본적으로 포함되어 있지 않다. (당연한건가?)


OS X 에서 readelf와 유사한 도구가 있나 찾아보았지만 없었다.

그러나 readelf 를 직접 설치해서 사용하는 방법이 있었다.

아래 두가지 방법중 하나를 사용한다.


참고로 readelf 를 사용하는 예시화면을 보여주면 아래와 같다.

보면 대충 기능이 짐작갈 것이다.

readelf -r app


Relocation section '.rel.dyn' at offset 0x5ec contains 2 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
08049d58  00001706 R_386_GLOB_DAT    00000000   __gmon_start__
08049d60  00000305 R_386_COPY        08049d60   _ZSt4cout

Relocation section '.rel.plt' at offset 0x5fc contains 13 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
08049d24  00000107 R_386_JUMP_SLOT   0804868c   print
08049d28  00000207 R_386_JUMP_SLOT   0804869c   _ZNSt8ios_base4InitC1E
08049d2c  00000507 R_386_JUMP_SLOT   080486ac   _ZStlsISt11char_traits
08049d30  00000607 R_386_JUMP_SLOT   080486bc   _ZNSolsEPFRSoS_E
08049d34  00000707 R_386_JUMP_SLOT   08048664   _init
08049d38  00000807 R_386_JUMP_SLOT   080486dc   sleep
08049d3c  00000907 R_386_JUMP_SLOT   080486ec   _ZNKSsixEj
08049d40  00000b07 R_386_JUMP_SLOT   080486fc   _ZNKSs4sizeEv
08049d44  00000c07 R_386_JUMP_SLOT   0804870c   __libc_start_main
08049d48  00000d07 R_386_JUMP_SLOT   08048ae4   _fini
08049d4c  00001307 R_386_JUMP_SLOT   0804872c   _ZSt4endlIcSt11char_tr
08049d50  00001507 R_386_JUMP_SLOT   0804873c   __gxx_personality_v0
08049d54  00001607 R_386_JUMP_SLOT   0804874c   _ZNSt8ios_base4InitD1E

1. mac ports 사용하는 방법

$ port install binutils



2. home brew 사용하는 방법

$ brew install binutils




homebrew 를 통해서 binutils를 설치한다


나는 home brew를 사용하는 방법을 선택했다.


그러나 설치 후 사용을 하려고 하면 커맨드가 없다고 나오는 것을 보고 당황했는데, 알고보니 리눅스와는 실행파일 이름이 달랐다.

각 커맨드 앞에 'g' 가 prefix 로 붙는다는 것이다.

즉, 'greadelf' 와 같이 g를 붙여서 사용하면 된다.


즐거운 디버깅이 되길.