diff options
Diffstat (limited to 'src/cmd/6l/asm.c')
-rw-r--r-- | src/cmd/6l/asm.c | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/src/cmd/6l/asm.c b/src/cmd/6l/asm.c index 8807a6ed5..a09cc9727 100644 --- a/src/cmd/6l/asm.c +++ b/src/cmd/6l/asm.c @@ -43,6 +43,7 @@ char linuxdynld[] = "/lib64/ld-linux-x86-64.so.2"; char freebsddynld[] = "/libexec/ld-elf.so.1"; char openbsddynld[] = "/usr/libexec/ld.so"; char netbsddynld[] = "/libexec/ld.elf_so"; +char dragonflydynld[] = "/usr/libexec/ld-elf.so.2"; char zeroes[32]; @@ -99,12 +100,6 @@ int nelfsym = 1; static void addpltsym(Sym*); static void addgotsym(Sym*); -Sym * -lookuprel(void) -{ - return lookup(".rela", 0); -} - void adddynrela(Sym *rela, Sym *s, Reloc *r) { @@ -312,9 +307,12 @@ elfreloc1(Reloc *r, vlong sectoff) break; case D_TLS: - if(r->siz == 4) - VPUT(R_X86_64_TPOFF32 | (uint64)elfsym<<32); - else + if(r->siz == 4) { + if(flag_shared) + VPUT(R_X86_64_GOTTPOFF | (uint64)elfsym<<32); + else + VPUT(R_X86_64_TPOFF32 | (uint64)elfsym<<32); + } else return -1; break; } @@ -625,13 +623,20 @@ asmb(void) sect = segtext.sect; cseek(sect->vaddr - segtext.vaddr + segtext.fileoff); codeblk(sect->vaddr, sect->len); - - /* output read-only data in text segment (rodata, gosymtab, pclntab, ...) */ for(sect = sect->next; sect != nil; sect = sect->next) { cseek(sect->vaddr - segtext.vaddr + segtext.fileoff); datblk(sect->vaddr, sect->len); } + if(segrodata.filelen > 0) { + if(debug['v']) + Bprint(&bso, "%5.2f rodatblk\n", cputime()); + Bflush(&bso); + + cseek(segrodata.fileoff); + datblk(segrodata.vaddr, segrodata.filelen); + } + if(debug['v']) Bprint(&bso, "%5.2f datblk\n", cputime()); Bflush(&bso); @@ -668,6 +673,7 @@ asmb(void) case Hfreebsd: case Hnetbsd: case Hopenbsd: + case Hdragonfly: debug['8'] = 1; /* 64-bit addresses */ break; case Hwindows: @@ -696,7 +702,8 @@ asmb(void) case Hfreebsd: case Hnetbsd: case Hopenbsd: - symo = rnd(HEADR+segtext.len, INITRND)+segdata.filelen; + case Hdragonfly: + symo = rnd(HEADR+segtext.len, INITRND)+rnd(segrodata.len, INITRND)+segdata.filelen; symo = rnd(symo, INITRND); break; case Hwindows: @@ -786,6 +793,7 @@ asmb(void) case Hfreebsd: case Hnetbsd: case Hopenbsd: + case Hdragonfly: asmbelf(symo); break; case Hwindows: |