레이블이 Debug-Binutils인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Debug-Binutils인 게시물을 표시합니다. 모든 게시물 표시

12/30/2014

GNU binutils 관련 정리

Linux 에서 App을 사용하다 보면 Debug이 필요할 때 있다.
이때 GCC에서 기본적으로 제공하는 Binutils 이다.

  • GNU Binutils
binutil 은 Cross Compiler를 직접 만들어 보신분들은 다 알거라고 생각든다. 
보통 Cross Compiler를 직접 GCC 기반으로 빌드해서 만드다고 하면, 가장먼저해야 할게 Binutil 빌드 작업이다.  
예전에는 GCC에 포함이 안되어진 것인데, 요즘은 직접 Cross Compiler를 빌드해서 만들어 본적이 없으니, 확인을 못하겠다. 
아래링크를 보니, 요즘 gprof도 같이 들어가는 것 같다. 
  https://en.wikipedia.org/wiki/GNU_Binutils


나의 경우는 주로 사용되는 것은 debug 확인용을 위해서 주로 사용되는 것이 readelf 인 것 같다.
  1. 사용되어지는 동적 Library 사용여부 확인 
  2. 심볼Table 확인  
  3. 이외 

  • readelf 기본 활용
아래와 같이 일반 symbol table을 분석하는 것이 편하며, dynmic symbol은 동적으로 연결되어 동작한다.
$ 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 기본정보확인 
http://forum.falinux.com/zbxe/index.php?document_srl=781536&mid=lecture_tip
$ 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 기본메뉴얼 
http://linuxcommand.org/man_pages/readelf1.html


  • 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%9D
  https://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