aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/6l
diff options
context:
space:
mode:
authorShenghou Ma <minux@golang.org>2015-03-13 22:10:48 -0400
committerMinux Ma <minux@golang.org>2015-03-24 03:23:49 +0000
commite7df05397755c81f9f7006acb2b684a8c8c4fa9d (patch)
tree206e3814852ced57325182313aecf58136835a7c /src/cmd/6l
parent484d9399dee5471e88c69f1ef84cabc45709cac8 (diff)
downloadgo-e7df05397755c81f9f7006acb2b684a8c8c4fa9d.tar.xz
cmd/internal/ld, cmd/6l: external linking for windows/amd64
Change-Id: I2d2ea233f976aab3f356f9b508cdd246d5013e30 Signed-off-by: Shenghou Ma <minux@golang.org> Reviewed-on: https://go-review.googlesource.com/7534 Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src/cmd/6l')
-rw-r--r--src/cmd/6l/asm.go53
-rw-r--r--src/cmd/6l/obj.go4
2 files changed, 52 insertions, 5 deletions
diff --git a/src/cmd/6l/asm.go b/src/cmd/6l/asm.go
index 3617a95bf5..1df166f100 100644
--- a/src/cmd/6l/asm.go
+++ b/src/cmd/6l/asm.go
@@ -204,10 +204,16 @@ func adddynrel(s *ld.LSym, r *ld.Reloc) {
switch r.Type {
case ld.R_CALL,
ld.R_PCREL:
- addpltsym(targ)
- r.Sym = ld.Linklookup(ld.Ctxt, ".plt", 0)
- r.Add = int64(targ.Plt)
- return
+ if ld.HEADTYPE == ld.Hwindows {
+ // nothing to do, the relocation will be laid out in pereloc1
+ return
+ } else {
+ // for both ELF and Mach-O
+ addpltsym(targ)
+ r.Sym = ld.Linklookup(ld.Ctxt, ".plt", 0)
+ r.Add = int64(targ.Plt)
+ return
+ }
case ld.R_ADDR:
if s.Type == ld.STEXT && ld.Iself {
@@ -262,6 +268,11 @@ func adddynrel(s *ld.LSym, r *ld.Reloc) {
r.Type = 256 // ignore during relocsym
return
}
+
+ if ld.HEADTYPE == ld.Hwindows {
+ // nothing to do, the relocation will be laid out in pereloc1
+ return
+ }
}
ld.Ctxt.Cursym = s
@@ -393,6 +404,40 @@ func machoreloc1(r *ld.Reloc, sectoff int64) int {
return 0
}
+func pereloc1(r *ld.Reloc, sectoff int64) bool {
+ var v uint32
+
+ rs := r.Xsym
+
+ if rs.Dynid < 0 {
+ ld.Diag("reloc %d to non-coff symbol %s type=%d", r.Type, rs.Name, rs.Type)
+ return false
+ }
+
+ ld.Thearch.Lput(uint32(sectoff))
+ ld.Thearch.Lput(uint32(rs.Dynid))
+
+ switch r.Type {
+ default:
+ return false
+
+ case ld.R_ADDR:
+ if r.Siz == 8 {
+ v = ld.IMAGE_REL_AMD64_ADDR64
+ } else {
+ v = ld.IMAGE_REL_AMD64_ADDR32
+ }
+
+ case ld.R_CALL,
+ ld.R_PCREL:
+ v = ld.IMAGE_REL_AMD64_REL32
+ }
+
+ ld.Thearch.Wput(uint16(v))
+
+ return true
+}
+
func archreloc(r *ld.Reloc, s *ld.LSym, val *int64) int {
return -1
}
diff --git a/src/cmd/6l/obj.go b/src/cmd/6l/obj.go
index e8c93c90fb..f7165ab05e 100644
--- a/src/cmd/6l/obj.go
+++ b/src/cmd/6l/obj.go
@@ -71,6 +71,7 @@ func linkarchinit() {
ld.Thearch.Elfsetupplt = elfsetupplt
ld.Thearch.Gentext = gentext
ld.Thearch.Machoreloc1 = machoreloc1
+ ld.Thearch.PEreloc1 = pereloc1
ld.Thearch.Lput = ld.Lputl
ld.Thearch.Wput = ld.Wputl
ld.Thearch.Vput = ld.Vputl
@@ -110,7 +111,8 @@ func archinit() {
ld.Hnacl,
ld.Hnetbsd,
ld.Hopenbsd,
- ld.Hsolaris:
+ ld.Hsolaris,
+ ld.Hwindows:
break
}