Skip to content
Browse files

cmd/link/internal/ld: enable bitcode builds for iOS, tvOS, watchOS

The Go toolchain cannot output bitcode, but there is a trick where
object code can be marked with an __asm section, persuading the
Apple toolchain to include our object code in bitcode builds.

This enables Go builds with bitcode enabled; the next CL adds
the necessary plumbing for building on tvOS and watchOS.

Thanks to Aman Gupta for the trick.

Test is added two CLs from here.

Fixes #22395 (at least until Apple tightens bitcode requirements.)

Change-Id: Ic1c1448c4d46222bb3dd097b1f4df80848051e5f
Reviewed-by: Cherry Zhang <>
  • Loading branch information...
eliasnaur committed Mar 17, 2019
1 parent 03a79e9 commit ba965640a45f5d94976c3ad6c92396cab539155a
Showing with 19 additions and 0 deletions.
  1. +19 −0 src/cmd/link/internal/ld/macho.go
@@ -395,6 +395,14 @@ func (ctxt *Link) domacho() {
s.Attr |= sym.AttrReachable

// Add a dummy symbol that will become the __asm marker section.
if ctxt.LinkMode == LinkExternal {
s := ctxt.Syms.Lookup(".llvmasm", 0)
s.Type = sym.SMACHO
s.Attr |= sym.AttrReachable

func machoadddynlib(lib string, linkmode LinkMode) {
@@ -481,6 +489,17 @@ func machoshbits(ctxt *Link, mseg *MachoSeg, sect *sym.Section, segname string)

// Some platforms such as watchOS and tvOS require binaries with
// bitcode enabled. The Go toolchain can't output bitcode, so use
// a marker section in the __LLVM segment, "__asm", to tell the Apple
// toolchain that the Go text came from assembler and thus has no
// bitcode. This is not true, but Kotlin/Native, Rust and Flutter
// are also using this trick.
if sect.Name == ".llvmasm" { = "__asm"
msect.segname = "__LLVM"

if segname == "__DWARF" {
msect.flag |= S_ATTR_DEBUG

0 comments on commit ba96564

Please sign in to comment.
You can’t perform that action at this time.