SlideShare a Scribd company logo
2
Most read
3
Most read
4
Most read
DWARF
Data Representation
Kai
.debug_info
compilation unit header
a series of debugging
information entries (DIE)
.debug_abbrev
length of .debug_info
dwarf version
offset into .debug_abbrev
(size of an address)
.section .debug_info,"",@progbits
.Ldebug_info0:
.long 0x3a8
.value 0x2 // dwarf versino 2
.long .Ldebug_abbrev0
.byte 0x8 // 64 bits addressing
.uleb128 0x1
.long .LASF55
.byte 0xc
.long .LASF56
.long .LASF57
.quad .Ltext0
.quad .Letext0
.long .Ldebug_line0
a series of abbreviation
declarations
* DWARFv3 supports 64-bits DWARF format.
Initial length = 0xffffffff to indicate 64-bits DWARF.
The following 64-bits value is the real initial length.
(4-byte unsigned)
(2-byte unsigned)
(4-byte unsigned)
.debug_info
compilation unit header
a series of debugging
information entries (DIE)
.debug_abbrev
.section .debug_info,"",@progbits
.Ldebug_info0:
.long 0x3a8
.value 0x2
.long .Ldebug_abbrev0
.byte 0x8
.uleb128 0x1
.long .LASF55
.byte 0xc
.long .LASF56
.long .LASF57
.quad .Ltext0
.quad .Letext0
.long .Ldebug_line0
.uleb128 0x2
.long .LASF7
.byte 0x2
.byte 0xd8
.long 0x38
.uleb128 0x3
.byte 0x8
.byte 0x7
.long .LASF0
.uleb128 0x3
.byte 0x1
.byte 0x8
.long .LASF1
a series of abbreviation
declarations
abbreviation code
attribute values
Each abbreviation declaration speciïŹes the tag and attributes for
a particular form of debugging information entry.
.section .debug_info,"",@progbits
.Ldebug_info0:
.long 0x3a8
.value 0x2
.long .Ldebug_abbrev0
.byte 0x8
.uleb128 0x1
.long .LASF55
.byte 0xc
.long .LASF56
.long .LASF57
.quad .Ltext0
.quad .Letext0
.long .Ldebug_line0
.uleb128 0x2
.long .LASF7
.byte 0x2
.byte 0xd8
.long 0x38
.uleb128 0x3
.byte 0x8
.byte 0x7
.long .LASF0
.uleb128 0x3
.byte 0x1
.byte 0x8
.long .LASF1
abbreviation code
attribute values
.section .debug_abbrev,"",@progbits
.Ldebug_abbrev0:
.uleb128 0x1
.uleb128 0x11
.byte 0x1
.uleb128 0x25
.uleb128 0xe
.uleb128 0x13
.uleb128 0xb
.uleb128 0x3
.uleb128 0xe
.uleb128 0x1b
.uleb128 0xe
.uleb128 0x11
.uleb128 0x1
.uleb128 0x12
.uleb128 0x1
.uleb128 0x10
.uleb128 0x6
.byte 0
.byte 0
.uleb128 0x2
.uleb128 0x16
.byte 0
.uleb128 0x3
.uleb128 0xe
.uleb128 0x3a
.uleb128 0xb
.uleb128 0x3b
.uleb128 0xb
.uleb128 0x49
.uleb128 0x13
.byte 0
.byte 0
.uleb128 0x3
abbreviation code
tag, 0x11(DW_TAG_compile_unit)
has child or not
attribute’s name (DW_AT_producer)
attribute’s form (DW_FORM_strp)
end of attribute spec
end of attribute spec
.section .debug_str,"MS",@progbits,1
.LASF55:
.string "GNU C11 6.2.0 -mtune=generic -march=
attribute’s name
attribute’s form
attribute’s name
attribute’s form
attribute’s name
attribute’s form
attribute’s name
attribute’s form
attribute’s name
attribute’s form
attribute’s name
attribute’s form
DWARF Data Representation
DWARF Data Representation
DWARF Data Representation
unsigned LEB128 encoding
12857 = 0011001000111001 Chop 7 bits as a chunk
_0111001_110010000 Place each chunk into a byte
Discard zero byte.
1_______0_______
There are other bytes.Last byte.
1011100101100100
First byte.Second byte.
signed LEB128 encoding
-2 = 11111111111111111111111111111110 Chop 7 bits as a chunk
_1111110_1111111
Place each chunk into a byte
If all sign bits, discard. 0_______
Last byte.
01111110
First byte.
_1111111_11111111111
signed LEB128 encoding
127 = 00000000000000000000000001111111 Chop 7 bits as a chunk
_1111111_0000000 Place each chunk into a byte
11111111
First byte.
1_______0_______
There are other bytes.Last byte.
00000000
Second byte.
.debug_pubnames
header
entries of
global names
in the
.debug_info
length of this set
dwarf version
offset into .debug_info
length of the .debug_info
compilation
unit
compilation
unit
compilation
unit
.debug_info
.debug_info
.debug_info
set
.debug_pubtypes (DWARFv3)
.debug_aranges
header
entries of
addresses
in the
.debug_info
length of this set
dwarf version
offset into .debug_info
compilation
unit
compilation
unit
compilation
unit
.debug_info
.debug_info
.debug_info
set
(size of an address)
(size of a segment descriptor)
(padding if necessary)
First entry is aligned with the size of one entry,
2 x (size of an address).
Activation Record
‱ An activation consists of
‱ A code location that is within the subroutine.
‱ An area of memory that is allocated on a stack
called a “call frame.”
‱ A set of registers that are in use by the
subroutine at the code location.
Call Frame Information
‱ Recording how procedures save and restore
registers throughout their lifetimes.
‱ Construct a very large table as following:
LOC CFA R0 R1 
 RN
