diff options
| author | Srdjan Petrovic <spetrovic@google.com> | 2015-06-16 10:07:45 -0700 |
|---|---|---|
| committer | Ian Lance Taylor <iant@golang.org> | 2015-06-19 20:28:01 +0000 |
| commit | cc6554f750ccaf63bcdcc478b2a60d71ca76d342 (patch) | |
| tree | e8fef7b61482ba964a8ba3d4a3d659fcddf3dee0 /src | |
| parent | dc89350fed5f75c277ceb1367cf7e8a2a88f0c77 (diff) | |
| download | go-cc6554f750ccaf63bcdcc478b2a60d71ca76d342.tar.xz | |
cmd/link/internal/ld, cmd/go: -buildmode=c-shared support for darwin/amd64
All of the heavy-lifting was done by minux@, with his external-linking support
for darwin/arm64: golang.org/cl/8781
Change-Id: I7c9fbc19246f418c065c92fb2c13c00026ff0f82
Reviewed-on: https://go-review.googlesource.com/11127
Run-TryBot: Srdjan Petrovic <spetrovic@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src')
| -rw-r--r-- | src/cmd/dist/test.go | 2 | ||||
| -rw-r--r-- | src/cmd/go/build.go | 1 | ||||
| -rw-r--r-- | src/cmd/link/internal/ld/lib.go | 14 | ||||
| -rw-r--r-- | src/cmd/link/internal/ld/macho.go | 7 | ||||
| -rw-r--r-- | src/cmd/link/internal/ld/macho_combine_dwarf.go | 3 |
5 files changed, 19 insertions, 8 deletions
diff --git a/src/cmd/dist/test.go b/src/cmd/dist/test.go index 6f1b43cfce..802631dbf9 100644 --- a/src/cmd/dist/test.go +++ b/src/cmd/dist/test.go @@ -571,7 +571,7 @@ func (t *tester) supportedBuildmode(mode string) bool { case "c-shared": // TODO(hyangah): add linux-386. switch pair { - case "linux-amd64", "android-arm": + case "linux-amd64", "darwin-amd64", "android-arm": return true } return false diff --git a/src/cmd/go/build.go b/src/cmd/go/build.go index 49893de0ed..a9f9b58872 100644 --- a/src/cmd/go/build.go +++ b/src/cmd/go/build.go @@ -334,6 +334,7 @@ func buildModeInit() { codegenArg = "-shared" case "linux/arm": buildAsmflags = append(buildAsmflags, "-shared") + case "darwin/amd64": case "android/arm": default: fatalf("-buildmode=c-shared not supported on %s\n", platform) diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index faa5fc9fd6..ac28439d96 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -926,7 +926,7 @@ func hostlink() { } if HEADTYPE == obj.Hdarwin { - argv = append(argv, "-Wl,-no_pie,-pagezero_size,4000000,-headerpad,1144") + argv = append(argv, "-Wl,-no_pie,-headerpad,1144") } if HEADTYPE == obj.Hopenbsd { argv = append(argv, "-Wl,-nopie") @@ -944,9 +944,17 @@ func hostlink() { } switch Buildmode { + case BuildmodeExe: + if HEADTYPE == obj.Hdarwin { + argv = append(argv, "-Wl,-pagezero_size,4000000") + } case BuildmodeCShared: - argv = append(argv, "-Wl,-Bsymbolic") - argv = append(argv, "-shared") + if HEADTYPE == obj.Hdarwin { + argv = append(argv, "-dynamiclib") + } else { + argv = append(argv, "-Wl,-Bsymbolic") + argv = append(argv, "-shared") + } case BuildmodeShared: // TODO(mwhudson): unless you do this, dynamic relocations fill // out the findfunctab table and for some reason shared libraries diff --git a/src/cmd/link/internal/ld/macho.go b/src/cmd/link/internal/ld/macho.go index 3a8a881d97..1f14db744f 100644 --- a/src/cmd/link/internal/ld/macho.go +++ b/src/cmd/link/internal/ld/macho.go @@ -356,9 +356,10 @@ func machoshbits(mseg *MachoSeg, sect *Section, segname string) { buf := "__" + strings.Replace(sect.Name[1:], ".", "_", -1) var msect *MachoSect - if Thearch.Thechar == '7' && sect.Rwx&1 == 0 { - // darwin/arm64 forbids absolute relocs in __TEXT, so if - // the section is not executable, put it in __DATA segment. + 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 + // complains about absolute relocs in __TEXT, so if the section is not + // executable, put it in __DATA segment. msect = newMachoSect(mseg, buf, "__DATA") } else { msect = newMachoSect(mseg, buf, segname) diff --git a/src/cmd/link/internal/ld/macho_combine_dwarf.go b/src/cmd/link/internal/ld/macho_combine_dwarf.go index 9134373a52..b5a5a8d429 100644 --- a/src/cmd/link/internal/ld/macho_combine_dwarf.go +++ b/src/cmd/link/internal/ld/macho_combine_dwarf.go @@ -22,6 +22,7 @@ var machHeader *macho.FileHeader var mappedHeader []byte const ( + LC_ID_DYLIB = 0xd LC_LOAD_DYLINKER = 0xe LC_PREBOUND_DYLIB = 0x10 LC_LOAD_WEAK_DYLIB = 0x18 @@ -246,7 +247,7 @@ func machoCombineDwarf(inexe, dsym, outexe string) error { err = machoUpdateLoadCommand(reader, &linkEditDataCmd{}, "DataOff") case LC_ENCRYPTION_INFO, LC_ENCRYPTION_INFO_64: err = machoUpdateLoadCommand(reader, &encryptionInfoCmd{}, "CryptOff") - case macho.LoadCmdDylib, macho.LoadCmdThread, macho.LoadCmdUnixThread, LC_PREBOUND_DYLIB, LC_UUID, LC_VERSION_MIN_MACOSX, LC_VERSION_MIN_IPHONEOS, LC_SOURCE_VERSION, LC_MAIN, LC_LOAD_DYLINKER, LC_LOAD_WEAK_DYLIB, LC_REEXPORT_DYLIB, LC_RPATH: + case macho.LoadCmdDylib, macho.LoadCmdThread, macho.LoadCmdUnixThread, LC_PREBOUND_DYLIB, LC_UUID, LC_VERSION_MIN_MACOSX, LC_VERSION_MIN_IPHONEOS, LC_SOURCE_VERSION, LC_MAIN, LC_LOAD_DYLINKER, LC_LOAD_WEAK_DYLIB, LC_REEXPORT_DYLIB, LC_RPATH, LC_ID_DYLIB: // Nothing to update default: err = fmt.Errorf("Unknown load command 0x%x (%s)\n", int(cmd.Cmd), cmd.Cmd) |
