Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cmd/link: support buildmode=pie with internal linking (on Android) #31343

eliasnaur opened this issue Apr 8, 2019 · 3 comments

cmd/link: support buildmode=pie with internal linking (on Android) #31343

eliasnaur opened this issue Apr 8, 2019 · 3 comments


Copy link

@eliasnaur eliasnaur commented Apr 8, 2019

With Termux it's now within reach to run all.bash directly an Android device without a host. Termux is an Android app that includes a complete Linux environment, including the NDK C toolchain.

However, I'm stopped by an unfortunate chain of constraints:

  1. Android only run PIE binaries, so buildmode=pie must be set in cmd/dist (
  2. Buildmode=pie forces external linking (#18968)
  3. External linking requires that the g register is allocated to TLS storage.
  4. Android doesn't support native ELF TLS storage (yet), so runtime/cgo is needed for setting up the g register storage at initialization using the pthread API.
  5. cmd/dist doesn't know how to build runtime/cgo.

Of the above conditions, 1, 3 and 4 are outside our control and I don't think we want to fix 5.

This issue is about relaxing 2, so buildmode=pie no longer requires external linking.

Copy link

@cherrymui cherrymui commented Apr 8, 2019

I'm not sure about Android, but on Linux, on AMD64 internal linking PIE should work. It is not the default, but -buildmode=pie -ldflags=-linkmode=internal would do. On ARM64, it is ongoing work on (I'm not sure about 386 and ARM32.)

Copy link

@gopherbot gopherbot commented Apr 8, 2019

Change mentions this issue: runtime,runtime/cgo: set up TLS storage for Android Q without cgo

gopherbot pushed a commit that referenced this issue Apr 8, 2019
Android Q frees a static TLS slot for us to use. Use the offset of
that slot as the default for our TLS offset.

As a result, runtime/cgo is no more a requirement for Android Q and

Updates #31343
Updates #29674

Change-Id: I759049b2e2865bd3d4fdc05a8cfc6db8b0da1f5d
TryBot-Result: Gobot Gobot <>
Reviewed-by: Cherry Zhang <>
@ALTree ALTree added the NeedsFix label Apr 9, 2019
@ALTree ALTree added this to the Unplanned milestone Apr 9, 2019
Copy link

@gopherbot gopherbot commented Nov 15, 2019

Change mentions this issue: cmd/link: bootstrap android/arm64 in internal linking mode

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
None yet
Linked pull requests

Successfully merging a pull request may close this issue.

None yet
4 participants
You can’t perform that action at this time.