L0
L1


LM
‱ The table is a mapping between program addresses
and architecture registers.
‱ The table is a mapping between program addresses
and architecture registers.
‱ The table entries are the rules to ïŹnd the register
values in the previous frame.
The Register Rules
‱ undeïŹned
‱ Has no value in the previous frame. (It is not callee-save
register.)
‱ same value
‱ This register has not been modiïŹed from the previous frame. (It
is callee-save register, but the callee has not modiïŹed it.)
‱ offset(N)
‱ The previous value of this register is saved at the address CFA
+N.
‱ register(R)
‱ The previous value of this register is stored in another register
numbered R.
‱ architectural
‱ Architecture deïŹned.
.debug_frame
CIE
FDE
CIE
length of this CIE (uword)
CIE_id (uword)
augmentation (string)
code_alignment_factor (uleb218)
FDE
FDE
FDE
FDE
FDE
FDE
FDE
FDE
FDE
version (ubyte)
data_alignment_factor (sleb128)
return_address_register (ubyte)
initial_instructions
padding
code_alignment_factor:
A constant that is factored out of all advance location instructions.
data_alignment_factor:
A constant that is factored out of all offset instructions.
initial_instructions:
A sequence of rules that are interpreted to create the
initial setting of each column in the table.
(uleb128 for DWARFv3)
.debug_frame
CIE
FDE
CIE
length of this FDE (uword)
CIE_pointer (uword)
address_range (addressing unit)
instructions
FDE
FDE
FDE
FDE
FDE
FDE
FDE
FDE
FDE
initial_location (addressing unit)
initial_location:
A constant indicates the address of the ïŹrst location associated
with this table entry.
address_range:
A constant indicates the number of bytes of program instructions
described by this entry.
instructions:
A sequence of table deïŹning instructions.
padding
.section .debug_frame,"",@progbits
.Lframe0:
.long .LECIE0-.LSCIE0 // length of this CIE
.LSCIE0:
.long 0xffffffff // CIE_id
.byte 0x1 // version
.string “" // augmentation
.uleb128 0x1 // code_alignment_factor
.sleb128 -8 // data_alignment_factor
.byte 0x10 // return address register, ra = r16
.byte 0xc // instruction (0xc = DW_CFA_def_cfa)
.uleb128 0x7 // operand1 (register)
.uleb128 0x8 // operand2 (offset) CFA = r7(rsp) + 0x8
.byte 0x90 // instruction (0x90 = DW_CFA_offset, register = 0x10)
.uleb128 0x1 // operand1 (offset) r16(ra) = CFA + (0x1 * (-8))
.align 8 // padding
.LECIE0:
.LSFDE0:
.long .LEFDE0-.LASFDE0
.LASFDE0:
.long .Lframe0
.quad .LFB0
.quad .LFE0-.LFB0
.byte 0x4
.long .LCFI0-.LFB0
.byte 0xe
.uleb128 0x10
.byte 0x86
.uleb128 0x2
.byte 0x4
.long .LCFI1-.LCFI0
.byte 0xd
.uleb128 0x6
.byte 0x4
.long .LCFI2-.LCFI1
.byte 0xc
.uleb128 0x7
.uleb128 0x8
.align 8
.LEFDE0:
instructions
00000000 0000000000000014 ffffffff CIE "" cf=1 df=-8 ra=16
LOC CFA ra
0000000000000000 rsp+8 c-8
.section .debug_frame,"",@progbits
.Lframe0:
.long .LECIE0-.LSCIE0 // length of this CIE
.LSCIE0:
.long 0xffffffff
.byte 0x1
.string “"
.uleb128 0x1
.sleb128 -8
.byte 0x10
.byte 0xc
.uleb128 0x7
.uleb128 0x8
.byte 0x90
.uleb128 0x1
.align 8
.LECIE0:
.LSFDE0:
.long .LEFDE0-.LASFDE0 // length of this FDE
.LASFDE0:
.long .Lframe0 // CIE_pointer
.quad .LFB0 // initial location
.quad .LFE0-.LFB0 // address range
.byte 0x4 // instruction (0x4 = DW_CFA_advance_loc4)
.long .LCFI0-.LFB0 // operand1 (4-byte delta) location = location + (delta * (1)) = 0x40050e
.byte 0xe // instruction (0xe = DW_CFA_def_cfa_offset)
.uleb128 0x10 // operand1 (offset) CFA = rsp + 0x10
.byte 0x86 // instruction (0x86 = DW_CFA_offset, register = 0x6)
.uleb128 0x2 // operand1 (offset) r6(rbp) = CFA + (0x2 * (-8))
.byte 0x4 // instruction (0x4 = DW_CFA_advance_loc4)
.long .LCFI1-.LCFI0 // operand1 (4-byte delta) location = location + (delta * (1)) = 0x400511
.byte 0xd // instruction (0xd = DW_CFA_def_cfa_register)
.uleb128 0x6 // operand1 (register) CFA = r6(rbp) + 0x10
.byte 0x4 // instruction (0x4 = DW_CFA_advance_loc4)
.long .LCFI2-.LCFI1 // operand1 (4-byte delta) location = location + (delta * (1)) = 0x400528
.byte 0xc // instruction (0xc = DW_CFA_def_cfa)
.uleb128 0x7 // operand1 (register)
.uleb128 0x8 // operand2 (offset) CFA = r7(rsp) + 0x8
.align 8 // padding
.LEFDE0:
00000018 0000000000000024 00000000 FDE cie=00000000 pc=000000000040050d..0000000000400529
LOC CFA rbp ra
000000000040050d rsp+8 u c-8 // initial rules, defined by CIE
000000000040050e rsp+16 c-16 c-8
0000000000400511 rbp+16 c-16 c-8
0000000000400528 rsp+8 c-16 c-8
instructions
DWARF Data Representation

