e1d057bd609cea09bb468b679e10f834723dafc5
[dwarf-doc.git] / dwarf5 / latexdoc / splitobjects.tex
1 \chapter[Split DWARF Object Files (Informative)]{Split DWARF Object Files (Informative)}
2 \label{app:splitdwarfobjectsinformative}
3 \addtoindexx{DWARF compression}
4 \addtoindexx{DWARF duplicate elimination|see{\textit{also} DWARF compression}}
5 \addtoindexx{DWARF duplicate elimination|see{\textit{also} split DWARF object file}}
6 With the traditional DWARF format, debug information is designed
7 with the expectation that it will be processed by the linker to
8 produce an output binary with complete debug information, and
9 with fully-resolved references to locations within the
10 application. For very large applications, however, this approach
11 can result in excessively large link times and excessively large
12 output files. 
13
14 Several vendors have independently developed
15 proprietary approaches that allow the debug information to remain
16 in the relocatable object files, so that the linker does not have
17 to process the debug information or copy it to the output file.
18 These approaches have all required that additional information be
19 made available to the debug information consumer, and that the
20 consumer perform some minimal amount of relocation in order to
21 interpret the debug info correctly. The additional information
22 required, in the form of load maps or symbol tables, and the
23 details of the relocation are not covered by the DWARF
24 specification, and vary with each vendor's implementation.
25
26 Section \refersec{datarep:splitdwarfobjectfiles} describes a
27 platform-independent mechanism that allows a producer to
28 split the debugging information into relocatable and
29 non-relocatable partitions. This Appendix describes the use
30 of \splitDWARFobjectfile{s} and provides some illustrative
31 examples.
32
33 \section{Overview}
34 \label{app:splitoverview}
35 \DWARFVersionV{} introduces an optional set of debugging sections
36 that allow the compiler to partition the debugging information
37 into a set of (small) sections that require link-time relocation
38 and a set of (large) sections that do not. The sections that
39 require relocation are written to the relocatable object file as
40 usual, and are linked into the final executable. The sections
41 that do not require relocation, however, can be written to the
42 relocatable object (.o) file but ignored by the linker, or they
43 can be written to a separate DWARF object (.dwo{}) 
44 \addtoindexx{\texttt{.dwo} file extension} file.
45
46 \needlines{4}
47 The optional set of debugging sections includes the following:
48 \begin{itemize}
49 \item
50 \dotdebugabbrevdwo{} - Contains the abbreviations table(s) used by
51 the \dotdebuginfodwo{} section.
52 \item
53 \dotdebuginfodwo{} - Contains the \DWTAGcompileunit{} and
54 \DWTAGtypeunit{} DIEs and
55 their descendants. This is the bulk of the debugging
56 information for the compilation unit that is normally found
57 in the \dotdebuginfo{} section.
58 \item
59 \dotdebugloclistsdwo{} - Contains the location lists referenced by
60 the debugging information entries in the \dotdebuginfodwo{}
61 section. This contains the location lists normally found in 
62 the \dotdebugloclists{} section, with a 
63 modified format to eliminate the need for relocations.
64 \item
65 \dotdebugstrdwo{} - Contains the string table for all indirect
66 strings referenced by the debugging information in the
67 \dotdebuginfodwo{} sections.
68 \item
69 \dotdebugstroffsetsdwo{} - Contains the string offsets table
70 for the strings in the \dotdebugstrdwo{}{} section.
71 \item
72 \dotdebugmacrodwo{} - Contains macro definition information,
73 normally found in the \dotdebugmacro{} section.
74 \item
75 \dotdebuglinedwo{} - Contains \addtoindex{specialized line number table}s 
76 for the type units in the \dotdebuginfodwo{} section. These tables
77 contain only the directory and filename lists needed to
78 interpret \DWATdeclfile{} attributes in the debugging
79 information entries. Actual line number tables remain in the
80 \dotdebugline{} section, and remain in the relocatable object
81 (.o) files.
82
83 \end{itemize}
84
85 In a \texttt{.dwo} file, there is no benefit to having a separate string
86 section for directories and file names because the primary
87 string table will never be stripped. Accordingly, no
88 \texttt{.debug\_line\_str.dwo} section is defined. Content descriptions 
89 corresponding to \DWFORMlinestrp{} in an executable file (for example, 
90 in the skeleton compilation unit) instead use \DWFORMstrx. This allows
91 directory and file name strings to be merged with general
92 strings and across compilations in package files 
93 (where they are not subject to potential stripping).
94
95 In a \texttt{.dwo} file, referring to a string using \DWFORMstrp{}
96 is valid, but such use 
97 results in a file that cannot be incorporated into a package file
98 (which involves string merging).
99
100 In order for the consumer to locate and process the debug
101 information, the compiler must produce a small amount of debug
102 information that passes through the linker into the output
103 binary. A skeleton \dotdebuginfo{} section for each compilation unit
104 contains a reference to the corresponding \texttt{.o} or \texttt{.dwo}
105 file, and the \dotdebugline{} section (which is typically small
106 compared to the \dotdebuginfo{} sections) is
107 linked into the output binary, as is the new \dotdebugaddr{}
108 section.
109
110 \needlines{6}
111 The debug sections that continue to be linked into the
112 output binary include the following:
113 \begin{itemize}
114 \item
115 \dotdebugabbrev{} - Contains the abbreviation codes used by the
116 skeleton \dotdebuginfo{} section.
117 \item
118 \dotdebugaddr{} - Contains references to loadable sections,
119 indexed by attributes of form \DWFORMaddrx{} or location
120 expression 
121 \DWOPaddrx{} opcodes.
122 \item
123 \dotdebugaranges{} - Contains the accelerated range lookup table
124 for the compilation unit.
125 \item
126 \dotdebugframe{} - Contains the frame tables.
127 \item
128 \dotdebuginfo{} - Contains a skeleton \DWTAGcompileunit{} DIE,
129 but no children.
130 \item
131 \dotdebugline{} - Contains the line number tables.
132 (These could be moved to the .dwo file, but in
133 order to do so, each \DWLNEsetaddress{} opcode would need to
134 be replaced by a new opcode that referenced an entry in the
135 \dotdebugaddr{} section. Furthermore, leaving this section in the
136 .o file allows many debug info consumers to remain unaware of
137 .dwo files.)
138 \item
139 \dotdebuglinestr{} - Contains strings for file names used in
140 combination with the \dotdebugline{} section.
141 \item
142 \dotdebugnames{} - Contains the names for use in
143 building an index section. 
144 The section header refers to a
145 compilation unit offset, which is the offset of the
146 skeleton compilation unit in the \dotdebuginfo{} section.
147 \bbeb
148 \item
149 \dotdebugstr{} - Contains any strings referenced by the skeleton
150 \dotdebuginfo{} sections (via \DWFORMstrp{} or \DWFORMstrx{}).
151 \item
152 \dotdebugstroffsets{} - Contains the string offsets table for
153 the strings in the \dotdebugstr{} section (if form \DWFORMstrx{} is used).
154 \end{itemize}
155
156 \needlines{6}
157 The skeleton \DWTAGcompileunit{} DIE 
158 may have the following attributes:
159 \autocols[0pt]{c}{3}{l}{
160 \DWATaddrbase{},
161 \DWATcompdir{},
162 \DWATdwoname{},
163 %\DWATdwoid{},
164 \DWAThighpc{},
165 \DWATlowpc{},
166 \DWATranges{},
167 \bbeb
168 \DWATstmtlist{},
169 \DWATstroffsetsbase{}
170 }
171
172 All other attributes of the compilation unit DIE are moved to
173 the full DIE in the \dotdebuginfodwo{} section.
174
175 The \HFNdwoid{} field is present in headers of the skeleton DIE 
176 and the header of the full DIE, so that a consumer
177 can verify a match.
178
179 \needlines{4}
180 Relocations are neither necessary nor useful in 
181 \texttt{.dwo} files, because the \texttt{.dwo}  
182 files contain only debugging information that does not need to be
183 processed by a linker. Relocations are rendered unnecessary via
184 four strategies:
185
186 \begin{enumerate}[1. ]
187 \item Some values needing relocation are kept in the \texttt{.o} file
188 (for example, references to the line number program from the skeleton
189 compilation unit).
190
191 \item Some values do not need a relocation because they refer from
192 one \dotdwo{} section to another \dotdwo{} section
193 in the same compilation unit. 
194
195 \item Some values that need a relocation to refer to a relocatable 
196 program address use the \DWFORMaddrx{} form, referencing a relocatable 
197 value in the \dotdebugaddr{} section (which remains in the .o file).
198
199 \bbpareb
200 \end{enumerate}
201
202
203 Table \refersec{tab:unitattributesbyunitkind} summarizes which
204 attributes are defined for use in the various 
205 kinds of compilation units (see Section \refersec{chap:unitentries}). 
206 It compares and contrasts both conventional and split object-related
207 kinds.
208
209 \begin{table}[ht]
210 \caption{Unit attributes by unit kind}
211 \label{tab:unitattributesbyunitkind}
212 \begin{tabular}{P{5.5cm}|cc|ccc}
213 \hline
214                         & \multicolumn{5}{c}{\bfseries Unit Kind} \\
215                         & \multicolumn{2}{c}{\bfseries Conventional} 
216                                               & \multicolumn{3}{c}{\bfseries Skeleton and Split} \\
217 \bfseries Attribute     & Full \&    &  Type  &  Skeleton & Split Full & Split Type \\
218                         & Partial    &        &           &            &            \\
219 \hline
220 \DWATaddrbase           & \chkmk  &        &  \chkmk   &        &         \\
221 \hline
222 \DWATbasetypes          & \chkmk  &        &           &        &         \\
223 \hline
224 \DWATcompdir            & \chkmk  &        &  \chkmk   &        &         \\
225 \hline
226 %\DWATdwoid             &         &        &  \chkmk   & \chkmk &         \\
227 %\hline
228 \DWATdwoname            &         &        &  \chkmk   &        &         \\
229 \hline
230 \DWATentrypc            & \chkmk  &        &           & \chkmk &         \\
231 \hline
232 \DWAThighpc             & \chkmk  &        &  \chkmk   &        &         \\
233 \hline
234 \DWATidentifiercase     & \chkmk  &        &           & \chkmk &         \\
235 \hline
236 \DWATlanguage           & \chkmk  & \chkmk &           & \chkmk & \chkmk  \\
237 \hline
238 \bb
239 \DWATloclistsbase       & \chkmk  &        &           &        &         
240 \eb
241 \\
242 \hline
243 \DWATlowpc              & \chkmk  &        &  \chkmk   &        &         \\
244 \hline
245 \DWATmacros             & \chkmk  &        &           & \chkmk &         \\
246 \hline
247 \DWATmainsubprogram     & \chkmk  &        &           & \chkmk &         \\
248 \hline
249 \DWATname               & \chkmk  &        &           & \chkmk &         \\
250 \hline
251 \DWATproducer           & \chkmk  &        &           & \chkmk &         \\
252 \hline
253 \bb
254 \DWATranges \eb         & \chkmk  &        &           & \chkmk &         \\
255 \hline
256 \bb
257 \DWATrnglistsbase \eb   & \chkmk  &        &           &        &         \\
258 \hline
259 \DWATstmtlist           & \chkmk  & \chkmk &  \chkmk   &        & \chkmk  \\
260 \hline
261 \DWATstroffsetsbase     & \chkmk  & \chkmk &  \chkmk   &        &         \\
262 \hline
263 \DWATuseUTFeight        & \chkmk  & \chkmk &  \chkmk   & \chkmk & \chkmk  \\
264 \hline
265 \end{tabular}
266 \end{table}
267
268 \needlines{8}
269 The split dwarf object file design depends on having an index of 
270 debugging information available to the consumer. For name lookups, 
271 the consumer can use the \dotdebugnames{} index section (see 
272 Section \refersec{chap:acceleratedaccess}) to 
273 locate a skeleton compilation unit. The
274 \DWATcompdir{} and \DWATdwoname{} attributes in the skeleton
275 compilation unit can then be used to locate the corresponding
276 DWARF object file for the compilation unit. Similarly, for an
277 address lookup, the consumer can use the \dotdebugaranges{} table,
278 which will also lead to a skeleton compilation unit. For a file
279 and line number lookup, the skeleton compilation units can be
280 used to locate the line number tables.
281
282 \clearpage
283
284 \section{Split DWARF Object File Example}
285 \label{app:splitdwarfobjectfileexample}
286 \addtoindexx{split DWARF object file!example}
287 Consider the example source code in 
288 Figure \refersec{fig:splitobjectexamplesourcefragment1}, 
289 Figure \refersec{fig:splitobjectexamplesourcefragment2} and
290 Figure \refersec{fig:splitobjectexamplesourcefragment3}.
291 When compiled with split DWARF, we will have two DWARF object files,
292 \texttt{demo1.o} and \texttt{demo2.o}, and two \splitDWARFobjectfile{s}, 
293 \texttt{demo1.dwo} and \texttt{demo2.dwo}.
294
295 \vspace{2cm}
296 \begin{figure}[ht]
297 \textit{File demo1.cc}
298 \begin{lstlisting}
299 #include "demo.h"
300
301 bool Box::contains(const Point& p) const
302 {
303     return (p.x() >= ll_.x() && p.x() <= ur_.x() &&
304             p.y() >= ll_.y() && p.y() <= ur_.y());
305 }
306 \end{lstlisting}
307 \caption{Split object example: source fragment \#1}
308 \label{fig:splitobjectexamplesourcefragment1}
309 \end{figure}
310
311 \begin{figure}[ht]
312 \textit{File demo2.cc}
313 \begin{lstlisting}
314 #include "demo.h"
315
316 bool Line::clip(const Box& b)
317 {
318   float slope = (end_.y() - start_.y()) / (end_.x() - start_.x());
319   while (1) {
320     // Trivial acceptance.
321     if (b.contains(start_) && b.contains(end_)) return true;
322
323     // Trivial rejection.
324     if (start_.x() < b.l() && end_.x() < b.l()) return false;
325     if (start_.x() > b.r() && end_.x() > b.r()) return false;
326     if (start_.y() < b.b() && end_.y() < b.b()) return false;
327     if (start_.y() > b.t() && end_.y() > b.t()) return false;
328
329     if (b.contains(start_)) {
330       // Swap points so that start_ is outside the clipping 
331       // rectangle.
332       Point temp = start_;
333       start_ = end_;
334       end_ = temp;
335     }
336
337     if (start_.x() < b.l())
338       start_ = Point(b.l(), 
339                      start_.y() + (b.l() - start_.x()) * slope);
340     else if (start_.x() > b.r())
341       start_ = Point(b.r(), 
342                      start_.y() + (b.r() - start_.x()) * slope);
343     else if (start_.y() < b.b())
344       start_ = Point(start_.x() + (b.b() - start_.y()) / slope, 
345                      b.b());
346     else if (start_.y() > b.t())
347       start_ = Point(start_.x() + (b.t() - start_.y()) / slope, 
348                      b.t());
349   }
350 }
351 \end{lstlisting}
352 \caption{Split object example: source fragment \#2}
353 \label{fig:splitobjectexamplesourcefragment2}
354 \end{figure}
355
356 \begin{figure}[ht]
357 \textit{File demo.h}
358 \begin{lstlisting}
359 class A {
360   public:
361     Point(float x, float y) : x_(x), y_(y){}
362     float x() const { return x_; }
363     float y() const { return y_; }
364   private:
365     float x_;
366     float y_;
367 };
368
369 class Line {
370   public:
371     Line(Point start, Point end) : start_(start), end_(end){}
372     bool clip(const Box& b);
373     Point start() const { return start_; }
374     Point end() const { return end_; }
375   private:
376     Point start_;
377     Point end_;
378 };
379
380 class Box {
381   public:
382     Box(float l, float r, float b, float t) : ll_(l, b), ur_(r, t){}
383     Box(Point ll, Point ur) : ll_(ll), ur_(ur){}
384     bool contains(const Point& p) const;
385     float l() const { return ll_.x(); }
386     float r() const { return ur_.x(); }
387     float b() const { return ll_.y(); }
388     float t() const { return ur_.y(); }
389   private:
390     Point ll_;
391     Point ur_;
392 };
393
394 \end{lstlisting}
395 \caption{Split object example: source fragment \#3}
396 \label{fig:splitobjectexamplesourcefragment3}
397 \end{figure}
398
399 \clearpage
400 \subsection{Contents of the Object File}
401 The object files each contain the following sections of debug
402 information:
403 \begin{alltt}
404   \dotdebugabbrev
405   \dotdebuginfo
406   \dotdebugline
407   \dotdebugstr
408   \dotdebugaddr
409   \dotdebugnames
410   \dotdebugaranges
411 \end{alltt}
412
413 The \dotdebugabbrev{} section contains just a single entry describing
414 the skeleton compilation unit DIE.
415
416 The DWARF description in the \dotdebuginfo{} section 
417 contains just a single DIE, the skeleton compilation unit, 
418 which may look like 
419 Figure \referfol{fig:splitdwafexampleskeletondwarfdescription}.
420
421 \begin{figure}[ht]
422 \begin{dwflisting}
423 \begin{alltt}
424
425     \DWTAGskeletonunit
426         \DWATcompdir: (reference to directory name in .debug_str)
427         \DWATdwoname: (reference to "demo1.dwo" in .debug_str)
428         \DWATaddrbase: (reference to .debug_addr section)
429         \DWATstmtlist: (reference to .debug_line section)
430         \DWATlowpc: 0
431       
432 \end{alltt}
433 \end{dwflisting}
434 \caption{Split object example: Skeleton DWARF description}
435 \label{fig:splitdwafexampleskeletondwarfdescription}
436 \end{figure}
437
438 The \DWATcompdir{} and \DWATdwoname{} attributes provide the
439 location of the corresponding \splitDWARFobjectfile{} that
440 contains the full debug information; that file is normally
441 expected to be in the same directory as the object file itself.
442
443 The \HFNdwoid{} field in the header of the skeleton unit provides 
444 an ID or key for the debug information contained in the 
445 DWARF object file. This ID serves
446 two purposes: it can be used to verify that the debug information
447 in the \splitDWARFobjectfile{} matches the information in the object
448 file, and it can be used to find the debug information in a DWARF
449 package file.
450
451 The \DWATaddrbase{} attribute contains the relocatable offset of
452 this object file's contribution to the \dotdebugaddr{} section.
453 \bbeb
454
455 The \DWATstmtlist{} attribute contains the relocatable offset of
456 this file's contribution to the \dotdebugline{} table.
457
458 \bbpareb
459
460 \needlines{6}
461 The \dotdebugline{} section contains the full line number table for
462 the compiled code in the object file. As shown in
463 Figure \refersec{fig:splitobjectexamplesourcefragment1}, the line
464 number program header lists the two file names, \texttt{demo.h} and
465 \texttt{demo1.cc}, and contains line number programs for
466 \texttt{Box::contains}, \texttt{Point::x}, and \texttt{Point::y}.
467
468 The \dotdebugstr{} section contains the strings referenced indirectly
469 by the compilation unit DIE and by the line number program.
470
471 The \dotdebugaddr{} section contains relocatable addresses of
472 locations in the loadable text and data that are referenced by
473 debugging information entries in the split DWARF object. In the
474 example in \refersec{fig:splitobjectexamplesourcefragment3}, 
475 \texttt{demo1.o} may have three entries:
476 \begin{center}
477 %\footnotesize
478 \begin{tabular}{cl}
479 Slot & Location referenced \\
480 \hline
481    0   &  low PC value for \texttt{Box::contains}  \\
482    1   &  low PC value for \texttt{Point::x}       \\
483    2   &  low PC value for \texttt{Point::y}       \\
484 \end{tabular}
485 \end{center}
486
487 \needlines{4}
488 The \dotdebugnames{}
489 section contains the names defined by the debugging
490 information in the \splitDWARFobjectfile{} 
491 (see Section \refersec{chap:contentsofthenameindex}), 
492 and references the skeleton compilation unit. 
493 When linked together into a final executable,
494 they can be used by a DWARF consumer to lookup a name to find one
495 or more skeleton compilation units that provide information about
496 that name. From the skeleton compilation unit, the consumer can
497 find the \splitDWARFobjectfile{} that it can then read to get the full
498 DWARF information.
499
500 The \dotdebugaranges{} section contains the PC ranges defined in this
501 compilation unit, and allow a DWARF consumer to map a PC value to
502 a skeleton compilation unit, and then to a \splitDWARFobjectfile.
503
504
505 \subsection{Contents of the Split DWARF Object Files}
506 The \splitDWARFobjectfile{s} each contain the following sections:
507 \begin{alltt}
508   \dotdebugabbrevdwo
509   \dotdebuginfodwo{} (for the compilation unit)
510   \dotdebuginfodwo{} (one COMDAT section for each type unit)
511   \dotdebugloclistsdwo
512   \dotdebuglinedwo
513   \dotdebugmacrodwo
514   \dotdebugrnglistsdwo
515   \dotdebugstroffsetsdwo
516   \dotdebugstrdwo
517 \end{alltt}
518 The \dotdebugabbrevdwo{} section contains the abbreviation
519 declarations for the debugging information entries in the
520 \dotdebuginfodwo{} section. 
521
522 The \dotdebuginfodwo{} section containing the compilation unit
523 contains the full debugging information for the compile unit, and
524 looks much like a normal \dotdebuginfo{} section in a non-split
525 object file, with the following exceptions:
526 \begin{itemize}
527 \item The \DWTAGcompileunit{} DIE does not need to repeat the
528 \DWATranges, \DWATlowpc, \DWAThighpc, and
529 \DWATstmtlist{} attributes that are provided in the skeleton
530 compilation unit.
531
532 \item References to strings in the string table use the 
533 form code \DWFORMstrx, referring to slots in the
534 \dotdebugstroffsetsdwo{} section.
535
536 \bbpareb
537
538 \needlines{4}
539 \item References to relocatable addresses in the object file 
540 use the form code \DWFORMaddrx, referring to slots in the
541 \dotdebugaddr{} table, relative to the base offset given by
542 \DWATaddrbase{} in the skeleton compilation unit.
543 \end{itemize}
544
545 \vspace*{1mm}
546 Figure \referfol{fig:splitobjectexampledemoonedwodwarfexcerpts} presents
547 excerpts from the \dotdebuginfodwo{} section for \texttt{demo1.dwo}.
548
549 \begin{figure}[ht]
550 \vspace{1mm}
551 \figurepart{1}{2}
552 \begin{dwflisting}
553 \begin{alltt}
554
555     \DWTAGcompileunit
556         \DWATproducer [\DWFORMstrx]: (slot 15) (producer string)
557         \DWATlanguage: \DWLANGCplusplus
558         \DWATname [\DWFORMstrx]: (slot 7) "demo1.cc"
559         \DWATcompdir [\DWFORMstrx]: (slot 4) (directory name)
560 1$:     \DWTAGclasstype
561             \DWATname [\DWFORMstrx]: (slot 12) "Point"
562             \DWATsignature [\DWFORMrefsigeight]: 0x2f33248f03ff18ab
563             \DWATdeclaration: true
564 2$:         \DWTAGsubprogram
565                 \DWATexternal: true
566                 \DWATname [\DWFORMstrx]: (slot 12) "Point"
567                 \DWATdeclfile: 1
568                 \DWATdeclline: 5
569                 \DWATlinkagename [\DWFORMstrx]: (slot 16) "_ZN5PointC4Eff"
570                 \DWATaccessibility: \DWACCESSpublic
571                 \DWATdeclaration: true
572             ...
573 3$:     \DWTAGclasstype
574             \DWATname [\DWFORMstring]: "Box"
575             \DWATsignature [\DWFORMrefsigeight{}]: 0xe97a3917c5a6529b
576             \DWATdeclaration: true
577           ...
578 4$:         \DWTAGsubprogram
579                 \DWATexternal: true
580                 \DWATname [\DWFORMstrx]: (slot 0) "contains"
581                 \DWATdeclfile: 1
582                 \DWATdeclline: 28
583                 \DWATlinkagename [\DWFORMstrx: (slot 8) 
584                                                   "_ZNK3Box8containsERK5Point"
585                 \DWATtype: (reference to 7$)
586                 \DWATaccessibility: \DWACCESSpublic
587                 \DWATdeclaration: true
588           ...
589
590 \end{alltt}
591 \end{dwflisting}
592 \caption{Split object example: \texttt{demo1.dwo} excerpts}
593 \label{fig:splitobjectexampledemoonedwodwarfexcerpts}
594 \end{figure}
595         
596 \begin{figure}
597 \figurepart{2}{2}
598 \begin{dwflisting}
599 \begin{alltt}
600
601 5$:   \DWTAGsubprogram
602           \DWATspecification: (reference to 4$)
603           \DWATdeclfile: 2
604           \DWATdeclline: 3
605           \DWATlowpc [\DWFORMaddrx]: (slot 0)
606           \DWAThighpc [\DWFORMdataeight]: 0xbb
607           \DWATframebase: \DWOPcallframecfa
608           \DWATobjectpointer: (reference to 6$)
609 6$:       \DWTAGformalparameter
610               \DWATname [\DWFORMstrx]: (slot 13): "this"
611               \DWATtype: (reference to 8$)
612               \DWATartificial: true
613               \DWATlocation: \DWOPfbreg(-24)
614           \DWTAGformalparameter
615               \DWATname [\DWFORMstring]: "p"
616               \DWATdeclfile: 2
617               \DWATdeclline: 3
618               \DWATtype: (reference to 11$)
619               \DWATlocation: \DWOPfbreg(-32)
620       ...
621 7$:   \DWTAGbasetype
622           \DWATbytesize: 1
623           \DWATencoding: \DWATEboolean
624           \DWATname [\DWFORMstrx]: (slot 5) "bool"
625       ...
626 8$:   \DWTAGconsttype
627           \DWATtype: (reference to 9$)
628 9$:   \DWTAGpointertype
629           \DWATbytesize: 8
630           \DWATtype: (reference to 10$)
631 10$:  \DWTAGconsttype
632           \DWATtype: (reference to 3$)
633       ...
634 11$:  \DWTAGconsttype
635           \DWATtype: (reference to 12$)
636 12$:  \DWTAGreferencetype
637           \DWATbytesize: 8
638           \DWATtype: (reference to 13$)
639 13$:  \DWTAGconsttype
640           \DWATtype: (reference to 1$)
641       ...
642 \end{alltt}
643 \end{dwflisting}
644 \begin{center}
645 \vspace{3mm}
646 Figure~\ref{fig:splitobjectexampledemoonedwodwarfexcerpts}: Split object example: \texttt{demo1.dwo} DWARF excerpts \textit{(concluded)}
647 \end{center}
648 \end{figure}
649
650 \needlines{4}
651 In the defining declaration for \texttt{Box::contains} at 5\$, the
652 \DWATlowpc{} attribute is represented with \DWFORMaddrx,
653 referring to slot 0 in the \dotdebugaddr{} table from \texttt{demo1.o}.
654 That slot contains the relocated address of the beginning of the
655 function.
656
657 Each type unit is contained in its own COMDAT \dotdebuginfodwo{}
658 section, and looks like a normal type unit in a non-split object,
659 except that the \DWTAGtypeunit{} DIE contains a \DWATstmtlist{}
660 attribute that refers to a specialized \dotdebuglinedwo{}
661 \addtoindexx{type unit!specialized \texttt{.debug\_line.dwo} section in}
662 \addtoindexx{specialized \texttt{.debug\_line.dwo} section}
663 section. This
664 section contains a normal line number
665 program header with a list of include directories and filenames,
666 but no line number program. This section is used only as a
667 reference for filenames needed for \DWATdeclfile{} attributes
668 within the type unit.
669
670 The \dotdebugstroffsetsdwo{} section contains an entry for each
671 unique string in the string table. 
672 Each entry in the table is the offset of the string, which is
673 contained in the \dotdebugstrdwo{} section. 
674
675 In a split DWARF object file, all references to
676 strings go through this table (there are no
677 other offsets to \dotdebugstrdwo{} in a split
678 DWARF object file). That is, there
679 is no use of \DWFORMstrp{} in a split DWARF object file.
680
681 The offsets in these slots have no associated relocations, 
682 because they are not part of a relocatable object file.
683
684 \needlines{4}
685 When combined into a DWARF package file, however, each 
686 slot must be adjusted to refer to the appropriate offset 
687 within the merged string table (\dotdebugstrdwo{}).
688 The tool that builds the DWARF package file must understand 
689 the structure of the \dotdebugstroffsetsdwo{} section in 
690 order to apply the necessary adjustments. 
691 Section \refersec{app:dwarfpackagefileexample} presents
692 an example of a DWARF package file.
693
694 \needlines{4}
695 The \dotdebugloclistsdwo{} section contains the location lists referenced
696 by \DWATlocation{} attributes in the \dotdebuginfodwo{} section. This
697 section has a similar format to the \bbeb\dotdebugloclists{} section in a
698 non-split object, but it has some small differences as explained
699 in Section \refersec{datarep:locationlists}. 
700
701 \begin{figure}[b]
702 \figurepart{1}{2}
703 \begin{dwflisting}
704 \begin{alltt}
705
706 1$: \DWTAGclasstype
707         \DWATname [\DWFORMstrx]: (slot 20) "Line"
708         \DWATsignature [\DWFORMrefsigeight]: 0x79c7ef0eae7375d1
709         \DWATdeclaration: true
710         ...
711 2$:     \DWTAGsubprogram
712             \DWATexternal: true
713             \DWATname [\DWFORMstrx]: (slot 19) "clip"
714             \DWATdeclfile: 2
715             \DWATdeclline: 16
716             \DWATlinkagename [\DWFORMstrx]: (slot 2) "_ZN4Line4clipERK3Box"
717             \DWATtype: (reference to DIE for bool)
718             \DWATaccessibility: \DWACCESSpublic
719             \DWATdeclaration: true
720         ...
721
722 \end{alltt}
723 \end{dwflisting}
724 \caption{Split object example: \texttt{demo2.dwo} DWARF \dotdebuginfodwo{} excerpts}
725 \label{fig:splitobjectexampledemotwodwodwarfdebuginfodwoexcerpts}
726 \end{figure}
727
728 \begin{figure}[t]
729 \figurepart{2}{2}
730 \begin{dwflisting}
731 \begin{alltt}
732
733 3$:   \DWTAGsubprogram
734           \DWATspecification: (reference to 2$)
735           \DWATdeclfile: 1
736           \DWATdeclline: 3
737           \DWATlowpc [\DWFORMaddrx]: (slot 32)
738           \DWAThighpc [\DWFORMdataeight]: 0x1ec
739           \DWATframebase: \DWOPcallframecfa
740           \DWATobjectpointer: (reference to 4$)
741 4$:       \DWTAGformalparameter
742               \DWATname: (indexed string: 0x11): this
743               \DWATtype: (reference to DIE for type const Point* const)
744               \DWATartificial: 1
745               \DWATlocation: 0x0 (location list)
746 5$:       \DWTAGformalparameter
747               \DWATname: b
748               \DWATdeclfile: 1
749               \DWATdeclline: 3
750               \DWATtype: (reference to DIE for type const Box& const)
751               \DWATlocation [\DWFORMsecoffset]: 0x2a
752 6$:       \DWTAGlexicalblock
753               \DWATlowpc [\DWFORMaddrx]: (slot 17)
754               \DWAThighpc: 0x1d5
755 7$:           \DWTAGvariable
756                   \DWATname [\DWFORMstrx]: (slot 28): "slope"
757                   \DWATdeclfile: 1
758                   \DWATdeclline: 5
759                   \DWATtype: (reference to DIE for type float)
760                   \DWATlocation [\DWFORMsecoffset]: 0x49
761
762 \end{alltt}
763 \end{dwflisting}
764 \begin{center}
765 \vspace{3mm}
766 Figure~\ref{fig:splitobjectexampledemotwodwodwarfdebuginfodwoexcerpts}: Split object example: \texttt{demo2.dwo} DWARF \dotdebuginfodwo{} excerpts \textit{(concluded)}
767 \end{center}
768 \end{figure}
769
770
771 In \texttt{demo2.dwo} as shown in 
772 Figure \refersec{fig:splitobjectexampledemotwodwodwarfdebuginfodwoexcerpts}, 
773 the debugging information for \texttt{Line::clip} 
774 starting at \texttt{2\$} describes a local 
775 variable \texttt{slope} at \texttt{7\$}
776 whose location varies based on the PC.
777 Figure \refersec{fig:splitobjectexampledemotwodwodwarfdebuglocdwoexcerpts} 
778 presents some excerpts from the \dotdebuginfodwo{} section for 
779 \texttt{demo2.dwo}.
780
781 \clearpage
782
783 In Figure \refersec{fig:splitobjectexampledemotwodwodwarfdebuginfodwoexcerpts},
784 the \DWTAGformalparameter{} entries at \texttt{4\$} and \texttt{5\$} refer to the
785 location lists at offset \texttt{0x0} and \texttt{0x2a}, respectively, and the
786 \DWTAGvariable{} entry for \texttt{slope} 
787 refers to the location list at offset \texttt{0x49}. 
788 Figure \refersec{fig:splitobjectexampledemotwodwodwarfdebuglocdwoexcerpts}
789 shows a representation of the
790 location lists at those offsets in the \dotdebugloclistsdwo{} section.
791
792 % Special commands for use in the folloing table
793 \newcommand{\XXLLEsl}{\hyperlink{chap:DWLLEstartlength}{start\_length}
794                       \index{DW\_LLE\_start\_length}}
795 \newcommand{\XXLLEeol}{\hyperlink{chap:DWLLEendoflist}{end\_of\_list}
796                        \index{DW\_LLE\_end\_of\_list}}
797
798 \begin{figure}[ht]
799 \begin{dwflisting}
800 \begin{center}
801 \begin{tabular}{rl|rr|rl}
802    \multicolumn{2}{c}{\textbf{Entry type}}
803                 & \multicolumn{2}{c}{\textbf{Range}} 
804                                 & \multicolumn{2}{l}{\hspace{6mm}\textbf{Counted Location Description}} \\
805 offset& (DW\_LLE\_*)   
806                 & start& length & length & expression \\
807 \hline
808 &&&&& \\
809
810 0x00 & \XXLLEsl &  [9] & 0x002f & 0x0001 & \DWOPregfive~(rdi) \\
811 0x09 & \XXLLEsl & [11] & 0x01b9 & 0x0001 & \DWOPregthree~(rbx) \\
812 0x12 & \XXLLEsl & [29] & 0x0003 & 0x0003 & \DWOPbregtwelve~(r12): -8;\\
813      &          &      &        &        & \DWOPstackvalue \\
814 0x1d & \XXLLEsl & [31] & 0x0001 & 0x0003 & \DWOPentryvalue: \\
815      &          &      &        &        & (\DWOPregfive~(rdi)); \\
816      &          &      &        &        & \DWOPstackvalue \\
817 0x29 & \XXLLEeol &&&& \\
818 ------ &&&&& \\
819
820 0x2a & \XXLLEsl &  [9] & 0x002f & 0x0001 & \DWOPregfour~(rsi)) \\
821 0x33 & \XXLLEsl & [11] & 0x01ba & 0x0003 & \DWOPregsix~(rbp)) \\
822 0x3c & \XXLLEsl & [30] & 0x0003 & 0x0003 & \DWOPentryvalue: \\
823      &          &      &        &        & (\DWOPregfour~(rsi)); \\
824      &          &      &        &        & \DWOPstackvalue \\
825 0x48 & \XXLLEeol &&&& \\
826 ------ &&&&& \\
827
828 0x49 & \XXLLEsl & [10] & 0x0004 & 0x0001 & \DWOPregeighteen~(xmm1) \\
829 0x52 & \XXLLEsl & [11] & 0x01bd & 0x0002 & \DWOPfbreg: -36 \\
830 0x5c & \XXLLEeol &&&& \\
831 &&&& \\
832 \end{tabular}
833 \end{center}
834 \end{dwflisting}
835 \caption{Split object example: \texttt{demo2.dwo} DWARF \dotdebugloclistsdwo{} excerpts}
836 \label{fig:splitobjectexampledemotwodwodwarfdebuglocdwoexcerpts}
837 \end{figure}
838
839 \bb
840 In each \DWLLEstartlength{} entry, 
841 \eb
842 the start field is the index
843 of a slot in the \dotdebugaddr{} section, relative to the base
844 offset defined by the compilations unit's \DWATaddrbase{}
845 attribute. The \dotdebugaddr{} slots referenced by these entries give
846 the relocated address of a label within the function where the
847 address range begins. 
848 The following length field gives the length of the
849 address range. The location, consisting of its own length and
850 a DWARF expression, is last.
851
852 \clearpage
853 \section{DWARF Package File Example}
854 \label{app:dwarfpackagefileexample}
855 \addtoindexx{DWARF duplicate elimination!examples}
856
857 A \addtoindex{DWARF package file} 
858 (see Section \refersec{datarep:dwarfpackagefiles}) 
859 is a collection of split DWARF object files.
860 In general, it will be much smaller than the sum of the split
861 DWARF object files, because the packaging process removes duplicate
862 type units and merges the string tables. Aside from those two
863 optimizations, however, each compilation unit and each type unit
864 from a split DWARF object file is copied verbatim into the package
865 file.
866
867 The package file contains the same set of sections as a split
868 DWARF object file, plus two additional sections described below.
869
870 The packaging utility, like a linker, combines sections of the
871 same name by concatenation. While a split DWARF object may
872 contain multiple \dotdebuginfodwo{} sections, one for the
873 compilation unit, and one for each type unit, a package file
874 contains a single \dotdebuginfodwo{} section. The combined
875 \dotdebuginfodwo{} section contains each compilation unit and one
876 copy of each type unit (discarding any duplicate type
877 signatures).
878
879 As part of merging the string tables, the packaging utility
880 treats the \dotdebugstrdwo{} and \dotdebugstroffsetsdwo{}
881 sections specially. Rather than
882 combining them by simple concatenation, it instead builds a new
883 string table consisting of the unique strings from each input
884 string table. Because all references to these strings use
885 form \DWFORMstrx{},
886 the packaging utility only needs to adjust the
887 string offsets in each \dotdebugstroffsetsdwo{} contribution after
888 building the new \dotdebugstrdwo{} section.
889
890 Each compilation unit or type unit consists of a set of
891 inter-related contributions to each section in the package file.
892 For example, a compilation unit may have contributions in
893 \dotdebuginfodwo{}, \dotdebugabbrevdwo{}, \dotdebuglinedwo{},
894 \dotdebugstroffsetsdwo{}, and so on. In order to maintain the ability 
895 for a consumer to follow references between these sections, the
896 package file contains two additional sections: a compilation unit
897 (CU) index, and a type unit (TU) index. These indexes allow a
898 consumer to look up a compilation unit (by its \CUsignature) or 
899 a type unit (by its \TUsignature), and locate each contribution 
900 that belongs to that unit.
901
902 For example, consider a package file, \texttt{demo.dwp}, formed by
903 combining \texttt{demo1.dwo} and \texttt{demo2.dwo} from the previous example
904 (see Appendix \refersec{app:splitdwarfobjectfileexample}). The
905 resulting package file would contain the sections shown in Figure
906 \refersec{fig:sectionsandcontributionsinapackagefile}, 
907 with contributions from each input file as shown.
908
909 \begin{figure}[ht]
910 \begin{center}
911 \begin{tabular}{P{4.7cm}|P{8cm}}
912 \hline
913 \bfseries Section & \bfseries Source of section contributions \\
914 \hline
915   \dotdebugabbrevdwo{}
916 &    \dotdebugabbrevdwo{} from \texttt{demo1.dwo} \newline
917      \dotdebugabbrevdwo{} from \texttt{demo2.dwo} \\
918 \hline \newline
919   \dotdebuginfodwo{} \newline (for the compilation units and type units)
920 &    compilation unit from \texttt{demo1.dwo} \newline
921      compilation unit from \texttt{demo2.dwo} \newline
922      type unit for class \texttt{Box} from \texttt{demo1.dwo}   \newline
923      type unit for class \texttt{Point} from \texttt{demo1.dwo} \newline
924      type unit for class \texttt{Line} from \texttt{demo2.dwo}  \\
925 \hline
926   \dotdebugloclistsdwo{}
927 &    \dotdebugloclistsdwo{} from \texttt{demo1.dwo} \newline
928      \dotdebugloclistsdwo{} from \texttt{demo2.dwo} \\
929 \hline
930   \dotdebuglinedwo{}
931 &    \dotdebuglinedwo{} from \texttt{demo1.dwo} \newline
932      \dotdebuglinedwo{} from \texttt{demo2.dwo} \\
933 \hline
934   \dotdebugstroffsetsdwo{}
935 &    \dotdebugstroffsetsdwo{} from \texttt{demo1.dwo}, \hspace*{6mm}adjusted \newline
936      \dotdebugstroffsetsdwo{} from \texttt{demo2.dwo}, \hspace*{6mm}adjusted \\
937 \hline
938   \dotdebugstrdwo{}
939 &    merged string table generated by package utility \\
940 \hline
941   \dotdebugcuindex
942 &    CU index generated by package utility \\
943 \hline
944   \dotdebugtuindex
945 &    TU index generated by package utility \\
946 \hline
947 \end{tabular}
948 \end{center}
949 \caption{Sections and contributions in example package file \texttt{demo.dwp}}
950 \label{fig:sectionsandcontributionsinapackagefile}
951 \end{figure}
952
953 \needlines{4}
954 The \dotdebugabbrevdwo{}, \dotdebugloclistsdwo{} and \dotdebuglinedwo{}
955 sections are copied over from the two \texttt{.dwo} files as
956 individual contributions to the corresponding sections in the
957 \texttt{.dwp} file. 
958 The offset of each contribution within 
959 the combined section and the size of each contribution is recorded
960 as part of the CU and TU index sections.
961
962 The \dotdebuginfodwo{} sections corresponding to each compilation 
963 unit are copied as individual contributions to the combined
964 \dotdebuginfodwo{} section, and one copy of each type unit 
965 is also copied. The type units for class \texttt{Box} and class 
966 \texttt{Point}, for example, are contained in both \texttt{demo1.dwo} 
967 and \texttt{demo2.dwo}, but only one instance of each is copied into 
968 the package file.
969
970 The \dotdebugstrdwo{} sections from each file are merged to
971 form a new string table with no duplicates, requiring the
972 adjustment of all references to those strings. The
973 \dotdebugstroffsetsdwo{} sections from the \texttt{.dwo} files 
974 are copied as individual contributions, but the string table offset
975 in each slot of those contributions is adjusted to point to
976 the correct offset in the merged string table.
977
978 \needlines{4}
979 The \dotdebugcuindex{} and \dotdebugtuindex{} sections provide a
980 directory to these contributions. 
981 Figure \referfol{fig:examplecuindexsection} shows an example CU
982 index section containing the two compilation units from 
983 \texttt{demo1.dwo} and \texttt{demo2.dwo}. The CU index shows that 
984 for the compilation unit from \texttt{demo1.dwo}, with \CUsignature{} 
985 \texttt{0x044e413b8a2d1b8f}, its contribution to the \dotdebuginfodwo{} 
986 section begins at offset 0, and is 325 bytes long. For the compilation 
987 unit from \texttt{demo2.dwo}, with \CUsignature{} 
988 \texttt{0xb5f0ecf455e7e97e}, its contribution to the \dotdebuginfodwo{}
989 section begins at offset 325, and is 673 bytes long.
990
991 Likewise, we can find the contributions to the related sections.
992 In Figure \refersec{fig:splitobjectexampledemotwodwodwarfdebuglocdwoexcerpts}, 
993 we see that the \DWTAGvariable{} DIE at \texttt{7\$} has a
994 reference to a location list at offset 0x49 (decimal 73). Because
995 this is part of the compilation unit for \texttt{demo2.dwo}, with 
996 unit signature \texttt{0xb5f0ecf455e7e97e}, we see that its contribution 
997 to \dotdebugloclistsdwo{} begins at offset 84, so the location list from
998 Figure \refersec{fig:splitobjectexampledemotwodwodwarfdebuglocdwoexcerpts} 
999 can be found in \texttt{demo.dwp} at offset 157 (84 + 73) in
1000 the combined \dotdebugloclistsdwo{} section.
1001
1002 \begin{figure}[ht]
1003 \begin{center}
1004 \begin{tabular}{lrrrrrr}
1005 \\
1006   \multicolumn{7}{c}{Section header} \\
1007 \hline \\
1008   \multicolumn{2}{l}{Version:}&                 5 &&&&\\
1009   \multicolumn{2}{l}{Number of columns:}&       5 &&&&\\
1010   \multicolumn{2}{l}{Number of used entries:}&  2 &&&&\\
1011   \multicolumn{2}{l}{Number of slots:}&         16 &&&&\\
1012 \\
1013   \multicolumn{7}{c}{Offset table} \\
1014   \hline
1015   slot&  signature&             info&   abbrev&      loc&     line& str\_off \\
1016     14& \texttt{0xb5f0ecf455e7e97e}&      325&      452&       84&       52&       72 \\
1017     15& \texttt{0x044e413b8a2d1b8f}&        0&        0&        0&        0&        0 \\
1018 \\
1019   \multicolumn{7}{c}{Size table} \\
1020   \hline
1021   slot&                    &     info&   abbrev&      loc&     line& str\_off \\
1022     14&                    &      673&      593&       93&       52&      120 \\
1023     15&                    &      325&      452&       84&       52&       72 \\
1024 \\ \hline 
1025 \end{tabular}
1026 \end{center}
1027 \caption{Example CU index section}
1028 \label{fig:examplecuindexsection}
1029 \end{figure}
1030
1031 \needlines{4}
1032 Figure \referfol{fig:exampletuindexsection} 
1033 shows an example TU index section containing the
1034 three type units for classes \texttt{Box}, \texttt{Point}, and 
1035 \texttt{Line}. Each type unit
1036 contains contributions from \dotdebuginfodwo{}, \dotdebugabbrevdwo{},
1037 \dotdebuglinedwo{} and \dotdebugstroffsetsdwo{}. In this example, the
1038 type units for classes \texttt{Box} and \texttt{Point} come from 
1039 \texttt{demo1.dwo}, and
1040 share the abbreviations table, line number table, and string
1041 offsets table with the compilation unit from \texttt{demo1.dwo}. 
1042 Likewise, the type unit for class \texttt{Line} shares tables 
1043 from \texttt{demo2.dwo}. 
1044
1045 The sharing of these tables between compilation units and type units
1046 is typical for some implementations, but is not required by the
1047 DWARF standard.
1048
1049 \begin{figure}[ht]
1050 \begin{center}
1051 \begin{tabular}{lrrrrr}
1052 \\
1053   \multicolumn{6}{c}{Section header} \\
1054 \hline
1055   \multicolumn{2}{l}{Version:}&                 5 \\
1056   \multicolumn{2}{l}{Number of columns:}&       4 \\
1057   \multicolumn{2}{l}{Number of used entries:}&  3 \\
1058   \multicolumn{2}{l}{Number of slots:}&         32 \\
1059 \\
1060   \multicolumn{6}{c}{Offset table} \\
1061   \hline
1062   slot&  signature&                    info&   abbrev&     line& str\_off \\
1063   11& \texttt{0x2f33248f03ff18ab}&     1321&        0&        0&        0 \\
1064   17& \texttt{0x79c7ef0eae7375d1}&     1488&      452&       52&       72 \\
1065   27& \texttt{0xe97a3917c5a6529b}&      998&        0&        0&        0 \\
1066 \\
1067   \multicolumn{6}{c}{Size table} \\
1068   \hline
1069   slot&                          &     info&   abbrev&     line& str\_off \\
1070   11&                            &      167&      452&       52&       72 \\
1071   17&                            &      217&      593&       52&      120 \\
1072   27&                            &      323&      452&       52&       72 \\
1073 \\
1074 \hline
1075 \end{tabular}
1076 \end{center}
1077 \caption{Example TU index section}
1078 \label{fig:exampletuindexsection}
1079 \end{figure}
1080