aboutsummaryrefslogblamecommitdiffhomepage
path: root/index.html
blob: 425ada71f7ec9d38d503c81473b92ac8b7c15afe (plain) (tree)
1
2
3
4
5
6




                                                  
                                    












































































                                                                                                                                                                              
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                

































































                                                                                                                                                                                                                           








                                                                                                                    
             





































                                                                                                                                    
             

















































                                                                                                                  








                                                                          



                                                                                                                                                                    









                                                                       



                                                                                                                                          


































                                                                                         
<!DOCTYPE HTML>
<html lang="en" class="sidebar-visible no-js ayu">
    <head>
        <!-- Book generated using mdBook -->
        <meta charset="UTF-8">
        <title>ld.so - Notes</title>
        

        <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <meta name="theme-color" content="#ffffff" />

        <link rel="shortcut icon" href="favicon.png">
        <link rel="stylesheet" href="css/variables.css">
        <link rel="stylesheet" href="css/general.css">
        <link rel="stylesheet" href="css/chrome.css">
        <link rel="stylesheet" href="css/print.css" media="print">

        <!-- Fonts -->
        <link rel="stylesheet" href="FontAwesome/css/font-awesome.css">
        <link href="https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800" rel="stylesheet" type="text/css">
        <link href="https://fonts.googleapis.com/css?family=Source+Code+Pro:500" rel="stylesheet" type="text/css">

        <!-- Highlight.js Stylesheets -->
        <link rel="stylesheet" href="highlight.css">
        <link rel="stylesheet" href="tomorrow-night.css">
        <link rel="stylesheet" href="ayu-highlight.css">

        <!-- Custom theme stylesheets -->
        

        
    </head>
    <body>
        <!-- Provide site root to javascript -->
        <script type="text/javascript">
            var path_to_root = "";
            var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "ayu" : "ayu";
        </script>

        <!-- Work around some values being stored in localStorage wrapped in quotes -->
        <script type="text/javascript">
            try {
                var theme = localStorage.getItem('mdbook-theme');
                var sidebar = localStorage.getItem('mdbook-sidebar');

                if (theme.startsWith('"') && theme.endsWith('"')) {
                    localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
                }

                if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
                    localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
                }
            } catch (e) { }
        </script>

        <!-- Set the theme before any content is loaded, prevents flash -->
        <script type="text/javascript">
            var theme;
            try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
            if (theme === null || theme === undefined) { theme = default_theme; }
            var html = document.querySelector('html');
            html.classList.remove('no-js')
            html.classList.remove('ayu')
            html.classList.add(theme);
            html.classList.add('js');
        </script>

        <!-- Hide / unhide sidebar before it is displayed -->
        <script type="text/javascript">
            var html = document.querySelector('html');
            var sidebar = 'hidden';
            if (document.body.clientWidth >= 1080) {
                try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
                sidebar = sidebar || 'visible';
            }
            html.classList.remove('sidebar-visible');
            html.classList.add("sidebar-" + sidebar);
        </script>

        <nav id="sidebar" class="sidebar" aria-label="Table of contents">
            <div id="sidebar-scrollbox" class="sidebar-scrollbox">
                <ol class="chapter"><li class="expanded "><a href="ld.so.html"><strong aria-hidden="true">1.</strong> ld.so</a></li><li class="expanded "><a href="git.html"><strong aria-hidden="true">2.</strong> git</a></li><li class="expanded "><a href="gdb.html"><strong aria-hidden="true">3.</strong> gdb</a></li><li class="expanded "><a href="radare2.html"><strong aria-hidden="true">4.</strong> radare2</a></li><li class="expanded "><a href="emacs.html"><strong aria-hidden="true">5.</strong> emacs</a></li><li class="expanded "><a href="fish.html"><strong aria-hidden="true">6.</strong> fish</a></li><li class="expanded "><a href="strace.html"><strong aria-hidden="true">7.</strong> strace</a></li><li class="expanded "><a href="lsof.html"><strong aria-hidden="true">8.</strong> lsof</a></li><li class="expanded "><a href="pidstat.html"><strong aria-hidden="true">9.</strong> pidstat</a></li><li class="expanded "><a href="time.html"><strong aria-hidden="true">10.</strong> time</a></li><li class="expanded "><a href="pmap.html"><strong aria-hidden="true">11.</strong> pmap</a></li><li class="expanded "><a href="pstack.html"><strong aria-hidden="true">12.</strong> pstack</a></li><li class="expanded "><a href="perf.html"><strong aria-hidden="true">13.</strong> perf</a></li><li class="expanded "><a href="oprofile.html"><strong aria-hidden="true">14.</strong> OProfile</a></li><li class="expanded "><a href="od.html"><strong aria-hidden="true">15.</strong> od</a></li><li class="expanded "><a href="xxd.html"><strong aria-hidden="true">16.</strong> xxd</a></li><li class="expanded "><a href="readelf.html"><strong aria-hidden="true">17.</strong> readelf</a></li><li class="expanded "><a href="objdump.html"><strong aria-hidden="true">18.</strong> objdump</a></li><li class="expanded "><a href="nm.html"><strong aria-hidden="true">19.</strong> nm</a></li><li class="expanded "><a href="c++filt.html"><strong aria-hidden="true">20.</strong> c++filt</a></li></ol>
            </div>
            <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div>
        </nav>

        <div id="page-wrapper" class="page-wrapper">

            <div class="page">
                
                <div id="menu-bar" class="menu-bar">
                    <div id="menu-bar-sticky-container">
                        <div class="left-buttons">
                            <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
                                <i class="fa fa-bars"></i>
                            </button>
                            <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
                                <i class="fa fa-paint-brush"></i>
                            </button>
                            <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
                                <li role="none"><button role="menuitem" class="theme" id="light">Light</button></li>
                                <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
                                <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
                                <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
                                <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu (default)</button></li>
                            </ul>
                            
                            <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar">
                                <i class="fa fa-search"></i>
                            </button>
                            
                        </div>

                        <h1 class="menu-title">Notes</h1>

                        <div class="right-buttons">
                            <a href="print.html" title="Print this book" aria-label="Print this book">
                                <i id="print-button" class="fa fa-print"></i>
                            </a>
                            
                        </div>
                    </div>
                </div>

                
                <div id="search-wrapper" class="hidden">
                    <form id="searchbar-outer" class="searchbar-outer">
                        <input type="search" name="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
                    </form>
                    <div id="searchresults-outer" class="searchresults-outer hidden">
                        <div id="searchresults-header" class="searchresults-header"></div>
                        <ul id="searchresults">
                        </ul>
                    </div>
                </div>
                

                <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
                <script type="text/javascript">
                    document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
                    document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
                    Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
                        link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
                    });
                </script>

                <div id="content" class="content">
                    <main>
                        <h1><a class="header" href="#ldso8" id="ldso8">ld.so(8)</a></h1>
