From: Rob Pike Date: Tue, 21 Jul 2009 23:31:35 +0000 (-0700) Subject: add a .interp section and fix vaddr in INTERP prog. X-Git-Tag: weekly.2009-11-06~1079 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=304b7954e8b1eff2672f782414175d947145868e;p=gostls13.git add a .interp section and fix vaddr in INTERP prog. R=rsc DELTA=16 (9 added, 3 deleted, 4 changed) OCL=31956 CL=31963 --- diff --git a/src/cmd/6l/asm.c b/src/cmd/6l/asm.c index 850077b80c..854049cce1 100644 --- a/src/cmd/6l/asm.c +++ b/src/cmd/6l/asm.c @@ -450,12 +450,21 @@ asmb(void) ph->type = PT_INTERP; ph->flags = PF_R; ph->off = startelf(); - ph->vaddr = startva; - ph->paddr = startva; + ph->vaddr = startva + ph->off; + ph->paddr = startva + ph->off; write(cout, linuxdynld, sizeof linuxdynld); ph->filesz = endelf() - ph->off; ph->align = 1; + sh = newElf64SHdr(".interp"); + sh->type = SHT_PROGBITS; + sh->flags = SHF_ALLOC; + sh->addr = va; + sh->off = ph->off; + sh->addr = startva + sh->off; + sh->size = ph->filesz; + sh->addralign = 1; + /* dynamic load section */ ph = newElf64PHdr(); ph->type = PT_LOAD; @@ -521,9 +530,6 @@ asmb(void) elf64writedynent(DT_RELAENT, ELF64RELASIZE); elf64writedynent(DT_STRSZ, STRTABSIZE); elf64writedynent(DT_SYMENT, 0); - elf64writedynent(DT_REL, startva); - elf64writedynent(DT_RELSZ, 0); - elf64writedynent(DT_RELENT, ELF64RELSIZE); elf64writedynent(DT_NULL, 0); cflush(); dynsh->size = seek(cout, 0, 1) - dynsh->off; @@ -578,8 +584,8 @@ asmb(void) } ph = newElf64PHdr(); - ph->type = 0x6474e551; /* gok */ - ph->flags = PF_X+PF_W+PF_R; + ph->type = 0x6474e551; /* GNU_STACK */ + ph->flags = PF_W+PF_R; ph->align = 8; fo = ELF64RESERVE;