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