linux debuginfo 文件操作

来源:互联网 发布:唐安琪最新知乎 编辑:程序博客网 时间:2024/06/05 12:07

转自 http://blog.csdn.net/force_eagle/article/details/51980558

linux 下分离 debuginfo 到独立文件.


[plain] view plain copy
  1. gcc -ggdb utmp.c -o utmp  
  2. readelf -S utmp  
  3. # 创建一个包含 debuginfo 文件  
  4. objcopy --only-keep-debug utmp utmp.debug  
  5. # 添加一个包含路径文件的 .gnu_debuglink section, 文件必须存在.  
  6. objcopy --add-gnu-debuglink=utmp.debug utmp  
  7. # 查看 .gnu_debuglink section  
  8. objdump -s -j .gnu_debuglink utmp  
  9.   
  10.   
  11. utmp:     file format elf64-x86-64  
  12.   
  13.   
  14. Contents of section .gnu_debuglink:  
  15.  0000 75746d70 2e646562 75670000 0068651a  utmp.debug...he.  
  16.   
  17.   
  18. #   
  19. objcopy --strip-debug utmp  
  20.   
  21.   
  22. 指定gdb 加载 debuginfo 即可   
  23. gdb utmp -s utmp.debug  
  24. or  
  25. (gdb) file utmp  
  26. (gdb) symbol utmp.debug  

Build ID

linux 下二进制执行文件在built阶段都会根据时间戳生成一个唯一build-id, 并加入到一个"gnu.build-id" section中. 而gdb默认搜索debuginfo会搜索指定目录(show debug-file-directory) 下build-id关联的.debug. 默认搜索的文件名为 nn/nnnn...nnnn.debug, 前两个"nn"就是它的build-id前两位,后面的nnnn...nnnn则是build-id的剩余部分. 

以下命令都可查看 "gnu.build-id" section 信息.

[plain] view plain copy
  1. readelf -n utmp  
  2.   
  3.   
  4. Notes at offset 0x0000021c with length 0x00000020:  
  5.   Owner                 Data size       Description  
  6.   GNU                  0x00000010       NT_GNU_ABI_TAG (ABI version tag)  
  7.     OS: Linux, ABI: 2.6.18  
  8.   
  9.   
  10. Notes at offset 0x0000023c with length 0x00000024:  
  11.   Owner                 Data size       Description  
  12.   GNU                  0x00000014       NT_GNU_BUILD_ID (unique build ID bitstring)  
  13.     Build ID: 3b756a4a68a963bcc368ff7174da8a0fae61c37f  
  14.   
  15.   
  16. readelf  -t utmp  |grep build-id  
  17.   [ 3] .note.gnu.build-id  
  18.   
  19.   
  20. readelf --wide --sections utmp |grep build  
  21.   [ 3] .note.gnu.build-id NOTE            000000000040023c 00023c 000024 00   A  0   0  4  
  22.   
  23.   
  24. objdump -s -j .note.gnu.build-id utmp  
  25. utmp:     file format elf64-x86-64  
  26.   
  27.   
  28. Contents of section .note.gnu.build-id:  
  29.  40023c 04000000 14000000 03000000 474e5500  ............GNU.  
  30.  40024c 3b756a4a 68a963bc c368ff71 74da8a0f  ;ujJh.c..h.qt...  
  31.  40025c ae61c37f                             .a..  

示例:


[plain] view plain copy
  1. # 显示当前debuginfo默认搜索目录,也可以通过 "set debug-file-directory path" 重新指定.  
  2. (gdb) show debug-file-directory  
  3. The directory where separate debug symbols are searched for is "/usr/lib/debug".  
  4.   
  5.   
  6. # 修改debuginfo为关联build-id debuginfo  
  7. readelf -n utmp |grep Build  
  8.     Build ID: 3b756a4a68a963bcc368ff7174da8a0fae61c37f  
  9.   
  10.   
  11. mkdir -p /usr/lib/debug/.build-id/3b  
  12. mv utmp.debug  /usr/lib/debug/.build-id/3b/756a4a68a963bcc368ff7174da8a0fae61c37f.debug  
  13.   
  14.   
  15. (gdb) file utmp  
  16. Reading symbols from /mnt/hgfs/DPDK/dsw/utmp...Reading symbols from /usr/lib/debug/.build-id/3b/756a4a68a963bcc368ff7174da8a0fae61c37f.debug...done.  
  17. done.  
原创粉丝点击