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> [<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’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—sometimes larger 84than the executable code itself—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’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’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 “debug link” 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’s absolute file name. (On 120MS-Windows/MS-DOS, the drive letter of the executable’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 “build ID” 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’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—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—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‘<samp>objcopy</samp>’ 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’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 & 0xffffffff; 334 for (end = buf + len; buf < end; ++buf) 335 crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8); 336 return ~crc & 0xffffffff; 337} 338</pre></div> 339 340<p>This computation does not apply to the “build ID” 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> [<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