More Related Content

PDF
LLVM Register Allocation (2nd Version)
PDF
LAS16-501: Introduction to LLVM - Projects, Components, Integration, Internals
 
PDF
LLVM Register Allocation
PPT
Gcc porting
PDF
Symbolic Debugging with DWARF
PPTX
LLVM Backend Porting
PDF
A whirlwind tour of the LLVM optimizer
PDF
Interpreter, Compiler, JIT from scratch
LLVM Register Allocation (2nd Version)
LAS16-501: Introduction to LLVM - Projects, Components, Integration, Internals
 
LLVM Register Allocation
Gcc porting
Symbolic Debugging with DWARF
LLVM Backend Porting
A whirlwind tour of the LLVM optimizer
Interpreter, Compiler, JIT from scratch

What's hot (20)

PPTX
Understand more about C
PPTX
Dpdk applications
PDF
Virtual Machine Constructions for Dummies
PPTX
QEMU - Binary Translation
PDF
Q2.12: Debugging with GDB
 
PPTX
Integrated Register Allocation introduction
PPTX
Linux Device Tree
PDF
Qemu Introduction
PDF
XPDDS17: Reworking the ARM GIC Emulation & Xen Challenges in the ARM ITS Emu...
PPTX
LLVM Instruction Selection
PDF
Embedded linux network device driver development
PDF
Reverse Mapping (rmap) in Linux Kernel
PDF
ROP èŒ•éŹ†è«‡
PDF
The Linux Block Layer - Built for Fast Storage
PDF
from Binary to Binary: How Qemu Works
PDF
Linux Kernel - Virtual File System
PDF
Vim Rocks!
PDF
Velocity 2015 linux perf tools
PDF
How A Compiler Works: GNU Toolchain
PDF
Qemu JIT Code Generator and System Emulation
Understand more about C
Dpdk applications
Virtual Machine Constructions for Dummies
QEMU - Binary Translation
Q2.12: Debugging with GDB
 
