summaryrefslogtreecommitdiff
path: root/src/cmd/6l/asm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/6l/asm.c')
-rw-r--r--src/cmd/6l/asm.c32
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: