aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Zinman <aaron@azinman.com>2016-02-03 17:36:15 -0800
committerAndrew Gerrand <adg@golang.org>2016-04-14 05:24:14 +0000
commitf819f48fc8c472714317daba843c833f7e6f1aaf (patch)
treee9120529b90d40d1a0d60d721f7f981ef6322f92
parent16f783ee7c1cd2dc999525e7b35360fc0112590a (diff)
downloadgo-f819f48fc8c472714317daba843c833f7e6f1aaf.tar.gz
go-f819f48fc8c472714317daba843c833f7e6f1aaf.zip
darwin/amd64: fix text-relocation issues for c-archive libraries

The existing implementation deals with absolute relocations in __TEXT for darwin/amd64 in build-mode c-shared, but it ignores c-archive. This results in issues when trying to use a c-archive in an iOS app on the 64-bit simulator. This patch adds c-archive to the handling of this issue. Fixes #14217 Change-Id: I2e4d5193caa531171ad22fd0cd420a8bfb4646a6 Reviewed-on: https://go-review.googlesource.com/19206 Reviewed-by: David Crawshaw <crawshaw@golang.org> Run-TryBot: David Crawshaw <crawshaw@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-on: https://go-review.googlesource.com/22046
-rw-r--r--src/cmd/link/internal/ld/macho.go5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/cmd/link/internal/ld/macho.go b/src/cmd/link/internal/ld/macho.go
index 1c7f3a0d82..cf3fba1eee 100644
--- a/src/cmd/link/internal/ld/macho.go
+++ b/src/cmd/link/internal/ld/macho.go
@@ -356,8 +356,9 @@ func machoshbits(mseg *MachoSeg, sect *Section, segname string) {
buf := "__" + strings.Replace(sect.Name[1:], ".", "_", -1)
var msect *MachoSect
- if sect.Rwx&1 == 0 && (Thearch.Thechar == '7' || (Thearch.Thechar == '6' && Buildmode == BuildmodeCShared)) {
- // Darwin external linker on arm64 and on amd64 in c-shared buildmode
+ if sect.Rwx&1 == 0 && (Thearch.Thechar == '7' || // arm64
+ (Thearch.Thechar == '6' && (Buildmode == BuildmodeCShared || Buildmode == BuildmodeCArchive))) { // amd64
+ // Darwin external linker on arm64 and on amd64 in c-shared/c-archive buildmode
// complains about absolute relocs in __TEXT, so if the section is not
// executable, put it in __DATA segment.
msect = newMachoSect(mseg, buf, "__DATA")