Integrated Register Allocation introduction
Linux Device Tree
Qemu Introduction
XPDDS17: Reworking the ARM GIC Emulation & Xen Challenges in the ARM ITS Emu...
LLVM Instruction Selection
Embedded linux network device driver development
Reverse Mapping (rmap) in Linux Kernel
ROP èŒ•éŹ†è«‡
The Linux Block Layer - Built for Fast Storage
from Binary to Binary: How Qemu Works
Linux Kernel - Virtual File System
Vim Rocks!
Velocity 2015 linux perf tools
How A Compiler Works: GNU Toolchain
Qemu JIT Code Generator and System Emulation
Ad

Viewers also liked (20)

PDF
Something About Dynamic Linking
PDF
Effective Modern C++
PDF
Evdokimov python arsenal for re
PDF
ELF 101
PDF
HES2011 - James Oakley and Sergey bratus-Exploiting-the-Hard-Working-DWARF
PPT
Intro reverse engineering
PPT
A hands-on introduction to the ELF Object file format
 
ODP
LD_PRELOAD Exploitation - DC9723
PPTX
06 - ELF format, knowing your friend
PPTX
Linker and loader upload
PDF
FISL XIV - The ELF File Format and the Linux Loader
PDF
Program Structure in GNU/Linux (ELF Format)
PPTX
Ch 4 linker loader
PDF
Compilation and Execution
PPTX
Sp chap2
PDF
Embedded Systems: Lecture 14: Introduction to GNU Toolchain (Binary Utilities)
PPTX
SECR'13 Lightweight linux shared libraries profiling
 
PPTX
Linkers in compiler
PPT
Linkers And Loaders
PDF
Dynamic Linker
Something About Dynamic Linking
Effective Modern C++
Evdokimov python arsenal for re
ELF 101
HES2011 - James Oakley and Sergey bratus-Exploiting-the-Hard-Working-DWARF
Intro reverse engineering
A hands-on introduction to the ELF Object file format
 
