 <p>Difference is crucial. Relocation address is addend to all relocs in section. So if it differ with load address, nothing will really work in this section -- all relocs inside section will be resolved to wrong values.</p> <p>So why do we need technique like this? Not so much applications, but suppose (<a href="http://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_node/ld_22.html" rel="nofollow">from here</a>) you do have on your architecture extremely fast memory at 0x1000</p> <p>Then you may take two sections to have relocation address 0x1000:</p> <pre><code>.text0 0x1000 : AT (0x4000) { o1/*.o(.text) } __load_start_text0 = LOADADDR (.text0); __load_stop_text0 = LOADADDR (.text0) + SIZEOF (.text0); .text1 0x1000 : AT (0x4000 + SIZEOF (.text0)) { o2/*.o(.text) } __load_start_text1 = LOADADDR (.text1); __load_stop_text1 = LOADADDR (.text1) + SIZEOF (.text1); . = 0x1000 + MAX (SIZEOF (.text0), SIZEOF (.text1)); </code></pre> <p>Now at runtime go ahead and when you need text1, manage it by yourself to be copied on right address from its actual load address:</p> <pre><code>extern char __load_start_text1, __load_stop_text1; memcpy ((char *) 0x1000, &amp;__load_start_text1, &amp;__load_stop_text1 - &amp;__load_start_text1); </code></pre> <p>And then use it, <strong>as it was loaded</strong> here naturally. This technique is called overlays.</p> <p>I think, example is pretty clear.</p>