toolchain/share/doc/gdb/Separate-Debug-Files.html

300 lines
17 KiB
HTML
Raw Permalink Normal View History

2024-01-10 05:24:32 +00:00
<html lang="en">
<head>
<title>Separate Debug Files - Debugging with GDB</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name="description" content="Debugging with GDB">
<meta name="generator" content="makeinfo 4.13">
<link title="Top" rel="start" href="index.html#Top">
<link rel="up" href="GDB-Files.html#GDB-Files" title="GDB Files">
<link rel="prev" href="File-Caching.html#File-Caching" title="File Caching">
<link rel="next" href="MiniDebugInfo.html#MiniDebugInfo" title="MiniDebugInfo">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
Copyright (C) 1988-2019 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being ``Free Software'' and ``Free Software Needs
Free Documentation'', with the Front-Cover Texts being ``A GNU Manual,''
and with the Back-Cover Texts as in (a) below.
(a) The FSF's Back-Cover Text is: ``You are free to copy and modify
this GNU Manual. Buying copies from GNU Press supports the FSF in
developing GNU and promoting software freedom.''
-->
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
pre.display { font-family:inherit }
pre.format { font-family:inherit }
pre.smalldisplay { font-family:inherit; font-size:smaller }
pre.smallformat { font-family:inherit; font-size:smaller }
pre.smallexample { font-size:smaller }
pre.smalllisp { font-size:smaller }
span.sc { font-variant:small-caps }
span.roman { font-family:serif; font-weight:normal; }
span.sansserif { font-family:sans-serif; font-weight:normal; }
--></style>
</head>
<body>
<div class="node">
<a name="Separate-Debug-Files"></a>
<p>
Next:&nbsp;<a rel="next" accesskey="n" href="MiniDebugInfo.html#MiniDebugInfo">MiniDebugInfo</a>,
Previous:&nbsp;<a rel="previous" accesskey="p" href="File-Caching.html#File-Caching">File Caching</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="GDB-Files.html#GDB-Files">GDB Files</a>
<hr>
</div>
<h3 class="section">18.3 Debugging Information in Separate Files</h3>
<p><a name="index-separate-debugging-information-files-1275"></a><a name="index-debugging-information-in-separate-files-1276"></a><a name="index-g_t_0040file_007b_002edebug_007d-subdirectories-1277"></a><a name="index-debugging-information-directory_002c-global-1278"></a><a name="index-global-debugging-information-directories-1279"></a><a name="index-build-ID_002c-and-separate-debugging-files-1280"></a><a name="index-g_t_0040file_007b_002ebuild_002did_007d-directory-1281"></a>
<span class="sc">gdb</span> allows you to put a program's debugging information in a
file separate from the executable itself, in a way that allows
<span class="sc">gdb</span> to find and load the debugging information automatically.
Since debugging information can be very large&mdash;sometimes larger
than the executable code itself&mdash;some systems distribute debugging
information for their executables in separate files, which users can
install only when they need to debug a problem.
<p><span class="sc">gdb</span> supports two ways of specifying the separate debug info
file:
<ul>
<li>The executable contains a <dfn>debug link</dfn> that specifies the name of
the separate debug info file. The separate debug file's name is
usually <samp><var>executable</var><span class="file">.debug</span></samp>, where <var>executable</var> is the
name of the corresponding executable file without leading directories
(e.g., <samp><span class="file">ls.debug</span></samp> for <samp><span class="file">/usr/bin/ls</span></samp>). In addition, the
debug link specifies a 32-bit <dfn>Cyclic Redundancy Check</dfn> (CRC)
checksum for the debug file, which <span class="sc">gdb</span> uses to validate that
the executable and the debug file came from the same build.
<li>The executable contains a <dfn>build ID</dfn>, a unique bit string that is
also present in the corresponding debug info file. (This is supported
only on some operating systems, when using the ELF or PE file formats
for binary files and the <span class="sc">gnu</span> Binutils.) For more details about
this feature, see the description of the <samp><span class="option">--build-id</span></samp>
command-line option in <a href="../ld/Options.html#Options">Command Line Options</a>. The debug info file's name is not specified
explicitly by the build ID, but can be computed from the build ID, see
below.
</ul>
<p>Depending on the way the debug info file is specified, <span class="sc">gdb</span>
uses two different methods of looking for the debug file:
<ul>
<li>For the &ldquo;debug link&rdquo; method, <span class="sc">gdb</span> looks up the named file in
the directory of the executable file, then in a subdirectory of that
directory named <samp><span class="file">.debug</span></samp>, and finally under each one of the
global debug directories, in a subdirectory whose name is identical to
the leading directories of the executable's absolute file name. (On
MS-Windows/MS-DOS, the drive letter of the executable's leading
directories is converted to a one-letter subdirectory, i.e.
<samp><span class="file">d:/usr/bin/</span></samp> is converted to <samp><span class="file">/d/usr/bin/</span></samp>, because Windows
filesystems disallow colons in file names.)
<li>For the &ldquo;build ID&rdquo; method, <span class="sc">gdb</span> looks in the
<samp><span class="file">.build-id</span></samp> subdirectory of each one of the global debug directories for
a file named <samp><var>nn</var><span class="file">/</span><var>nnnnnnnn</var><span class="file">.debug</span></samp>, where <var>nn</var> are the
first 2 hex characters of the build ID bit string, and <var>nnnnnnnn</var>
are the rest of the bit string. (Real build ID strings are 32 or more
hex characters, not 10.)
</ul>
<p>So, for example, suppose you ask <span class="sc">gdb</span> to debug
<samp><span class="file">/usr/bin/ls</span></samp>, which has a debug link that specifies the
file <samp><span class="file">ls.debug</span></samp>, and a build ID whose value in hex is
<code>abcdef1234</code>. If the list of the global debug directories includes
<samp><span class="file">/usr/lib/debug</span></samp>, then <span class="sc">gdb</span> will look for the following
debug information files, in the indicated order:
<ul>
<li><samp><span class="file">/usr/lib/debug/.build-id/ab/cdef1234.debug</span></samp>
<li><samp><span class="file">/usr/bin/ls.debug</span></samp>
<li><samp><span class="file">/usr/bin/.debug/ls.debug</span></samp>
<li><samp><span class="file">/usr/lib/debug/usr/bin/ls.debug</span></samp>.
</ul>
<p><a name="debug_002dfile_002ddirectory"></a>Global debugging info directories default to what is set by <span class="sc">gdb</span>
configure option <samp><span class="option">--with-separate-debug-dir</span></samp>. During <span class="sc">gdb</span> run
you can also set the global debugging info directories, and view the list
<span class="sc">gdb</span> is currently using.
<a name="index-set-debug_002dfile_002ddirectory-1282"></a>
<dl><dt><code>set debug-file-directory </code><var>directories</var><dd>Set the directories which <span class="sc">gdb</span> searches for separate debugging
information files to <var>directory</var>. Multiple path components can be set
concatenating them by a path separator.
<p><a name="index-show-debug_002dfile_002ddirectory-1283"></a><br><dt><code>show debug-file-directory</code><dd>Show the directories <span class="sc">gdb</span> searches for separate debugging
information files.
</dl>
<p><a name="index-g_t_0040code_007b_002egnu_005fdebuglink_007d-sections-1284"></a><a name="index-debug-link-sections-1285"></a>A debug link is a special section of the executable file named
<code>.gnu_debuglink</code>. The section must contain:
<ul>
<li>A filename, with any leading directory components removed, followed by
a zero byte,
<li>zero to three bytes of padding, as needed to reach the next four-byte
boundary within the section, and
<li>a four-byte CRC checksum, stored in the same endianness used for the
executable file itself. The checksum is computed on the debugging
information file's full contents by the function given below, passing
zero as the <var>crc</var> argument.
</ul>
<p>Any executable file format can carry a debug link, as long as it can
contain a section named <code>.gnu_debuglink</code> with the contents
described above.
<p><a name="index-g_t_0040code_007b_002enote_002egnu_002ebuild_002did_007d-sections-1286"></a><a name="index-build-ID-sections-1287"></a>The build ID is a special section in the executable file (and in other
ELF binary files that <span class="sc">gdb</span> may consider). This section is
often named <code>.note.gnu.build-id</code>, but that name is not mandatory.
It contains unique identification for the built files&mdash;the ID remains
the same across multiple builds of the same build tree. The default
algorithm SHA1 produces 160 bits (40 hexadecimal characters) of the
content for the build ID string. The same section with an identical
value is present in the original built binary with symbols, in its
stripped variant, and in the separate debugging information file.
<p>The debugging information file itself should be an ordinary
executable, containing a full set of linker symbols, sections, and
debugging information. The sections of the debugging information file
should have the same names, addresses, and sizes as the original file,
but they need not contain any data&mdash;much like a <code>.bss</code> section
in an ordinary executable.
<p>The <span class="sc">gnu</span> binary utilities (Binutils) package includes the
&lsquo;<samp><span class="samp">objcopy</span></samp>&rsquo; utility that can produce
the separated executable / debugging information file pairs using the
following commands:
<pre class="smallexample"> <kbd>objcopy --only-keep-debug foo foo.debug</kbd>
<kbd>strip -g foo</kbd>
</pre>
<p class="noindent">These commands remove the debugging
information from the executable file <samp><span class="file">foo</span></samp> and place it in the file
<samp><span class="file">foo.debug</span></samp>. You can use the first, second or both methods to link the
two files:
<ul>
<li>The debug link method needs the following additional command to also leave
behind a debug link in <samp><span class="file">foo</span></samp>:
<pre class="smallexample"> <kbd>objcopy --add-gnu-debuglink=foo.debug foo</kbd>
</pre>
<p>Ulrich Drepper's <samp><span class="file">elfutils</span></samp> package, starting with version 0.53, contains
a version of the <code>strip</code> command such that the command <kbd>strip foo -f
foo.debug</kbd> has the same functionality as the two <code>objcopy</code> commands and
the <code>ln -s</code> command above, together.
<li>Build ID gets embedded into the main executable using <code>ld --build-id</code> or
the <span class="sc">gcc</span> counterpart <code>gcc -Wl,--build-id</code>. Build ID support plus
compatibility fixes for debug files separation are present in <span class="sc">gnu</span> binary
utilities (Binutils) package since version 2.18.
</ul>
<p class="noindent"><a name="index-CRC-algorithm-definition-1288"></a>The CRC used in <code>.gnu_debuglink</code> is the CRC-32 defined in
IEEE 802.3 using the polynomial:
<!-- TexInfo requires naked braces for multi-digit exponents for Tex -->
<!-- output, but this causes HTML output to barf. HTML has to be set using -->
<!-- raw commands. So we end up having to specify this equation in 2 -->
<!-- different ways! -->
<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>
+ <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>
<p>The function is computed byte at a time, taking the least
significant bit of each byte first. The initial pattern
<code>0xffffffff</code> is used, to ensure leading zeros affect the CRC and
the final result is inverted to ensure trailing zeros also affect the
CRC.
<p><em>Note:</em> This is the same CRC polynomial as used in handling the
<dfn>Remote Serial Protocol</dfn> <code>qCRC</code> packet (see <a href="qCRC-packet.html#qCRC-packet">qCRC packet</a>).
However in the case of the Remote Serial Protocol, the CRC is computed
<em>most</em> significant bit first, and the result is not inverted, so
trailing zeros have no effect on the CRC value.
<p>To complete the description, we show below the code of the function
which produces the CRC used in <code>.gnu_debuglink</code>. Inverting the
initially supplied <code>crc</code> argument means that an initial call to
this function passing in zero will start computing the CRC using
<code>0xffffffff</code>.
<p><a name="index-gnu_005fdebuglink_005fcrc32-1289"></a>
<pre class="smallexample"> unsigned long
gnu_debuglink_crc32 (unsigned long crc,
unsigned char *buf, size_t len)
{
static const unsigned long crc32_table[256] =
{
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
0x2d02ef8d
};
unsigned char *end;
crc = ~crc &amp; 0xffffffff;
for (end = buf + len; buf &lt; end; ++buf)
crc = crc32_table[(crc ^ *buf) &amp; 0xff] ^ (crc &gt;&gt; 8);
return ~crc &amp; 0xffffffff;
}
</pre>
<p class="noindent">This computation does not apply to the &ldquo;build ID&rdquo; method.
</body></html>