LD_PRELOAD Exploitation - DC9723
06 - ELF format, knowing your friend
Linker and loader upload
FISL XIV - The ELF File Format and the Linux Loader
Program Structure in GNU/Linux (ELF Format)
Ch 4 linker loader
Compilation and Execution
Sp chap2
Embedded Systems: Lecture 14: Introduction to GNU Toolchain (Binary Utilities)
SECR'13 Lightweight linux shared libraries profiling
 
Linkers in compiler
Linkers And Loaders
Dynamic Linker
Ad

Similar to DWARF Data Representation (20)

PDF
Qe Reference
PPT
Assembler
PDF
RISC-V Zce Extension
PDF
Microprocessor Based Design and operations
PPT
Material com Conceitos de Assembler Mainframe
PDF
Reverse engineering of binary programs for custom virtual machines
PPTX
Assembly Language Tutorials for Windows - 03 Assembly Language Programming
PPTX
17
PDF
arm64arm64arm64arm64arm64arm64arm64arm64
PDF
Fix assembly Code new peoblem on call printf gt .pdf
PDF
String_manipulations.pdf
RTF
assembly
PPTX
Introduction to debugging linux applications
PPT
Assembler
PDF
OptimizingARM
PDF
Advanced Techniques: Size | Pebble Developer Retreat 2014
PDF
Basics of building a blackfin application
PDF
computer architecture Lecture 8 for computer science
PPT
C for Microcontrollers
Qe Reference
Assembler
RISC-V Zce Extension
Microprocessor Based Design and operations
Material com Conceitos de Assembler Mainframe
Reverse engineering of binary programs for custom virtual machines
Assembly Language Tutorials for Windows - 03 Assembly Language Programming
17
arm64arm64arm64arm64arm64arm64arm64arm64
Fix assembly Code new peoblem on call printf gt .pdf
String_manipulations.pdf
assembly
Introduction to debugging linux applications
Assembler
OptimizingARM
Advanced Techniques: Size | Pebble Developer Retreat 2014
Basics of building a blackfin application
computer architecture Lecture 8 for computer science
C for Microcontrollers

More from Wang Hsiangkai (9)

PDF
Debug Line Issues After Relaxation.
PDF
Machine Trace Metrics
PDF
Instruction Combine in LLVM
PDF
GCC LTO
PDF
LTO plugin
PDF
GCC GENERIC
PDF
Perf File Format
PDF
Introduction to Perf
PDF
SSA - PHI-functions Placements
Debug Line Issues After Relaxation.
Machine Trace Metrics
Instruction Combine in LLVM
GCC LTO
LTO plugin
GCC GENERIC
Perf File Format
Introduction to Perf
SSA - PHI-functions Placements

Recently uploaded (20)

PPTX
L1 - Introduction to python Backend.pptx
PPTX
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
 