<h2><a class="header" href="#environment-variables" id="environment-variables">Environment variables</a></h2>
<pre><code class="language-console">  LD_PRELOAD=&lt;l_so&gt;       colon separated list of libso's to be pre loaded
  LD_DEBUG=&lt;opts&gt;         comman separated list of debug options
          =help           list available options
          =libs           show library search path
          =files          processing of input files
          =symbols        show search path for symbol lookup
          =bindings       show against which definition a symbol is bound
</code></pre>
<h2><a class="header" href="#ld_preload-load--init-order" id="ld_preload-load--init-order">LD_PRELOAD load &amp; init order</a></h2>
<pre><code class="language-markdown">  &gt; ldd ./main
    &gt;&gt; libc.so.6 =&gt; /usr/lib/libc.so.6

  &gt; LD_PRELOAD=liba.so:libb.so ./main
             --&gt;
      preloaded in this order
             &lt;--
      initialized in this order

  - preload order determines the order libs are inserted into the link map

  - resulting link map:
      +------+    +------+    +------+    +------+
      | main | -&gt; | liba | -&gt; | libb | -&gt; | libc |
      +------+    +------+    +------+    +------+

  - see preload and init order in action
    &gt; LD_DEBUG=files LD_PRELOAD=liba.so:libb.so ./main
      # load order (-&gt; determines link map)
      &gt;&gt; file=liba.so [0];  generating link map
      &gt;&gt; file=libb.so [0];  generating link map
      &gt;&gt; file=libc.so.6 [0];  generating link map

      # init order
      &gt;&gt; calling init: /usr/lib/libc.so.6
      &gt;&gt; calling init: &lt;path&gt;/libb.so
      &gt;&gt; calling init: &lt;path&gt;/liba.so
      &gt;&gt; initialize program: ./main

  - see the symbol lookup in action and therefore the link map order
    &gt; LD_DEBUG=symbols,bindings LD_PRELOAD=liba.so:libb.so ./main
      &gt;&gt; symbol=memcpy;  lookup in file=./main [0]
      &gt;&gt; symbol=memcpy;  lookup in file=&lt;path&gt;/liba.so [0]
      &gt;&gt; symbol=memcpy;  lookup in file=&lt;path&gt;/libb.so [0]
      &gt;&gt; symbol=memcpy;  lookup in file=/usr/lib/libc.so.6 [0]
      &gt;&gt; binding file ./main [0] to /usr/lib/libc.so.6 [0]: normal symbol
         `memcpy' [GLIBC_2.14]
</code></pre>
<h2><a class="header" href="#dynamic-linking-x86_64" id="dynamic-linking-x86_64">dynamic linking (x86_64)</a></h2>
<pre><code class="language-makrdown">  - dynamic linking basically works via one indirect jump. It uses a
    combination of function trampolines (.plt) and a function pointer table
    (.got.plt). On the first call the trampoline sets up some metadata and
    then jumps to the ld.so runtime resolve function, which in turn patches
    the table with the correct function pointer.
      .plt ....... contains function trampolines, usually located in code
                   segment (rx permission)
      .got.plt ... hold the function pointer table

  - following r2 dump shows this
      - [0x00401030] indirect jump for 'puts' using function pointer in
        _GLOBAL_OFFSET_TABLE_[3]
      - initially points to instruction behind 'puts' trampoline [0x00401036]
      - this pushes relocation index and then jumps to the first trampoline
        [0x00401020]
      - the first trampoline jumps to _GLOBAL_OFFSET_TABLE_[2] which will be
        filled at program startup by the ld.so with its resolve function
      - the resolve function fixes the relocation referenced by the
        relocation index pushed by the 'puts' trampoline
      - the relocation entry tells the resolve function which symbol to
        search for and where to put the function pointer
          &gt; readelf -r &lt;main&gt;
            &gt;&gt; Relocation section '.rela.plt' at offset 0x4b8 contains 1 entry:
            &gt;&gt;   Offset          Info           Type           Sym. Value    Sym. Name + Addend
            &gt;&gt; 000000404018  000200000007 R_X86_64_JUMP_SLO 0000000000000000 puts@GLIBC_2.2.5 + 0
          - offset points to _GLOBAL_OFFSET_TABLE_[3]

      [0x00401040]&gt; pd 4 @ section..got.plt
                  ;-- section..got.plt:
                  ;-- .got.plt:    ; [22] -rw- section size 32 named .got.plt
                  ;-- _GLOBAL_OFFSET_TABLE_:
                  0x00404000      .qword 0x0000000000403e10 ; section..dynamic ; obj._DYNAMIC
                  0x00404008      .qword 0x0000000000000000
                  ; CODE XREF from section..plt @ +0x6
                  0x00404010      .qword 0x0000000000000000
                  ;-- reloc.puts:
                  ; CODE XREF from sym.imp.puts @ 0x401030
                  0x00404018      .qword 0x0000000000401036                  ; RELOC 64 puts

      [0x00401040]&gt; pd 6 @ section..plt
                  ;-- section..plt:
                  ;-- .plt:       ; [12] -r-x section size 32 named .plt
              ┌─&gt; 0x00401020      ff35e22f0000   push qword [0x00404008]
              ╎   0x00401026      ff25e42f0000   jmp qword [0x00404010]
              ╎   0x0040102c      0f1f4000       nop dword [rax]
      ┌ 6: int sym.imp.puts (const char *s);
      └       ╎   0x00401030      ff25e22f0000   jmp qword [reloc.puts]
              ╎   0x00401036      6800000000     push 0
              └─&lt; 0x0040103b      e9e0ffffff     jmp sym..plt
</code></pre>

                    </main>

                    <nav class="nav-wrapper" aria-label="Page navigation">
                        <!-- Mobile navigation buttons -->
                        

                        
                            <a rel="next" href="git.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
                                <i class="fa fa-angle-right"></i>
                            </a>
                        

                        <div style="clear: both"></div>
                    </nav>
                </div>
            </div>

            <nav class="nav-wide-wrapper" aria-label="Page navigation">
                

                
                    <a href="git.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
                        <i class="fa fa-angle-right"></i>
                    </a>
                
            </nav>

        </div>

        

        

        
        
        
        <script type="text/javascript">
            window.playpen_copyable = true;
        </script>
        

        

        
        <script src="elasticlunr.min.js" type="text/javascript" charset="utf-8"></script>
        <script src="mark.min.js" type="text/javascript" charset="utf-8"></script>
        <script src="searcher.js" type="text/javascript" charset="utf-8"></script>
        

        <script src="clipboard.min.js" type="text/javascript" charset="utf-8"></script>
        <script src="highlight.js" type="text/javascript" charset="utf-8"></script>
        <script src="book.js" type="text/javascript" charset="utf-8"></script>

        <!-- Custom JS scripts -->
        

        

    </body>
</html>