1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
2<html>
3<!-- Copyright (C) 1988-2021 Free Software Foundation, Inc.
4
5Permission is granted to copy, distribute and/or modify this document
6under the terms of the GNU Free Documentation License, Version 1.3 or
7any later version published by the Free Software Foundation; with the
8Invariant Sections being "Free Software" and "Free Software Needs
9Free Documentation", with the Front-Cover Texts being "A GNU Manual,"
10and with the Back-Cover Texts as in (a) below.
11
12(a) The FSF's Back-Cover Text is: "You are free to copy and modify
13this GNU Manual.  Buying copies from GNU Press supports the FSF in
14developing GNU and promoting software freedom." -->
15<!-- Created by GNU Texinfo 5.1, http://www.gnu.org/software/texinfo/ -->
16<head>
17<title>Debugging with GDB: Separate Debug Files</title>
18
19<meta name="description" content="Debugging with GDB: Separate Debug Files">
20<meta name="keywords" content="Debugging with GDB: Separate Debug Files">
21<meta name="resource-type" content="document">
22<meta name="distribution" content="global">
23<meta name="Generator" content="makeinfo">
24<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
25<link href="index.html#Top" rel="start" title="Top">
26<link href="Concept-Index.html#Concept-Index" rel="index" title="Concept Index">
27<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
28<link href="GDB-Files.html#GDB-Files" rel="up" title="GDB Files">
29<link href="MiniDebugInfo.html#MiniDebugInfo" rel="next" title="MiniDebugInfo">
30<link href="File-Caching.html#File-Caching" rel="previous" title="File Caching">
31<style type="text/css">
32<!--
33a.summary-letter {text-decoration: none}
34blockquote.smallquotation {font-size: smaller}
35div.display {margin-left: 3.2em}
36div.example {margin-left: 3.2em}
37div.indentedblock {margin-left: 3.2em}
38div.lisp {margin-left: 3.2em}
39div.smalldisplay {margin-left: 3.2em}
40div.smallexample {margin-left: 3.2em}
41div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
42div.smalllisp {margin-left: 3.2em}
43kbd {font-style:oblique}
44pre.display {font-family: inherit}
45pre.format {font-family: inherit}
46pre.menu-comment {font-family: serif}
47pre.menu-preformatted {font-family: serif}
48pre.smalldisplay {font-family: inherit; font-size: smaller}
49pre.smallexample {font-size: smaller}
50pre.smallformat {font-family: inherit; font-size: smaller}
51pre.smalllisp {font-size: smaller}
52span.nocodebreak {white-space:nowrap}
53span.nolinebreak {white-space:nowrap}
54span.roman {font-family:serif; font-weight:normal}
55span.sansserif {font-family:sans-serif; font-weight:normal}
56ul.no-bullet {list-style: none}
57-->
58</style>
59
60
61</head>
62
63<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
64<a name="Separate-Debug-Files"></a>
65<div class="header">
66<p>
67Next: <a href="MiniDebugInfo.html#MiniDebugInfo" accesskey="n" rel="next">MiniDebugInfo</a>, Previous: <a href="File-Caching.html#File-Caching" accesskey="p" rel="previous">File Caching</a>, Up: <a href="GDB-Files.html#GDB-Files" accesskey="u" rel="up">GDB Files</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
68</div>
69<hr>
70<a name="Debugging-Information-in-Separate-Files"></a>
71<h3 class="section">18.3 Debugging Information in Separate Files</h3>
72<a name="index-separate-debugging-information-files"></a>
73<a name="index-debugging-information-in-separate-files"></a>
74<a name="index-_002edebug-subdirectories"></a>
75<a name="index-debugging-information-directory_002c-global"></a>
76<a name="index-global-debugging-information-directories"></a>
77<a name="index-build-ID_002c-and-separate-debugging-files"></a>
78<a name="index-_002ebuild_002did-directory"></a>
79
80<p><small>GDB</small> allows you to put a program&rsquo;s debugging information in a
81file separate from the executable itself, in a way that allows
82<small>GDB</small> to find and load the debugging information automatically.
83Since debugging information can be very large&mdash;sometimes larger
84than the executable code itself&mdash;some systems distribute debugging
85information for their executables in separate files, which users can
86install only when they need to debug a problem.
87</p>
88<p><small>GDB</small> supports two ways of specifying the separate debug info
89file:
90</p>
91<ul>
92<li> The executable contains a <em>debug link</em> that specifies the name of
93the separate debug info file.  The separate debug file&rsquo;s name is
94usually <samp><var>executable</var>.debug</samp>, where <var>executable</var> is the
95name of the corresponding executable file without leading directories
96(e.g., <samp>ls.debug</samp> for <samp>/usr/bin/ls</samp>).  In addition, the
97debug link specifies a 32-bit <em>Cyclic Redundancy Check</em> (CRC)
98checksum for the debug file, which <small>GDB</small> uses to validate that
99the executable and the debug file came from the same build.
100
101</li><li> <a name="build-ID"></a>The executable contains a <em>build ID</em>, a unique bit string that is
102also present in the corresponding debug info file.  (This is supported
103only on some operating systems, when using the ELF or PE file formats
104for binary files and the <small>GNU</small> Binutils.)  For more details about
105this feature, see the description of the <samp>--build-id</samp>
106command-line option in <a href="http://sourceware.org/binutils/docs/ld/Options.html#Options">Command Line Options</a> in <cite>The GNU Linker</cite>.  The debug info file&rsquo;s name is not specified
107explicitly by the build ID, but can be computed from the build ID, see
108below.
109</li></ul>
110
111<p>Depending on the way the debug info file is specified, <small>GDB</small>
112uses two different methods of looking for the debug file:
113</p>
114<ul>
115<li> For the &ldquo;debug link&rdquo; method, <small>GDB</small> looks up the named file in
116the directory of the executable file, then in a subdirectory of that
117directory named <samp>.debug</samp>, and finally under each one of the
118global debug directories, in a subdirectory whose name is identical to
119the leading directories of the executable&rsquo;s absolute file name.  (On
120MS-Windows/MS-DOS, the drive letter of the executable&rsquo;s leading
121directories is converted to a one-letter subdirectory, i.e.
122<samp>d:/usr/bin/</samp> is converted to <samp>/d/usr/bin/</samp>, because Windows
123filesystems disallow colons in file names.)
124
125</li><li> For the &ldquo;build ID&rdquo; method, <small>GDB</small> looks in the
126<samp>.build-id</samp> subdirectory of each one of the global debug directories for
127a file named <samp><var>nn</var>/<var>nnnnnnnn</var>.debug</samp>, where <var>nn</var> are the
128first 2 hex characters of the build ID bit string, and <var>nnnnnnnn</var>
129are the rest of the bit string.  (Real build ID strings are 32 or more
130hex characters, not 10.)
131</li></ul>
132
133<p>So, for example, suppose you ask <small>GDB</small> to debug
134<samp>/usr/bin/ls</samp>, which has a debug link that specifies the
135file <samp>ls.debug</samp>, and a build ID whose value in hex is
136<code>abcdef1234</code>.  If the list of the global debug directories includes
137<samp>/usr/lib/debug</samp>, then <small>GDB</small> will look for the following
138debug information files, in the indicated order:
139</p>
140<ul class="no-bullet">
141<li>- <samp>/usr/lib/debug/.build-id/ab/cdef1234.debug</samp>
142</li><li>- <samp>/usr/bin/ls.debug</samp>
143</li><li>- <samp>/usr/bin/.debug/ls.debug</samp>
144</li><li>- <samp>/usr/lib/debug/usr/bin/ls.debug</samp>.
145</li></ul>
146
147<a name="debug_002dfile_002ddirectory"></a><p>Global debugging info directories default to what is set by <small>GDB</small>
148configure option <samp>--with-separate-debug-dir</samp>.  During <small>GDB</small> run
149you can also set the global debugging info directories, and view the list
150<small>GDB</small> is currently using.
151</p>
152<dl compact="compact">
153<dd>
154<a name="index-set-debug_002dfile_002ddirectory"></a>
155</dd>
156<dt><code>set debug-file-directory <var>directories</var></code></dt>
157<dd><p>Set the directories which <small>GDB</small> searches for separate debugging
158information files to <var>directory</var>.  Multiple path components can be set
159concatenating them by a path separator.
160</p>
161<a name="index-show-debug_002dfile_002ddirectory"></a>
162</dd>
163<dt><code>show debug-file-directory</code></dt>
164<dd><p>Show the directories <small>GDB</small> searches for separate debugging
165information files.
166</p>
167</dd>
168</dl>
169
170<a name="index-_002egnu_005fdebuglink-sections"></a>
171<a name="index-debug-link-sections"></a>
172<p>A debug link is a special section of the executable file named
173<code>.gnu_debuglink</code>.  The section must contain:
174</p>
175<ul>
176<li> A filename, with any leading directory components removed, followed by
177a zero byte,
178</li><li> zero to three bytes of padding, as needed to reach the next four-byte
179boundary within the section, and
180</li><li> a four-byte CRC checksum, stored in the same endianness used for the
181executable file itself.  The checksum is computed on the debugging
182information file&rsquo;s full contents by the function given below, passing
183zero as the <var>crc</var> argument.
184</li></ul>
185
186<p>Any executable file format can carry a debug link, as long as it can
187contain a section named <code>.gnu_debuglink</code> with the contents
188described above.
189</p>
190<a name="index-_002enote_002egnu_002ebuild_002did-sections"></a>
191<a name="index-build-ID-sections"></a>
192<p>The build ID is a special section in the executable file (and in other
193ELF binary files that <small>GDB</small> may consider).  This section is
194often named <code>.note.gnu.build-id</code>, but that name is not mandatory.
195It contains unique identification for the built files&mdash;the ID remains
196the same across multiple builds of the same build tree.  The default
197algorithm SHA1 produces 160 bits (40 hexadecimal characters) of the
198content for the build ID string.  The same section with an identical
199value is present in the original built binary with symbols, in its
200stripped variant, and in the separate debugging information file.
201</p>
202<p>The debugging information file itself should be an ordinary
203executable, containing a full set of linker symbols, sections, and
204debugging information.  The sections of the debugging information file
205should have the same names, addresses, and sizes as the original file,
206but they need not contain any data&mdash;much like a <code>.bss</code> section
207in an ordinary executable.
208</p>
209<p>The <small>GNU</small> binary utilities (Binutils) package includes the
210&lsquo;<samp>objcopy</samp>&rsquo; utility that can produce
211the separated executable / debugging information file pairs using the
212following commands:
213</p>
214<div class="smallexample">
215<pre class="smallexample"><kbd>objcopy --only-keep-debug foo foo.debug</kbd>
216<kbd>strip -g foo</kbd>
217</pre></div>
218
219<p>These commands remove the debugging
220information from the executable file <samp>foo</samp> and place it in the file
221<samp>foo.debug</samp>.  You can use the first, second or both methods to link the
222two files:
223</p>
224<ul>
225<li> The debug link method needs the following additional command to also leave
226behind a debug link in <samp>foo</samp>:
227
228<div class="smallexample">
229<pre class="smallexample"><kbd>objcopy --add-gnu-debuglink=foo.debug foo</kbd>
230</pre></div>
231
232<p>Ulrich Drepper&rsquo;s <samp>elfutils</samp> package, starting with version 0.53, contains
233a version of the <code>strip</code> command such that the command <kbd>strip foo -f
234foo.debug</kbd> has the same functionality as the two <code>objcopy</code> commands and
235the <code>ln -s</code> command above, together.
236</p>
237</li><li> Build ID gets embedded into the main executable using <code>ld --build-id</code> or
238the <small>GCC</small> counterpart <code>gcc -Wl,--build-id</code>.  Build ID support plus
239compatibility fixes for debug files separation are present in <small>GNU</small> binary
240utilities (Binutils) package since version 2.18.
241</li></ul>
242
243
244<a name="index-CRC-algorithm-definition"></a>
245<p>The CRC used in <code>.gnu_debuglink</code> is the CRC-32 defined in
246IEEE 802.3 using the polynomial:
247</p>
248<div class="display">
249<pre class="display"> <em>x</em><sup>32</sup> + <em>x</em><sup>26</sup> + <em>x</em><sup>23</sup> + <em>x</em><sup>22</sup> + <em>x</em><sup>16</sup> + <em>x</em><sup>12</sup> + <em>x</em><sup>11</sup>
250 + <em>x</em><sup>10</sup> + <em>x</em><sup>8</sup> + <em>x</em><sup>7</sup> + <em>x</em><sup>5</sup> + <em>x</em><sup>4</sup> + <em>x</em><sup>2</sup> + <em>x</em> + 1</pre></div>
251
252<p>The function is computed byte at a time, taking the least
253significant bit of each byte first.  The initial pattern
254<code>0xffffffff</code> is used, to ensure leading zeros affect the CRC and
255the final result is inverted to ensure trailing zeros also affect the
256CRC.
257</p>
258<p><em>Note:</em> This is the same CRC polynomial as used in handling the
259<em>Remote Serial Protocol</em> <code>qCRC</code> packet (see <a href="General-Query-Packets.html#qCRC-packet">qCRC packet</a>).
260However in the case of the Remote Serial Protocol, the CRC is computed
261<em>most</em> significant bit first, and the result is not inverted, so
262trailing zeros have no effect on the CRC value.
263</p>
264<p>To complete the description, we show below the code of the function
265which produces the CRC used in <code>.gnu_debuglink</code>.  Inverting the
266initially supplied <code>crc</code> argument means that an initial call to
267this function passing in zero will start computing the CRC using
268<code>0xffffffff</code>.
269</p>
270<a name="index-gnu_005fdebuglink_005fcrc32"></a>
271<div class="smallexample">
272<pre class="smallexample">unsigned long
273gnu_debuglink_crc32 (unsigned long crc,
274                     unsigned char *buf, size_t len)
275{
276  static const unsigned long crc32_table[256] =
277    {
278      0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
279      0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
280      0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
281      0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
282      0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
283      0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
284      0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
285      0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
286      0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
287      0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
288      0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
289      0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
290      0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
291      0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
292      0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
293      0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
294      0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
295      0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
296      0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
297      0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
298      0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
299      0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
300      0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
301      0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
302      0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
303      0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
304      0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
305      0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
306      0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
307      0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
308      0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
309      0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
310      0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
311      0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
312      0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
313      0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
314      0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
315      0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
316      0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
317      0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
318      0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
319      0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
320      0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
321      0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
322      0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
323      0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
324      0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
325      0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
326      0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
327      0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
328      0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
329      0x2d02ef8d
330    };
331  unsigned char *end;
332
333  crc = ~crc &amp; 0xffffffff;
334  for (end = buf + len; buf &lt; end; ++buf)
335    crc = crc32_table[(crc ^ *buf) &amp; 0xff] ^ (crc &gt;&gt; 8);
336  return ~crc &amp; 0xffffffff;
337}
338</pre></div>
339
340<p>This computation does not apply to the &ldquo;build ID&rdquo; method.
341</p>
342<hr>
343<div class="header">
344<p>
345Next: <a href="MiniDebugInfo.html#MiniDebugInfo" accesskey="n" rel="next">MiniDebugInfo</a>, Previous: <a href="File-Caching.html#File-Caching" accesskey="p" rel="previous">File Caching</a>, Up: <a href="GDB-Files.html#GDB-Files" accesskey="u" rel="up">GDB Files</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
346</div>
347
348
349
350</body>
351</html>
352