Why is address 0x400000 chosen as a start of text segment in x86_64 ABI?
<p>In <a href="http://home.agh.edu.pl/~amrozek/abi.pdf">this</a> document on p. 27 it says that text segment starts at
0x400000.  Why was this particular address chosen?  Is there any
reason for that?  The same address is chosen in <code>GNU ld</code> on <code>Linux</code>:</p>

<pre><code>$ ld -verbose | grep -i text-segment
  PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x400000)); . = SEGMENT_START("text-segment", 0x400000) + SIZEOF_HEADERS;
</code></pre>

<p>It's surprising because this address is <em>bigger</em> in 32-bit x86 executables:</p>

<pre><code>$ ld -verbose | grep -i text-segment
  PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x08048000)); . = SEGMENT_START("text-segment", 0x08048000) + SIZEOF_HEADERS;
</code></pre>

<p>I read <a href="https://stackoverflow.com/questions/2187484/why-is-the-elf-execution-entry-point-virtual-address-of-the-form-0x80xxxxx-and-n">this question</a> which discusses why 0x080xxxxx address was chosen
for i386 but it doesn't explain a change in x86_64. It's hard to find
any explanation on that matter.  Does anybody have a clue?</p>