aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/8l
diff options
context:
space:
mode:
authorShenghou Ma <minux@golang.org>2015-03-09 03:05:40 -0400
committerMinux Ma <minux@golang.org>2015-03-24 03:23:16 +0000
commit04642e92aca42076662edd3eedc57873bb1568dd (patch)
treecd939db093c6a26a638dd636dc58164226de640f /src/cmd/8l
parentb6ed943bef2c984fe9ca48b5f80594bf7ba2a6e5 (diff)
downloadgo-04642e92aca42076662edd3eedc57873bb1568dd.tar.xz
cmd/internal/ld, cmd/8l: external linking for windows/386
Update #4069: this CL fixes the issue on windows/386. Signed-off-by: Shenghou Ma <minux@golang.org> Change-Id: I2d2ea233f976aab3f356f9b508cdd246d5013e2e Reviewed-on: https://go-review.googlesource.com/7283 Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src/cmd/8l')
-rw-r--r--src/cmd/8l/asm.go35
-rw-r--r--src/cmd/8l/obj.go4
2 files changed, 38 insertions, 1 deletions
diff --git a/src/cmd/8l/asm.go b/src/cmd/8l/asm.go
index 59543fdb1a..49ff0808ae 100644
--- a/src/cmd/8l/asm.go
+++ b/src/cmd/8l/asm.go
@@ -235,6 +235,11 @@ func adddynrel(s *ld.LSym, r *ld.Reloc) {
r.Type = 256 // ignore during relocsym
return
}
+
+ if ld.HEADTYPE == ld.Hwindows && s.Size == PtrSize {
+ // nothing to do, the relocation will be laid out in pereloc1
+ return
+ }
}
ld.Ctxt.Cursym = s
@@ -332,6 +337,36 @@ 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:
+ v = ld.IMAGE_REL_I386_DIR32
+
+ case ld.R_CALL,
+ ld.R_PCREL:
+ v = ld.IMAGE_REL_I386_REL32
+ }
+
+ ld.Thearch.Wput(uint16(v))
+
+ return true
+}
+
func archreloc(r *ld.Reloc, s *ld.LSym, val *int64) int {
if ld.Linkmode == ld.LinkExternal {
return -1
diff --git a/src/cmd/8l/obj.go b/src/cmd/8l/obj.go
index 3e0e478363..938a77700a 100644
--- a/src/cmd/8l/obj.go
+++ b/src/cmd/8l/obj.go
@@ -68,6 +68,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
@@ -99,7 +100,8 @@ func archinit() {
ld.Hfreebsd,
ld.Hlinux,
ld.Hnetbsd,
- ld.Hopenbsd:
+ ld.Hopenbsd,
+ ld.Hwindows:
break
}