On Wed, Jan 9, 2013 at 6:36 AM, horseriver <horserivers@gmail.com> wrote:
On Wed, Jan 09, 2013 at 01:28:12PM +0800, Peter Teoh wrote:
> On Sun, Jan 6, 2013 at 11:17 AM, horseriver <horserivers@gmail.com> wrote:
>
VSYSCALL_BASE = 0xffffe000;

SECTIONS
{
  . = VSYSCALL_BASE ;

  .hash           : { *(.hash) }                :text
  .dynsym         : { *(.dynsym) }
  .dynstr         : { *(.dynstr) }
  .gnu.version    : { *(.gnu.version) }
  .gnu.version_d  : { *(.gnu.version_d) }
  .gnu.version_r  : { *(.gnu.version_r) }
  

I suspect something wrong with VSYSCALL_BASE + value here.   

look at this:

http://marcbug.scc-dc.com/svn/repository/trunk/linuxkernel/linux-2.6.16-mcemu/arch/x86_64/ia32/vsyscall.lds

and doing a diff with your ld script, there is not much diff, except for the VSYSCALL_BASE + SIZEOF_HEADER 

portion.

Read here to understand how SIZEOF_HEADER is calculated:

http://www.math.utah.edu/docs/info/ld_3.html#SEC13

Not sure why do u want to shift the whole section by SIZEOF_HEADER down in bytes?

--
Regards,
Peter Teoh