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
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를 붙여서 사용하면 된다.
즐거운 디버깅이 되길.
'개발자의 기록 노트' 카테고리의 다른 글
[Rust] main함수에서 test function 호출하는 방법? (0) | 2023.04.05 |
---|---|
[Rust] 시작하기 - 개발 환경 만들기 (0) | 2023.03.26 |
Notepad++ Plugin : NPP Export Plugin (0) | 2017.02.15 |
Torrent의 원리 (0) | 2016.02.03 |
[Mac OS] Eclipse로 맥에서 C/C++ 개발환경 만들기 (0) | 2016.01.16 |
TiddlyWiki : DB와 설치가 필요없는 간단한 one file 위키 (0) | 2015.01.02 |