이때 GCC에서 기본적으로 제공하는 Binutils 이다.
- GNU Binutils
보통 Cross Compiler를 직접 GCC 기반으로 빌드해서 만드다고 하면, 가장먼저해야 할게 Binutil 빌드 작업이다.
예전에는 GCC에 포함이 안되어진 것인데, 요즘은 직접 Cross Compiler를 빌드해서 만들어 본적이 없으니, 확인을 못하겠다.
나의 경우는 주로 사용되는 것은 debug 확인용을 위해서 주로 사용되는 것이 readelf 인 것 같다.
GCC Color 출력 (GCC 4.9이후 버전)
https://xaizek.github.io/2015-10-25/enable-colorization-of-gcc-output/
https://en.wikipedia.org/wiki/Executable_and_Linkable_Format
https://m.blog.naver.com/PostView.nhn?blogId=s2kiess&logNo=220066239893&proxyReferer=https%3A%2F%2Fwww.google.com%2F
https://talkingaboutme.tistory.com/791
https://talkingaboutme.tistory.com/795?category=478749
- 사용되어지는 동적 Library 사용여부 확인
- 심볼Table 확인
- 이외
- readelf 기본 활용
$ readelf -s ./bin/ti816x/bin/dvr_rdk_demo_mcfw_api.out //쉽게 검색 $ readelf -s ./bin/ti816x/bin/dvr_rdk_demo_mcfw_api.out | grep FILE $ readelf -Ws ./bin/ti816x/bin/dvr_rdk_demo_mcfw_api.out | grep FUNC //Type 별로 검색 (길이제한해제) $ readelf -Ws ./bin/ti816x/bin/dvr_rdk_demo_mcfw_api.out | grep OBJECT //Type 별로 검색 $ readelf -S /usr/bin/ls //각 Section 확인 (.got/.data/.text/...) $ readelf -l /usr/bin/ls //각 Section 과 Segment Mapping 된것 확인(MMU에서 사용하기위해) $ readelf -x /usr/bin/ls //각 Section Binary Dump
- ldd 기본활용 및 Linker 확장
$ readelf -d /usr/bin/ls | grep xxx // ELF에서 LinkingLoader가 연결할 Shared Library 확인 $ ldd ./bin/ls | grep xxx // ELF 동적연결된 so 파일 확인 및 PATH 확인 /* 결론적으로 readelf로 확인하는게 편하지만, ldd로 왜 더 나오는지는 완벽히는 이해가 되지 않지만, readelf -d 는 app이 필요한 것을 보여준다고 한다. ldd 의 경우는 linkingloader가 필요한 것을 보여준다고 한다. 문제가 생기면, LD_LIBRARY_PATH export로 확장하자 */ $ echo $LD_LIBRARY_PATH // 만약 문제있다면, export로 확장
ldd 와 readelf 관련사항
나와 같은 삽질을 해서 여기다 링크로 추가
GCC Color 출력 (GCC 4.9이후 버전)
https://xaizek.github.io/2015-10-25/enable-colorization-of-gcc-output/
- readelf -h 기본정보확인
$ readelf Usage: readelf elf-file(s) Display information about the contents of ELF format files Options are: -a --all Equivalent to: -h -l -S -s -r -d -V -A -I //모르면, -a 전체확인 -h --file-header Display the ELF file header -l --program-headers Display the program headers --segments An alias for --program-headers -S --section-headers Display the sections' header --sections An alias for --section-headers -g --section-groups Display the section groups -t --section-details Display the section details -e --headers Equivalent to: -h -l -S -s --syms Display the symbol table //symbols 전체확인 --symbols An alias for --syms --dyn-syms Display the dynamic symbol table //다른 so 파일에 있음 -n --notes Display the core notes (if present) -r --relocs Display the relocations (if present) -u --unwind Display the unwind info (if present) -d --dynamic Display the dynamic section (if present) -V --version-info Display the version sections (if present) -A --arch-specific Display architecture specific information (if any) -c --archive-index Display the symbol/file index in an archive -D --use-dynamic Use the dynamic section info when displaying symbols -x --hex-dump= Dump the contents of section name as bytes -p --string-dump= Dump the contents of section name as strings -R --relocated-dump= Dump the contents of section name as relocated bytes -z --decompress Decompress section before dumping it -w[lLiaprmfFsoRtUuTgAckK] or --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames, //Debug 정보인, DWARF 확인가능 =frames-interp,=str,=loc,=Ranges,=pubtypes, =gdb_index,=trace_info,=trace_abbrev,=trace_aranges, =addr,=cu_index,=links,=follow-links] Display the contents of DWARF debug sections --dwarf-depth=N Do not display DIEs at depth N or greater --dwarf-start=N Display DIEs starting with N, at the same depth or deeper --ctf= Display CTF info from section --ctf-parent= Use section as the CTF parent --ctf-symbols= Use section as the CTF external symtab --ctf-strings= Use section as the CTF external strtab -I --histogram Display histogram of bucket list lengths -W --wide Allow output width to exceed 80 characters //symbols 길이 @file Read options from file -H --help Display this information -v --version Display the version number of readelf
- readelf 기본메뉴얼
- ELF format 구조
일반적으로 a.out format 과 coff format 는 동적링킹이 안되어져서 거의 사용이 안되어진다.
Linux의 경우, ELF의 경우에만 가능하며, 더불어 Debuging 정보인 DWARF도 포함가능
다들 알거라고 생각해서 아래에 간단히 링크로 연결
https://ko.wikipedia.org/wiki/ELF_%ED%8C%8C%EC%9D%BC_%ED%98%95%EC%8B%9Dhttps://en.wikipedia.org/wiki/Executable_and_Linkable_Format
- 이외 objdump 이용
$ objdump -d filename // --disassemble 되면서 각 쉽게 Entry Point 확인가능하며 Debug시 보통 같이 나오는 것을 확인가능 $ objdump -s /bin/ls // binary dump 로 실제 Data 확인
https://m.blog.naver.com/PostView.nhn?blogId=s2kiess&logNo=220066239893&proxyReferer=https%3A%2F%2Fwww.google.com%2F
https://talkingaboutme.tistory.com/791
https://talkingaboutme.tistory.com/795?category=478749