aboutsummaryrefslogtreecommitdiffhomepage
path: root/development
diff options
context:
space:
mode:
Diffstat (limited to 'development')
-rw-r--r--development/c++.html19
-rw-r--r--development/c++filt.html19
-rw-r--r--development/cmake.html19
-rw-r--r--development/gas.html83
-rw-r--r--development/gcc.html19
-rw-r--r--development/gcov.html19
-rw-r--r--development/git.html23
-rw-r--r--development/glibc.html19
-rw-r--r--development/index.html20
-rw-r--r--development/ld.html416
-rw-r--r--development/ld.so.html19
-rw-r--r--development/ld/Makefile15
-rw-r--r--development/ld/data.S23
-rw-r--r--development/ld/link-mem.ld45
-rw-r--r--development/ld/link-nomem.ld43
-rw-r--r--development/make.html19
-rw-r--r--development/pgo.html19
-rw-r--r--development/python.html19
-rw-r--r--development/symbolver.html19
19 files changed, 745 insertions, 132 deletions
diff --git a/development/c++.html b/development/c++.html
index 97758c8..d87df66 100644
--- a/development/c++.html
+++ b/development/c++.html
@@ -31,10 +31,11 @@
<!-- Custom theme stylesheets -->
- <!-- Provide site root to javascript -->
+ <!-- Provide site root and default themes to javascript -->
<script>
- var path_to_root = "../";
- var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light";
+ const path_to_root = "../";
+ const default_light_theme = "light";
+ const default_dark_theme = "navy";
</script>
<!-- Start loading toc.js asap -->
<script src="../toc.js"></script>
@@ -44,8 +45,8 @@
<!-- Work around some values being stored in localStorage wrapped in quotes -->
<script>
try {
- var theme = localStorage.getItem('mdbook-theme');
- var sidebar = localStorage.getItem('mdbook-sidebar');
+ let theme = localStorage.getItem('mdbook-theme');
+ let sidebar = localStorage.getItem('mdbook-sidebar');
if (theme.startsWith('"') && theme.endsWith('"')) {
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
@@ -59,7 +60,8 @@
<!-- Set the theme before any content is loaded, prevents flash -->
<script>
- var theme;
+ const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
+ let theme;
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
if (theme === null || theme === undefined) { theme = default_theme; }
const html = document.documentElement;
@@ -72,8 +74,8 @@
<!-- Hide / unhide sidebar before it is displayed -->
<script>
- var sidebar = null;
- var sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
+ let sidebar = null;
+ const sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
if (document.body.clientWidth >= 1080) {
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
sidebar = sidebar || 'visible';
@@ -109,6 +111,7 @@
<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="default_theme">Auto</button></li>
<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>
diff --git a/development/c++filt.html b/development/c++filt.html
index 4a69661..b35da72 100644
--- a/development/c++filt.html
+++ b/development/c++filt.html
@@ -31,10 +31,11 @@
<!-- Custom theme stylesheets -->
- <!-- Provide site root to javascript -->
+ <!-- Provide site root and default themes to javascript -->
<script>
- var path_to_root = "../";
- var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light";
+ const path_to_root = "../";
+ const default_light_theme = "light";
+ const default_dark_theme = "navy";
</script>
<!-- Start loading toc.js asap -->
<script src="../toc.js"></script>
@@ -44,8 +45,8 @@
<!-- Work around some values being stored in localStorage wrapped in quotes -->
<script>
try {
- var theme = localStorage.getItem('mdbook-theme');
- var sidebar = localStorage.getItem('mdbook-sidebar');
+ let theme = localStorage.getItem('mdbook-theme');
+ let sidebar = localStorage.getItem('mdbook-sidebar');
if (theme.startsWith('"') && theme.endsWith('"')) {
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
@@ -59,7 +60,8 @@
<!-- Set the theme before any content is loaded, prevents flash -->
<script>
- var theme;
+ const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
+ let theme;
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
if (theme === null || theme === undefined) { theme = default_theme; }
const html = document.documentElement;
@@ -72,8 +74,8 @@
<!-- Hide / unhide sidebar before it is displayed -->
<script>
- var sidebar = null;
- var sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
+ let sidebar = null;
+ const sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
if (document.body.clientWidth >= 1080) {
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
sidebar = sidebar || 'visible';
@@ -109,6 +111,7 @@
<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="default_theme">Auto</button></li>
<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>
diff --git a/development/cmake.html b/development/cmake.html
index b301649..89cd875 100644
--- a/development/cmake.html
+++ b/development/cmake.html
@@ -31,10 +31,11 @@
<!-- Custom theme stylesheets -->
- <!-- Provide site root to javascript -->
+ <!-- Provide site root and default themes to javascript -->
<script>
- var path_to_root = "../";
- var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light";
+ const path_to_root = "../";
+ const default_light_theme = "light";
+ const default_dark_theme = "navy";
</script>
<!-- Start loading toc.js asap -->
<script src="../toc.js"></script>
@@ -44,8 +45,8 @@
<!-- Work around some values being stored in localStorage wrapped in quotes -->
<script>
try {
- var theme = localStorage.getItem('mdbook-theme');
- var sidebar = localStorage.getItem('mdbook-sidebar');
+ let theme = localStorage.getItem('mdbook-theme');
+ let sidebar = localStorage.getItem('mdbook-sidebar');
if (theme.startsWith('"') && theme.endsWith('"')) {
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
@@ -59,7 +60,8 @@
<!-- Set the theme before any content is loaded, prevents flash -->
<script>
- var theme;
+ const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
+ let theme;
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
if (theme === null || theme === undefined) { theme = default_theme; }
const html = document.documentElement;
@@ -72,8 +74,8 @@
<!-- Hide / unhide sidebar before it is displayed -->
<script>
- var sidebar = null;
- var sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
+ let sidebar = null;
+ const sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
if (document.body.clientWidth >= 1080) {
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
sidebar = sidebar || 'visible';
@@ -109,6 +111,7 @@
<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="default_theme">Auto</button></li>
<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>
diff --git a/development/gas.html b/development/gas.html
index 3c87981..dd946bb 100644
--- a/development/gas.html
+++ b/development/gas.html
@@ -31,10 +31,11 @@
<!-- Custom theme stylesheets -->
- <!-- Provide site root to javascript -->
+ <!-- Provide site root and default themes to javascript -->
<script>
- var path_to_root = "../";
- var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light";
+ const path_to_root = "../";
+ const default_light_theme = "light";
+ const default_dark_theme = "navy";
</script>
<!-- Start loading toc.js asap -->
<script src="../toc.js"></script>
@@ -44,8 +45,8 @@
<!-- Work around some values being stored in localStorage wrapped in quotes -->
<script>
try {
- var theme = localStorage.getItem('mdbook-theme');
- var sidebar = localStorage.getItem('mdbook-sidebar');
+ let theme = localStorage.getItem('mdbook-theme');
+ let sidebar = localStorage.getItem('mdbook-sidebar');
if (theme.startsWith('"') && theme.endsWith('"')) {
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
@@ -59,7 +60,8 @@
<!-- Set the theme before any content is loaded, prevents flash -->
<script>
- var theme;
+ const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
+ let theme;
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
if (theme === null || theme === undefined) { theme = default_theme; }
const html = document.documentElement;
@@ -72,8 +74,8 @@
<!-- Hide / unhide sidebar before it is displayed -->
<script>
- var sidebar = null;
- var sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
+ let sidebar = null;
+ const sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
if (document.body.clientWidth >= 1080) {
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
sidebar = sidebar || 'visible';
@@ -109,6 +111,7 @@
<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="default_theme">Auto</button></li>
<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>
@@ -158,8 +161,18 @@
<h1 id="gas"><a class="header" href="#gas">gas</a></h1>
<h2 id="frequently-used-directives"><a class="header" href="#frequently-used-directives">Frequently used directives</a></h2>
<ul>
-<li>
-<p><code>.byte</code>, <code>.2byte</code>, <code>.4byte</code>, <code>.8byte</code> to define a N byte value</p>
+<li><code>.section</code> to define a section (elf files)
+<pre><code class="language-x86asm">.section .text.foo, "ax", @progbits
+; defines section named .text.foo with alloc+exec perms
+
+.section .data.foo, "aw", @progbits
+; defines section named .data.foo with alloc+write perms
+
+.section .rodata.foo, "a", @progbits
+; defines section named .rodata.foo with alloc perms
+</code></pre>
+</li>
+<li><code>.byte</code>, <code>.2byte</code>, <code>.4byte</code>, <code>.8byte</code> to define a N byte value
<pre><code class="language-x86asm">.byte 0xaa
.2byte 0xaabb
.2byte 0xaa, 0xbb
@@ -167,19 +180,16 @@
.8byte 0xaabbccdd11223344
</code></pre>
</li>
-<li>
-<p><code>.ascii</code> to define an ascii string</p>
+<li><code>.ascii</code> to define an ascii string
<pre><code class="language-x86asm">.ascii "foo" ; allocates 3 bytes
</code></pre>
</li>
-<li>
-<p><code>.asciz</code> to define an ascii string with <code>'\0'</code> terminator</p>
+<li><code>.asciz</code> to define an ascii string with <code>'\0'</code> terminator
<pre><code class="language-x86asm">.asciz "foo" ; allocates 4 bytes (str + \0)
</code></pre>
</li>
-<li>
-<p><code>.macro</code> to define assembler macros. Arguments are accessed with the
-<code>\arg</code> syntax.</p>
+<li><code>.macro</code> to define assembler macros. Arguments are accessed with the
+<code>\arg</code> syntax.
<pre><code class="language-x86asm">.macro defstr name str
\name:
.ascii "\str"
@@ -194,16 +204,37 @@ defstr foo, "foobar"
<p>Use <code>\()</code> to concatenate macro argument and literal.</p>
</blockquote>
</li>
-<li>
-<p><a href="https://sourceware.org/binutils/docs/as">GNU Assembler</a></p>
-</li>
-<li>
-<p><a href="https://sourceware.org/binutils/docs/as/Pseudo-Ops.html#Pseudo-Ops">GNU Assembler Directives</a></p>
+<li><code>.rept</code> to repeat a sequence of lines between <code>.rept</code> and <code>.endr</code>.
+<pre><code class="language-x86asm">.rept 4
+.4byte 123
+.endr
+</code></pre>
</li>
-<li>
-<p><a href="https://sourceware.org/binutils/docs/as/i386_002dDependent.html">GNU Assembler <code>x86_64</code> dependent features</a></p>
+<li><code>.fill cnt, elem_size, val</code> write <code>cnt</code> times <code>val</code> with element size <code>elem_size</code>. For example one can use it to create a mbr boot record (magic number 0xaa55 at byte 511, 512).
+<pre><code class="language-x86asm">.section .boot, "ax", @progbits
+; some code ..
+.4byte 0xff
+
+.fill 510 - (. - .boot), 1, 0x00
+.2byte 0xaa55
+
+; as foo.s &amp;&amp; objdump -j .boot -s
+; Contents of section .boot:
+; 0000 ff000000 00000000 00000000 00000000
+; ..
+; 01f0 00000000 00000000 00000000 000055aa
+</code></pre>
+<blockquote>
+<p>Here <code>.</code> stands for the current location counter.</p>
+</blockquote>
</li>
</ul>
+<h2 id="references"><a class="header" href="#references">References</a></h2>
+<ul>
+<li><a href="https://sourceware.org/binutils/docs/as">GNU Assembler</a></li>
+<li><a href="https://sourceware.org/binutils/docs/as/Pseudo-Ops.html#Pseudo-Ops">GNU Assembler Directives</a></li>
+<li><a href="https://sourceware.org/binutils/docs/as/i386_002dDependent.html">GNU Assembler <code>x86_64</code> dependent features</a></li>
+</ul>
</main>
@@ -213,7 +244,7 @@ defstr foo, "foobar"
<i class="fa fa-angle-left"></i>
</a>
- <a rel="next prefetch" href="../development/git.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
+ <a rel="next prefetch" href="../development/ld.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
<i class="fa fa-angle-right"></i>
</a>
@@ -227,7 +258,7 @@ defstr foo, "foobar"
<i class="fa fa-angle-left"></i>
</a>
- <a rel="next prefetch" href="../development/git.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
+ <a rel="next prefetch" href="../development/ld.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
<i class="fa fa-angle-right"></i>
</a>
</nav>
diff --git a/development/gcc.html b/development/gcc.html
index 05ac313..02d6c0f 100644
--- a/development/gcc.html
+++ b/development/gcc.html
@@ -31,10 +31,11 @@
<!-- Custom theme stylesheets -->
- <!-- Provide site root to javascript -->
+ <!-- Provide site root and default themes to javascript -->
<script>
- var path_to_root = "../";
- var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light";
+ const path_to_root = "../";
+ const default_light_theme = "light";
+ const default_dark_theme = "navy";
</script>
<!-- Start loading toc.js asap -->
<script src="../toc.js"></script>
@@ -44,8 +45,8 @@
<!-- Work around some values being stored in localStorage wrapped in quotes -->
<script>
try {
- var theme = localStorage.getItem('mdbook-theme');
- var sidebar = localStorage.getItem('mdbook-sidebar');
+ let theme = localStorage.getItem('mdbook-theme');
+ let sidebar = localStorage.getItem('mdbook-sidebar');
if (theme.startsWith('"') && theme.endsWith('"')) {
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
@@ -59,7 +60,8 @@
<!-- Set the theme before any content is loaded, prevents flash -->
<script>
- var theme;
+ const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
+ let theme;
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
if (theme === null || theme === undefined) { theme = default_theme; }
const html = document.documentElement;
@@ -72,8 +74,8 @@
<!-- Hide / unhide sidebar before it is displayed -->
<script>
- var sidebar = null;
- var sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
+ let sidebar = null;
+ const sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
if (document.body.clientWidth >= 1080) {
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
sidebar = sidebar || 'visible';
@@ -109,6 +111,7 @@
<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="default_theme">Auto</button></li>
<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>
diff --git a/development/gcov.html b/development/gcov.html
index 2bb0b94..b52eb71 100644
--- a/development/gcov.html
+++ b/development/gcov.html
@@ -31,10 +31,11 @@
<!-- Custom theme stylesheets -->
- <!-- Provide site root to javascript -->
+ <!-- Provide site root and default themes to javascript -->
<script>
- var path_to_root = "../";
- var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light";
+ const path_to_root = "../";
+ const default_light_theme = "light";
+ const default_dark_theme = "navy";
</script>
<!-- Start loading toc.js asap -->
<script src="../toc.js"></script>
@@ -44,8 +45,8 @@
<!-- Work around some values being stored in localStorage wrapped in quotes -->
<script>
try {
- var theme = localStorage.getItem('mdbook-theme');
- var sidebar = localStorage.getItem('mdbook-sidebar');
+ let theme = localStorage.getItem('mdbook-theme');
+ let sidebar = localStorage.getItem('mdbook-sidebar');
if (theme.startsWith('"') && theme.endsWith('"')) {
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
@@ -59,7 +60,8 @@
<!-- Set the theme before any content is loaded, prevents flash -->
<script>
- var theme;
+ const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
+ let theme;
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
if (theme === null || theme === undefined) { theme = default_theme; }
const html = document.documentElement;
@@ -72,8 +74,8 @@
<!-- Hide / unhide sidebar before it is displayed -->
<script>
- var sidebar = null;
- var sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
+ let sidebar = null;
+ const sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
if (document.body.clientWidth >= 1080) {
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
sidebar = sidebar || 'visible';
@@ -109,6 +111,7 @@
<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="default_theme">Auto</button></li>
<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>
diff --git a/development/git.html b/development/git.html
index 89a9d30..2d4295d 100644
--- a/development/git.html
+++ b/development/git.html
@@ -31,10 +31,11 @@
<!-- Custom theme stylesheets -->
- <!-- Provide site root to javascript -->
+ <!-- Provide site root and default themes to javascript -->
<script>
- var path_to_root = "../";
- var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light";
+ const path_to_root = "../";
+ const default_light_theme = "light";
+ const default_dark_theme = "navy";
</script>
<!-- Start loading toc.js asap -->
<script src="../toc.js"></script>
@@ -44,8 +45,8 @@
<!-- Work around some values being stored in localStorage wrapped in quotes -->
<script>
try {
- var theme = localStorage.getItem('mdbook-theme');
- var sidebar = localStorage.getItem('mdbook-sidebar');
+ let theme = localStorage.getItem('mdbook-theme');
+ let sidebar = localStorage.getItem('mdbook-sidebar');
if (theme.startsWith('"') && theme.endsWith('"')) {
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
@@ -59,7 +60,8 @@
<!-- Set the theme before any content is loaded, prevents flash -->
<script>
- var theme;
+ const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
+ let theme;
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
if (theme === null || theme === undefined) { theme = default_theme; }
const html = document.documentElement;
@@ -72,8 +74,8 @@
<!-- Hide / unhide sidebar before it is displayed -->
<script>
- var sidebar = null;
- var sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
+ let sidebar = null;
+ const sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
if (document.body.clientWidth >= 1080) {
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
sidebar = sidebar || 'visible';
@@ -109,6 +111,7 @@
<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="default_theme">Auto</button></li>
<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>
@@ -404,7 +407,7 @@ history: A - B
<nav class="nav-wrapper" aria-label="Page navigation">
<!-- Mobile navigation buttons -->
- <a rel="prev" href="../development/gas.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
+ <a rel="prev" href="../development/ld.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
<i class="fa fa-angle-left"></i>
</a>
@@ -418,7 +421,7 @@ history: A - B
</div>
<nav class="nav-wide-wrapper" aria-label="Page navigation">
- <a rel="prev" href="../development/gas.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
+ <a rel="prev" href="../development/ld.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
<i class="fa fa-angle-left"></i>
</a>
diff --git a/development/glibc.html b/development/glibc.html
index d10049c..3b2411f 100644
--- a/development/glibc.html
+++ b/development/glibc.html
@@ -31,10 +31,11 @@
<!-- Custom theme stylesheets -->
- <!-- Provide site root to javascript -->
+ <!-- Provide site root and default themes to javascript -->
<script>
- var path_to_root = "../";
- var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light";
+ const path_to_root = "../";
+ const default_light_theme = "light";
+ const default_dark_theme = "navy";
</script>
<!-- Start loading toc.js asap -->
<script src="../toc.js"></script>
@@ -44,8 +45,8 @@
<!-- Work around some values being stored in localStorage wrapped in quotes -->
<script>
try {
- var theme = localStorage.getItem('mdbook-theme');
- var sidebar = localStorage.getItem('mdbook-sidebar');
+ let theme = localStorage.getItem('mdbook-theme');
+ let sidebar = localStorage.getItem('mdbook-sidebar');
if (theme.startsWith('"') && theme.endsWith('"')) {
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
@@ -59,7 +60,8 @@
<!-- Set the theme before any content is loaded, prevents flash -->
<script>
- var theme;
+ const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
+ let theme;
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
if (theme === null || theme === undefined) { theme = default_theme; }
const html = document.documentElement;
@@ -72,8 +74,8 @@
<!-- Hide / unhide sidebar before it is displayed -->
<script>
- var sidebar = null;
- var sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
+ let sidebar = null;
+ const sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
if (document.body.clientWidth >= 1080) {
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
sidebar = sidebar || 'visible';
@@ -109,6 +111,7 @@
<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="default_theme">Auto</button></li>
<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>
diff --git a/development/index.html b/development/index.html
index 98bd9ec..357ffe1 100644
--- a/development/index.html
+++ b/development/index.html
@@ -31,10 +31,11 @@
<!-- Custom theme stylesheets -->
- <!-- Provide site root to javascript -->
+ <!-- Provide site root and default themes to javascript -->
<script>
- var path_to_root = "../";
- var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light";
+ const path_to_root = "../";
+ const default_light_theme = "light";
+ const default_dark_theme = "navy";
</script>
<!-- Start loading toc.js asap -->
<script src="../toc.js"></script>
@@ -44,8 +45,8 @@
<!-- Work around some values being stored in localStorage wrapped in quotes -->
<script>
try {
- var theme = localStorage.getItem('mdbook-theme');
- var sidebar = localStorage.getItem('mdbook-sidebar');
+ let theme = localStorage.getItem('mdbook-theme');
+ let sidebar = localStorage.getItem('mdbook-sidebar');
if (theme.startsWith('"') && theme.endsWith('"')) {
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
@@ -59,7 +60,8 @@
<!-- Set the theme before any content is loaded, prevents flash -->
<script>
- var theme;
+ const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
+ let theme;
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
if (theme === null || theme === undefined) { theme = default_theme; }
const html = document.documentElement;
@@ -72,8 +74,8 @@
<!-- Hide / unhide sidebar before it is displayed -->
<script>
- var sidebar = null;
- var sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
+ let sidebar = null;
+ const sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
if (document.body.clientWidth >= 1080) {
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
sidebar = sidebar || 'visible';
@@ -109,6 +111,7 @@
<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="default_theme">Auto</button></li>
<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>
@@ -162,6 +165,7 @@
<li><a href="./glibc.html">glibc</a></li>
<li><a href="./gcc.html">gcc</a></li>
<li><a href="./gas.html">gas</a></li>
+<li><a href="./ld.html">ld</a></li>
<li><a href="./git.html">git</a></li>
<li><a href="./cmake.html">cmake</a></li>
<li><a href="./make.html">make</a></li>
diff --git a/development/ld.html b/development/ld.html
new file mode 100644
index 0000000..b1a3fbb
--- /dev/null
+++ b/development/ld.html
@@ -0,0 +1,416 @@
+<!DOCTYPE HTML>
+<html lang="en" class="light sidebar-visible" dir="ltr">
+ <head>
+ <!-- Book generated using mdBook -->
+ <meta charset="UTF-8">
+ <title>ld - Notes</title>
+
+
+ <!-- Custom HTML head -->
+
+ <meta name="description" content="">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta name="theme-color" content="#ffffff">
+
+ <link rel="icon" href="../favicon.svg">
+ <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 rel="stylesheet" href="../fonts/fonts.css">
+
+ <!-- Highlight.js Stylesheets -->
+ <link rel="stylesheet" id="highlight-css" href="../highlight.css">
+ <link rel="stylesheet" id="tomorrow-night-css" href="../tomorrow-night.css">
+ <link rel="stylesheet" id="ayu-highlight-css" href="../ayu-highlight.css">
+
+ <!-- Custom theme stylesheets -->
+
+
+ <!-- Provide site root and default themes to javascript -->
+ <script>
+ const path_to_root = "../";
+ const default_light_theme = "light";
+ const default_dark_theme = "navy";
+ </script>
+ <!-- Start loading toc.js asap -->
+ <script src="../toc.js"></script>
+ </head>
+ <body>
+ <div id="body-container">
+ <!-- Work around some values being stored in localStorage wrapped in quotes -->
+ <script>
+ try {
+ let theme = localStorage.getItem('mdbook-theme');
+ let 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>
+ const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
+ let theme;
+ try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
+ if (theme === null || theme === undefined) { theme = default_theme; }
+ const html = document.documentElement;
+ html.classList.remove('light')
+ html.classList.add(theme);
+ html.classList.add("js");
+ </script>
+
+ <input type="checkbox" id="sidebar-toggle-anchor" class="hidden">
+
+ <!-- Hide / unhide sidebar before it is displayed -->
+ <script>
+ let sidebar = null;
+ const sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
+ if (document.body.clientWidth >= 1080) {
+ try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
+ sidebar = sidebar || 'visible';
+ } else {
+ sidebar = 'hidden';
+ }
+ sidebar_toggle.checked = sidebar === 'visible';
+ html.classList.remove('sidebar-visible');
+ html.classList.add("sidebar-" + sidebar);
+ </script>
+
+ <nav id="sidebar" class="sidebar" aria-label="Table of contents">
+ <!-- populated by js -->
+ <mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
+ <noscript>
+ <iframe class="sidebar-iframe-outer" src="../toc.html"></iframe>
+ </noscript>
+ <div id="sidebar-resize-handle" class="sidebar-resize-handle">
+ <div class="sidebar-resize-indicator"></div>
+ </div>
+ </nav>
+
+ <div id="page-wrapper" class="page-wrapper">
+
+ <div class="page">
+ <div id="menu-bar-hover-placeholder"></div>
+ <div id="menu-bar" class="menu-bar sticky">
+ <div class="left-buttons">
+ <label id="sidebar-toggle" class="icon-button" for="sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
+ <i class="fa fa-bars"></i>
+ </label>
+ <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="default_theme">Auto</button></li>
+ <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</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>
+ <a href="https://github.com/johannst/notes" title="Git repository" aria-label="Git repository">
+ <i id="git-repository-button" class="fa fa-github"></i>
+ </a>
+
+ </div>
+ </div>
+
+ <div id="search-wrapper" class="hidden">
+ <form id="searchbar-outer" class="searchbar-outer">
+ <input type="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>
+ 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 id="ld1"><a class="header" href="#ld1">ld(1)</a></h1>
+<pre><code>ld [opts] files...
+ -T &lt;script&gt; use &lt;script&gt; as linker script
+ --trace report each file the linker touches
+ --start-group archives --end-group
+ search archives repearepeatedly until no new
+ undefined references are created
+ (eg helpfull with list of static libraries)
+</code></pre>
+<h2 id="linker-script"><a class="header" href="#linker-script">Linker Script</a></h2>
+<p><code>output</code> sections are defined as follows (full description at <a href="https://sourceware.org/binutils/docs/ld/Output-Section-Attributes.html">output
+section</a> and <a href="https://sourceware.org/binutils/docs/ld/Input-Section.html">input section</a>).</p>
+<pre><code>section_name [vaddr] : [AT(paddr)] {
+ file_pattern (section_pattern)
+}
+</code></pre>
+<p>The following gives an example of an <code>output</code> section with two <code>input</code> section rules.</p>
+<pre><code>.foo : {
+ abc.o (.foo)
+ *.o (.foo.*)
+}
+</code></pre>
+<h3 id="example-virtual-vs-physical-load-address"><a class="header" href="#example-virtual-vs-physical-load-address">Example: virtual vs physical (load) address</a></h3>
+<p>Sometimes code is initially located at a different location as when being run.
+For example in embedded cases, where code may initially resides in a <em>rom</em> and
+startup code will copy a section with writable <em>data</em> into <em>ram</em>. Code accessing
+the writable data accesses the data in the <em>ram</em>.</p>
+<p>In this case we need different addresses for the same data.</p>
+<ul>
+<li>The <code>virtual</code> or <em>runtime</em> address, this is the address used when the linker
+resolves accesses to the data. Hence, this is the address the data will have
+when the code is running.</li>
+<li>The <code>physical</code> or <em>load</em> address, this is the address the data is stored at
+initially. Startup code typically copies the initial values from the
+<code>physical</code> to the <code>virtual</code> address.</li>
+</ul>
+<p>The following shows an example linker script which uses <em>virtual</em> and <em>physical</em>
+addresses. The full source files can be found <a href="https://github.com/johannst/notes/tree/master/src/development/ld">here</a>.</p>
+<pre><code>OUTPUT_FORMAT(elf64-x86-64)
+ENTRY(_entry)
+
+SECTIONS {
+ /* Set the initial location counter (vaddr) */
+ . = 0x00800000;
+
+ /* Create .text output section at current vaddr */
+ .text : {
+ *(.text*)
+ }
+
+ ASSERT(. == 0x00800000 + SIZEOF(.text), "inc loc counter automatically")
+
+ /* Create .data section at location counter aligned to the next 0x100 (vaddr) */
+ /* Set the load address to 0x00100000 (paddr) */
+ .data ALIGN(0x100) : AT(0x00100000) {
+ HIDDEN(_data_vaddr = .);
+ HIDDEN(_data_paddr = LOADADDR(.data));
+ *(.data*)
+ }
+
+ /* Create .rodata with explicit vaddr */
+ /* Re-adjust the paddr location counter */
+ .rodata 0x00804000 : AT(ADDR(.rodata)) {
+ *(.rodata*)
+ }
+
+ ASSERT(. == 0x00804000 + SIZEOF(.rodata), "inc loc counter automatically")
+
+ .stack ALIGN (0x1000) : {
+ . += 0x1000;
+ HIDDEN(_stack_top = .);
+ }
+
+ /DISCARD/ : {
+ *(.*)
+ }
+}
+
+/* Some example assertions */
+ASSERT(ADDR(.data) != LOADADDR(.data), "DATA vaddr and paddr must be different")
+ASSERT(SIZEOF(.stack) == 0x1000, "STACK section must be 0x1000")
+</code></pre>
+<p>We can use the following assembly snippet to explore the linker script.</p>
+<pre><code class="language-x86asm">.section .text, "ax", @progbits
+.global _entry
+_entry:
+ mov $_stack_top, %rsp
+ mov $asm_array, %rax
+ mov (asm_len), %eax
+
+ hlt
+ jmp _entry
+
+.section .data.asm, "aw", @progbits
+asm_array:
+ .4byte 0xa
+ .4byte 0xb
+ .4byte 0xc
+ .4byte 0xd
+.rept 4
+ .4byte 0xff
+.endr
+
+.section .rodata.asm, "a", @progbits
+asm_len:
+ .4byte 8
+</code></pre>
+<blockquote>
+<p><code>gcc -c data.S &amp;&amp; ld -o link-nomem -T link-nomem.ld data.o</code></p>
+</blockquote>
+<p>The elf load segments show the difference in <em>physical</em> and <em>virtual</em> address
+for the segment containing the <code>.data</code> section.</p>
+<pre><code class="language-sh">&gt; readelf -W -l link-nomem
+# There are 4 program headers, starting at offset 64
+#
+# Program Headers:
+# Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
+# LOAD 0x001100 0x0000000000800100 0x0000000000100000 0x000020 0x000020 RW 0x1000
+# LOAD 0x002000 0x0000000000800000 0x0000000000800000 0x000018 0x000018 R E 0x1000
+# LOAD 0x003000 0x0000000000804000 0x0000000000804000 0x000004 0x000004 R 0x1000
+# LOAD 0x000000 0x0000000000805000 0x0000000000805000 0x000000 0x001000 RW 0x1000
+#
+# Section to Segment mapping:
+# Segment Sections...
+# 00 .data
+# 01 .text
+# 02 .rodata
+# 03 .stack
+</code></pre>
+<p>Startup code could copy data from <code>_data_paddr</code> to <code>_data_vaddr</code>.</p>
+<pre><code class="language-sh">&gt; nm link-nomem
+# 0000000000800100 d asm_array
+# 0000000000804000 r asm_len
+# 0000000000100000 a _data_paddr
+# 0000000000800100 d _data_vaddr
+# 0000000000800000 T _entry
+# 0000000000806000 b _stack_top
+</code></pre>
+<p>The linker resolves symbols to their <em>virtual</em> address, this can be seen by the
+access to the <code>asm_array</code> variable.</p>
+<pre><code class="language-sh">&gt; objdump -d link-nomem
+# Disassembly of section .text:
+#
+# 0000000000800000 &lt;_entry&gt;:
+# 800000: 48 c7 c4 00 60 80 00 mov $0x806000,%rsp
+# 800007: 48 c7 c0 00 01 80 00 mov $0x800100,%rax ;; mov $asm_array, %rax
+# 80000e: 8b 04 25 00 40 80 00 mov 0x804000,%eax
+# 800015: f4 hlt
+# 800016: eb e8 jmp 800000 &lt;_entry&gt;
+</code></pre>
+<p>The following linker script shows an example with the <code>MEMORY</code> command.</p>
+<pre><code>OUTPUT_FORMAT(elf64-x86-64)
+ENTRY(_entry)
+
+MEMORY {
+ ROM : ORIGIN = 0x00100000, LENGTH = 0x4000
+ RAM : ORIGIN = 0x00800000, LENGTH = 0x4000
+}
+
+SECTIONS {
+ /* Create .text output section at ROM (vaddr) */
+ .text : {
+ *(.text*)
+ } &gt; ROM
+
+ ASSERT(. == ORIGIN(ROM) + SIZEOF(.text), "inc loc counter automatically")
+
+ /* Create .data output section at RAM (vaddr) */
+ /* Set load addr to ROM, right after .text (paddr) */
+ .data : {
+ HIDDEN(_data_vaddr = .);
+ HIDDEN(_data_paddr = LOADADDR(.data));
+ *(.data*)
+ } &gt; RAM AT &gt; ROM
+
+ /* Append .rodata output section at ROM (vaddr) */
+ .rodata : {
+ *(.rodata*)
+ } &gt; ROM
+
+ /* Append .stack output section at RAM (vaddr) aligned up to next 0x1000 */
+ .stack : ALIGN (0x1000) {
+ . += 0x1000;
+ HIDDEN(_stack_top = .);
+ } &gt; RAM
+
+ /DISCARD/ : {
+ *(.*)
+ }
+}
+
+/* Some example assertions */
+ASSERT(ADDR(.data) != LOADADDR(.data), "DATA vaddr and paddr must be different")
+ASSERT(ADDR(.rodata) == LOADADDR(.rodata), "RODATA vaddr and paddr must be euqal")
+ASSERT(ADDR(.stack) == ORIGIN(RAM) + 0x1000, "STACK section must aligned to 0x1000")
+ASSERT(SIZEOF(.stack) == 0x1000, "STACK section must be 0x1000")
+</code></pre>
+<h2 id="references"><a class="header" href="#references">References</a></h2>
+<ul>
+<li><a href="https://sourceware.org/binutils/docs/ld/">ld manual</a></li>
+<li><a href="https://sourceware.org/binutils/docs/ld/Input-Section.html">ld script: input sections</a></li>
+<li><a href="https://sourceware.org/binutils/docs/ld/Output-Section-Attributes.html">ld script: output sections</a></li>
+<li><a href="https://github.com/johannst/notes/tree/master/src/development/ld">notes/ld example files</a></li>
+</ul>
+
+ </main>
+
+ <nav class="nav-wrapper" aria-label="Page navigation">
+ <!-- Mobile navigation buttons -->
+ <a rel="prev" href="../development/gas.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
+ <i class="fa fa-angle-left"></i>
+ </a>
+
+ <a rel="next prefetch" href="../development/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 rel="prev" href="../development/gas.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
+ <i class="fa fa-angle-left"></i>
+ </a>
+
+ <a rel="next prefetch" href="../development/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>
+ window.playground_copyable = true;
+ </script>
+
+
+ <script src="../elasticlunr.min.js"></script>
+ <script src="../mark.min.js"></script>
+ <script src="../searcher.js"></script>
+
+ <script src="../clipboard.min.js"></script>
+ <script src="../highlight.js"></script>
+ <script src="../book.js"></script>
+
+ <!-- Custom JS scripts -->
+
+
+ </div>
+ </body>
+</html>
diff --git a/development/ld.so.html b/development/ld.so.html
index 24bcef5..54ebc39 100644
--- a/development/ld.so.html
+++ b/development/ld.so.html
@@ -31,10 +31,11 @@
<!-- Custom theme stylesheets -->
- <!-- Provide site root to javascript -->
+ <!-- Provide site root and default themes to javascript -->
<script>
- var path_to_root = "../";
- var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light";
+ const path_to_root = "../";
+ const default_light_theme = "light";
+ const default_dark_theme = "navy";
</script>
<!-- Start loading toc.js asap -->
<script src="../toc.js"></script>
@@ -44,8 +45,8 @@
<!-- Work around some values being stored in localStorage wrapped in quotes -->
<script>
try {
- var theme = localStorage.getItem('mdbook-theme');
- var sidebar = localStorage.getItem('mdbook-sidebar');
+ let theme = localStorage.getItem('mdbook-theme');
+ let sidebar = localStorage.getItem('mdbook-sidebar');
if (theme.startsWith('"') && theme.endsWith('"')) {
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
@@ -59,7 +60,8 @@
<!-- Set the theme before any content is loaded, prevents flash -->
<script>
- var theme;
+ const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
+ let theme;
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
if (theme === null || theme === undefined) { theme = default_theme; }
const html = document.documentElement;
@@ -72,8 +74,8 @@
<!-- Hide / unhide sidebar before it is displayed -->
<script>
- var sidebar = null;
- var sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
+ let sidebar = null;
+ const sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
if (document.body.clientWidth >= 1080) {
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
sidebar = sidebar || 'visible';
@@ -109,6 +111,7 @@
<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="default_theme">Auto</button></li>
<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>
diff --git a/development/ld/Makefile b/development/ld/Makefile
new file mode 100644
index 0000000..16869a8
--- /dev/null
+++ b/development/ld/Makefile
@@ -0,0 +1,15 @@
+show-mem:
+show-nomem:
+show-%: link-%
+ readelf -W -S -l $^
+ nm $^
+ objdump -d $^
+
+link-%: link-%.ld data.o
+ ld -o $@ -T $^
+
+%.o: %.S
+ gcc -c $^
+
+clean:
+ $(RM) mem *.o
diff --git a/development/ld/data.S b/development/ld/data.S
new file mode 100644
index 0000000..d76adcf
--- /dev/null
+++ b/development/ld/data.S
@@ -0,0 +1,23 @@
+.section .text, "ax", @progbits
+.global _entry
+_entry:
+ mov $_stack_top, %rsp
+ mov $asm_array, %rax
+ mov (asm_len), %eax
+
+ hlt
+ jmp _entry
+
+.section .data.asm, "aw", @progbits
+asm_array:
+ .4byte 0xa
+ .4byte 0xb
+ .4byte 0xc
+ .4byte 0xd
+.rept 4
+ .4byte 0xff
+.endr
+
+.section .rodata.asm, "a", @progbits
+asm_len:
+ .4byte 8
diff --git a/development/ld/link-mem.ld b/development/ld/link-mem.ld
new file mode 100644
index 0000000..b5167a5
--- /dev/null
+++ b/development/ld/link-mem.ld
@@ -0,0 +1,45 @@
+OUTPUT_FORMAT(elf64-x86-64)
+ENTRY(_entry)
+
+MEMORY {
+ ROM : ORIGIN = 0x00100000, LENGTH = 0x4000
+ RAM : ORIGIN = 0x00800000, LENGTH = 0x4000
+}
+
+SECTIONS {
+ /* Create .text output section at ROM (vaddr) */
+ .text : {
+ *(.text*)
+ } > ROM
+
+ ASSERT(. == ORIGIN(ROM) + SIZEOF(.text), "inc loc counter automatically")
+
+ /* Create .data output section at RAM (vaddr) */
+ /* Set load addr to ROM, right after .text (paddr) */
+ .data : {
+ HIDDEN(_data_vaddr = .);
+ HIDDEN(_data_paddr = LOADADDR(.data));
+ *(.data*)
+ } > RAM AT > ROM
+
+ /* Append .rodata output section at ROM (vaddr) */
+ .rodata : {
+ *(.rodata*)
+ } > ROM
+
+ /* Append .stack output section at RAM (vaddr) aligned up to next 0x1000 */
+ .stack : ALIGN (0x1000) {
+ . += 0x1000;
+ HIDDEN(_stack_top = .);
+ } > RAM
+
+ /DISCARD/ : {
+ *(.*)
+ }
+}
+
+/* Some example assertions */
+ASSERT(ADDR(.data) != LOADADDR(.data), "DATA vaddr and paddr must be different")
+ASSERT(ADDR(.rodata) == LOADADDR(.rodata), "RODATA vaddr and paddr must be euqal")
+ASSERT(ADDR(.stack) == ORIGIN(RAM) + 0x1000, "STACK section must aligned to 0x1000")
+ASSERT(SIZEOF(.stack) == 0x1000, "STACK section must be 0x1000")
diff --git a/development/ld/link-nomem.ld b/development/ld/link-nomem.ld
new file mode 100644
index 0000000..32b7f3c
--- /dev/null
+++ b/development/ld/link-nomem.ld
@@ -0,0 +1,43 @@
+OUTPUT_FORMAT(elf64-x86-64)
+ENTRY(_entry)
+
+SECTIONS {
+ /* Set the initial location counter (vaddr) */
+ . = 0x00800000;
+
+ /* Create .text output section at current vaddr */
+ .text : {
+ *(.text*)
+ }
+
+ ASSERT(. == 0x00800000 + SIZEOF(.text), "inc loc counter automatically")
+
+ /* Create .data section at location counter aligned to the next 0x100 (vaddr) */
+ /* Set the load address to 0x00100000 (paddr) */
+ .data ALIGN(0x100) : AT(0x00100000) {
+ HIDDEN(_data_vaddr = .);
+ HIDDEN(_data_paddr = LOADADDR(.data));
+ *(.data*)
+ }
+
+ /* Create .rodata with explicit vaddr */
+ /* Re-adjust the paddr location counter */
+ .rodata 0x00804000 : AT(ADDR(.rodata)) {
+ *(.rodata*)
+ }
+
+ ASSERT(. == 0x00804000 + SIZEOF(.rodata), "inc loc counter automatically")
+
+ .stack ALIGN (0x1000) : {
+ . += 0x1000;
+ HIDDEN(_stack_top = .);
+ }
+
+ /DISCARD/ : {
+ *(.*)
+ }
+}
+
+/* Some example assertions */
+ASSERT(ADDR(.data) != LOADADDR(.data), "DATA vaddr and paddr must be different")
+ASSERT(SIZEOF(.stack) == 0x1000, "STACK section must be 0x1000")
diff --git a/development/make.html b/development/make.html
index 5e9470a..a65843c 100644
--- a/development/make.html
+++ b/development/make.html
@@ -31,10 +31,11 @@
<!-- Custom theme stylesheets -->
- <!-- Provide site root to javascript -->
+ <!-- Provide site root and default themes to javascript -->
<script>
- var path_to_root = "../";
- var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light";
+ const path_to_root = "../";
+ const default_light_theme = "light";
+ const default_dark_theme = "navy";
</script>
<!-- Start loading toc.js asap -->
<script src="../toc.js"></script>
@@ -44,8 +45,8 @@
<!-- Work around some values being stored in localStorage wrapped in quotes -->
<script>
try {
- var theme = localStorage.getItem('mdbook-theme');
- var sidebar = localStorage.getItem('mdbook-sidebar');
+ let theme = localStorage.getItem('mdbook-theme');
+ let sidebar = localStorage.getItem('mdbook-sidebar');
if (theme.startsWith('"') && theme.endsWith('"')) {
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
@@ -59,7 +60,8 @@
<!-- Set the theme before any content is loaded, prevents flash -->
<script>
- var theme;
+ const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
+ let theme;
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
if (theme === null || theme === undefined) { theme = default_theme; }
const html = document.documentElement;
@@ -72,8 +74,8 @@
<!-- Hide / unhide sidebar before it is displayed -->
<script>
- var sidebar = null;
- var sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
+ let sidebar = null;
+ const sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
if (document.body.clientWidth >= 1080) {
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
sidebar = sidebar || 'visible';
@@ -109,6 +111,7 @@
<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="default_theme">Auto</button></li>
<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>
diff --git a/development/pgo.html b/development/pgo.html
index cb041d6..51045a9 100644
--- a/development/pgo.html
+++ b/development/pgo.html
@@ -31,10 +31,11 @@
<!-- Custom theme stylesheets -->
- <!-- Provide site root to javascript -->
+ <!-- Provide site root and default themes to javascript -->
<script>
- var path_to_root = "../";
- var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light";
+ const path_to_root = "../";
+ const default_light_theme = "light";
+ const default_dark_theme = "navy";
</script>
<!-- Start loading toc.js asap -->
<script src="../toc.js"></script>
@@ -44,8 +45,8 @@
<!-- Work around some values being stored in localStorage wrapped in quotes -->
<script>
try {
- var theme = localStorage.getItem('mdbook-theme');
- var sidebar = localStorage.getItem('mdbook-sidebar');
+ let theme = localStorage.getItem('mdbook-theme');
+ let sidebar = localStorage.getItem('mdbook-sidebar');
if (theme.startsWith('"') && theme.endsWith('"')) {
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
@@ -59,7 +60,8 @@
<!-- Set the theme before any content is loaded, prevents flash -->
<script>
- var theme;
+ const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
+ let theme;
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
if (theme === null || theme === undefined) { theme = default_theme; }
const html = document.documentElement;
@@ -72,8 +74,8 @@
<!-- Hide / unhide sidebar before it is displayed -->
<script>
- var sidebar = null;
- var sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
+ let sidebar = null;
+ const sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
if (document.body.clientWidth >= 1080) {
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
sidebar = sidebar || 'visible';
@@ -109,6 +111,7 @@
<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="default_theme">Auto</button></li>
<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>
diff --git a/development/python.html b/development/python.html
index 1652215..9227b61 100644
--- a/development/python.html
+++ b/development/python.html
@@ -31,10 +31,11 @@
<!-- Custom theme stylesheets -->
- <!-- Provide site root to javascript -->
+ <!-- Provide site root and default themes to javascript -->
<script>
- var path_to_root = "../";
- var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light";
+ const path_to_root = "../";
+ const default_light_theme = "light";
+ const default_dark_theme = "navy";
</script>
<!-- Start loading toc.js asap -->
<script src="../toc.js"></script>
@@ -44,8 +45,8 @@
<!-- Work around some values being stored in localStorage wrapped in quotes -->
<script>
try {
- var theme = localStorage.getItem('mdbook-theme');
- var sidebar = localStorage.getItem('mdbook-sidebar');
+ let theme = localStorage.getItem('mdbook-theme');
+ let sidebar = localStorage.getItem('mdbook-sidebar');
if (theme.startsWith('"') && theme.endsWith('"')) {
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
@@ -59,7 +60,8 @@
<!-- Set the theme before any content is loaded, prevents flash -->
<script>
- var theme;
+ const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
+ let theme;
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
if (theme === null || theme === undefined) { theme = default_theme; }
const html = document.documentElement;
@@ -72,8 +74,8 @@
<!-- Hide / unhide sidebar before it is displayed -->
<script>
- var sidebar = null;
- var sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
+ let sidebar = null;
+ const sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
if (document.body.clientWidth >= 1080) {
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
sidebar = sidebar || 'visible';
@@ -109,6 +111,7 @@
<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="default_theme">Auto</button></li>
<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>
diff --git a/development/symbolver.html b/development/symbolver.html
index 0615e83..1491cdf 100644
--- a/development/symbolver.html
+++ b/development/symbolver.html
@@ -31,10 +31,11 @@
<!-- Custom theme stylesheets -->
- <!-- Provide site root to javascript -->
+ <!-- Provide site root and default themes to javascript -->
<script>
- var path_to_root = "../";
- var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light";
+ const path_to_root = "../";
+ const default_light_theme = "light";
+ const default_dark_theme = "navy";
</script>
<!-- Start loading toc.js asap -->
<script src="../toc.js"></script>
@@ -44,8 +45,8 @@
<!-- Work around some values being stored in localStorage wrapped in quotes -->
<script>
try {
- var theme = localStorage.getItem('mdbook-theme');
- var sidebar = localStorage.getItem('mdbook-sidebar');
+ let theme = localStorage.getItem('mdbook-theme');
+ let sidebar = localStorage.getItem('mdbook-sidebar');
if (theme.startsWith('"') && theme.endsWith('"')) {
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
@@ -59,7 +60,8 @@
<!-- Set the theme before any content is loaded, prevents flash -->
<script>
- var theme;
+ const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
+ let theme;
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
if (theme === null || theme === undefined) { theme = default_theme; }
const html = document.documentElement;
@@ -72,8 +74,8 @@
<!-- Hide / unhide sidebar before it is displayed -->
<script>
- var sidebar = null;
- var sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
+ let sidebar = null;
+ const sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
if (document.body.clientWidth >= 1080) {
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
sidebar = sidebar || 'visible';
@@ -109,6 +111,7 @@
<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="default_theme">Auto</button></li>
<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>