PDF
How to Migrate SBCGlobal Email to Yahoo Easily
PDF
Wondershare Filmora 15 Crack With Activation Key [2025
PDF
Softaken Excel to vCard Converter Software.pdf
PDF
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
PPTX
Reimagine Home Health with the Power of Agentic AI​
PPTX
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
PDF
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
PDF
AI in Product Development-omnex systems
PDF
PTS Company Brochure 2025 (1).pdf.......
PDF
Adobe Illustrator 28.6 Crack My Vision of Vector Design
PDF
Nekopoi APK 2025 free lastest update
PPTX
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
PDF
medical staffing services at VALiNTRY
PDF
Understanding Forklifts - TECH EHS Solution
PDF
Which alternative to Crystal Reports is best for small or large businesses.pdf
PDF
wealthsignaloriginal-com-DS-text-... (1).pdf
PDF
Addressing The Cult of Project Management Tools-Why Disconnected Work is Hold...
L1 - Introduction to python Backend.pptx
Lecture 3: Operating Systems Introduction to Computer Hardware Systems
 
How to Migrate SBCGlobal Email to Yahoo Easily
Wondershare Filmora 15 Crack With Activation Key [2025
Softaken Excel to vCard Converter Software.pdf
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
Reimagine Home Health with the Power of Agentic AI​
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
AI in Product Development-omnex systems
PTS Company Brochure 2025 (1).pdf.......
Adobe Illustrator 28.6 Crack My Vision of Vector Design
Nekopoi APK 2025 free lastest update
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
medical staffing services at VALiNTRY
Understanding Forklifts - TECH EHS Solution
Which alternative to Crystal Reports is best for small or large businesses.pdf
wealthsignaloriginal-com-DS-text-... (1).pdf
Addressing The Cult of Project Management Tools-Why Disconnected Work is Hold...

DWARF Data Representation

  • 2. .debug_info compilation unit header a series of debugging information entries (DIE) .debug_abbrev length of .debug_info dwarf version offset into .debug_abbrev (size of an address) .section .debug_info,"",@progbits .Ldebug_info0: .long 0x3a8 .value 0x2 // dwarf versino 2 .long .Ldebug_abbrev0 .byte 0x8 // 64 bits addressing .uleb128 0x1 .long .LASF55 .byte 0xc .long .LASF56 .long .LASF57 .quad .Ltext0 .quad .Letext0 .long .Ldebug_line0 a series of abbreviation declarations * DWARFv3 supports 64-bits DWARF format. Initial length = 0xffffffff to indicate 64-bits DWARF. The following 64-bits value is the real initial length. (4-byte unsigned) (2-byte unsigned) (4-byte unsigned)
  • 3. .debug_info compilation unit header a series of debugging information entries (DIE) .debug_abbrev .section .debug_info,"",@progbits .Ldebug_info0: .long 0x3a8 .value 0x2 .long .Ldebug_abbrev0 .byte 0x8 .uleb128 0x1 .long .LASF55 .byte 0xc .long .LASF56 .long .LASF57 .quad .Ltext0 .quad .Letext0 .long .Ldebug_line0 .uleb128 0x2 .long .LASF7 .byte 0x2 .byte 0xd8 .long 0x38 .uleb128 0x3 .byte 0x8 .byte 0x7 .long .LASF0 .uleb128 0x3 .byte 0x1 .byte 0x8 .long .LASF1 a series of abbreviation declarations abbreviation code attribute values Each abbreviation declaration speciïŹes the tag and attributes for a particular form of debugging information entry.
  • 4. .section .debug_info,"",@progbits .Ldebug_info0: .long 0x3a8 .value 0x2 .long .Ldebug_abbrev0 .byte 0x8 .uleb128 0x1 .long .LASF55 .byte 0xc .long .LASF56 .long .LASF57 .quad .Ltext0 .quad .Letext0 .long .Ldebug_line0 .uleb128 0x2 .long .LASF7 .byte 0x2 .byte 0xd8 .long 0x38 .uleb128 0x3 .byte 0x8 .byte 0x7 .long .LASF0 .uleb128 0x3 .byte 0x1 .byte 0x8 .long .LASF1 abbreviation code attribute values .section .debug_abbrev,"",@progbits .Ldebug_abbrev0: .uleb128 0x1 .uleb128 0x11 .byte 0x1 .uleb128 0x25 .uleb128 0xe .uleb128 0x13 .uleb128 0xb .uleb128 0x3 .uleb128 0xe .uleb128 0x1b .uleb128 0xe .uleb128 0x11 .uleb128 0x1 .uleb128 0x12 .uleb128 0x1 .uleb128 0x10 .uleb128 0x6 .byte 0 .byte 0 .uleb128 0x2 .uleb128 0x16 .byte 0 .uleb128 0x3 .uleb128 0xe .uleb128 0x3a .uleb128 0xb .uleb128 0x3b .uleb128 0xb .uleb128 0x49 .uleb128 0x13 .byte 0 .byte 0 .uleb128 0x3 abbreviation code tag, 0x11(DW_TAG_compile_unit) has child or not attribute’s name (DW_AT_producer) attribute’s form (DW_FORM_strp) end of attribute spec end of attribute spec .section .debug_str,"MS",@progbits,1 .LASF55: .string "GNU C11 6.2.0 -mtune=generic -march= attribute’s name attribute’s form attribute’s name attribute’s form attribute’s name attribute’s form attribute’s name attribute’s form attribute’s name attribute’s form attribute’s name attribute’s form
  • 8. unsigned LEB128 encoding 12857 = 0011001000111001 Chop 7 bits as a chunk _0111001_110010000 Place each chunk into a byte Discard zero byte. 1_______0_______ There are other bytes.Last byte. 1011100101100100 First byte.Second byte.
  • 9. signed LEB128 encoding -2 = 11111111111111111111111111111110 Chop 7 bits as a chunk _1111110_1111111 Place each chunk into a byte If all sign bits, discard. 0_______ Last byte. 01111110 First byte. _1111111_11111111111
  • 10. signed LEB128 encoding 127 = 00000000000000000000000001111111 Chop 7 bits as a chunk _1111111_0000000 Place each chunk into a byte 11111111 First byte. 1_______0_______ There are other bytes.Last byte. 00000000 Second byte.
  • 11. .debug_pubnames header entries of global names in the .debug_info length of this set dwarf version offset into .debug_info length of the .debug_info compilation unit compilation unit compilation unit .debug_info .debug_info .debug_info set .debug_pubtypes (DWARFv3)
  • 12. .debug_aranges header entries of addresses in the .debug_info length of this set dwarf version offset into .debug_info compilation unit compilation unit compilation unit .debug_info .debug_info .debug_info set (size of an address) (size of a segment descriptor) (padding if necessary) First entry is aligned with the size of one entry, 2 x (size of an address).
  • 13. Activation Record ‱ An activation consists of ‱ A code location that is within the subroutine. ‱ An area of memory that is allocated on a stack called a “call frame.” ‱ A set of registers that are in use by the subroutine at the code location.
  • 14. Call Frame Information ‱ Recording how procedures save and restore registers throughout their lifetimes. ‱ Construct a very large table as following: LOC CFA R0 R1 
 RN L0 L1 
 LM ‱ The table is a mapping between program addresses and architecture registers. ‱ The table is a mapping between program addresses and architecture registers. ‱ The table entries are the rules to ïŹnd the register values in the previous frame.
  • 15. The Register Rules ‱ undeïŹned ‱ Has no value in the previous frame. (It is not callee-save register.) ‱ same value ‱ This register has not been modiïŹed from the previous frame. (It is callee-save register, but the callee has not modiïŹed it.) ‱ offset(N) ‱ The previous value of this register is saved at the address CFA +N. ‱ register(R) ‱ The previous value of this register is stored in another register numbered R. ‱ architectural ‱ Architecture deïŹned.
  • 16. .debug_frame CIE FDE CIE length of this CIE (uword) CIE_id (uword) augmentation (string) code_alignment_factor (uleb218) FDE FDE FDE FDE FDE FDE FDE FDE FDE version (ubyte) data_alignment_factor (sleb128) return_address_register (ubyte) initial_instructions padding code_alignment_factor: A constant that is factored out of all advance location instructions. data_alignment_factor: A constant that is factored out of all offset instructions. initial_instructions: A sequence of rules that are interpreted to create the initial setting of each column in the table. (uleb128 for DWARFv3)
  • 17. .debug_frame CIE FDE CIE length of this FDE (uword) CIE_pointer (uword) address_range (addressing unit) instructions FDE FDE FDE FDE FDE FDE FDE FDE FDE initial_location (addressing unit) initial_location: A constant indicates the address of the ïŹrst location associated with this table entry. address_range: A constant indicates the number of bytes of program instructions described by this entry. instructions: A sequence of table deïŹning instructions. padding
  • 18. .section .debug_frame,"",@progbits .Lframe0: .long .LECIE0-.LSCIE0 // length of this CIE .LSCIE0: .long 0xffffffff // CIE_id .byte 0x1 // version .string “" // augmentation .uleb128 0x1 // code_alignment_factor .sleb128 -8 // data_alignment_factor .byte 0x10 // return address register, ra = r16 .byte 0xc // instruction (0xc = DW_CFA_def_cfa) .uleb128 0x7 // operand1 (register) .uleb128 0x8 // operand2 (offset) CFA = r7(rsp) + 0x8 .byte 0x90 // instruction (0x90 = DW_CFA_offset, register = 0x10) .uleb128 0x1 // operand1 (offset) r16(ra) = CFA + (0x1 * (-8)) .align 8 // padding .LECIE0: .LSFDE0: .long .LEFDE0-.LASFDE0 .LASFDE0: .long .Lframe0 .quad .LFB0 .quad .LFE0-.LFB0 .byte 0x4 .long .LCFI0-.LFB0 .byte 0xe .uleb128 0x10 .byte 0x86 .uleb128 0x2 .byte 0x4 .long .LCFI1-.LCFI0 .byte 0xd .uleb128 0x6 .byte 0x4 .long .LCFI2-.LCFI1 .byte 0xc .uleb128 0x7 .uleb128 0x8 .align 8 .LEFDE0: instructions 00000000 0000000000000014 ffffffff CIE "" cf=1 df=-8 ra=16 LOC CFA ra 0000000000000000 rsp+8 c-8
  • 19. .section .debug_frame,"",@progbits .Lframe0: .long .LECIE0-.LSCIE0 // length of this CIE .LSCIE0: .long 0xffffffff .byte 0x1 .string “" .uleb128 0x1 .sleb128 -8 .byte 0x10 .byte 0xc .uleb128 0x7 .uleb128 0x8 .byte 0x90 .uleb128 0x1 .align 8 .LECIE0: .LSFDE0: .long .LEFDE0-.LASFDE0 // length of this FDE .LASFDE0: .long .Lframe0 // CIE_pointer .quad .LFB0 // initial location .quad .LFE0-.LFB0 // address range .byte 0x4 // instruction (0x4 = DW_CFA_advance_loc4) .long .LCFI0-.LFB0 // operand1 (4-byte delta) location = location + (delta * (1)) = 0x40050e .byte 0xe // instruction (0xe = DW_CFA_def_cfa_offset) .uleb128 0x10 // operand1 (offset) CFA = rsp + 0x10 .byte 0x86 // instruction (0x86 = DW_CFA_offset, register = 0x6) .uleb128 0x2 // operand1 (offset) r6(rbp) = CFA + (0x2 * (-8)) .byte 0x4 // instruction (0x4 = DW_CFA_advance_loc4) .long .LCFI1-.LCFI0 // operand1 (4-byte delta) location = location + (delta * (1)) = 0x400511 .byte 0xd // instruction (0xd = DW_CFA_def_cfa_register) .uleb128 0x6 // operand1 (register) CFA = r6(rbp) + 0x10 .byte 0x4 // instruction (0x4 = DW_CFA_advance_loc4) .long .LCFI2-.LCFI1 // operand1 (4-byte delta) location = location + (delta * (1)) = 0x400528 .byte 0xc // instruction (0xc = DW_CFA_def_cfa) .uleb128 0x7 // operand1 (register) .uleb128 0x8 // operand2 (offset) CFA = r7(rsp) + 0x8 .align 8 // padding .LEFDE0: 00000018 0000000000000024 00000000 FDE cie=00000000 pc=000000000040050d..0000000000400529 LOC CFA rbp ra 000000000040050d rsp+8 u c-8 // initial rules, defined by CIE 000000000040050e rsp+16 c-16 c-8 0000000000400511 rbp+16 c-16 c-8 0000000000400528 rsp+8 c-16 c-8 instructions