-
Notifications
You must be signed in to change notification settings - Fork 17.7k
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
x/mobile: add bitcode support #22395
Comments
Can you please update on this. This is a blocker item for one of my project. It will be great if I get some visibility on release plan for this requirement. Thanks. |
I'm having the same problem: Currently the Go compiler doesn't support compiling to BitCode intermediate representation. I think something has to be done for Gomobile to have a future. It's expected that Apple will mandate BitCode for iOS-apps in the near future. However there seems to be some work going on on Google-side: https://go.googlesource.com/gollvm/ You could also try https://dragonegg.llvm.org/ but I have no idea if this is going to work. |
Any update on this ? |
I don't think there is any update other than gollvm is progressing. May I ask why this issue is blocking your project? |
@eliasnaur thanks for looking into this query. I hope this answers your question. Let me know if you have any suggestions/query. Thanks again. |
Just ran into this. Yes, bitcode support would be a must. Any updates? |
Yes, lack of bitcode support on iOS is a showstopper for library projects, and a big liability for others. We can safely assume that 'strong recommendation' to use bitcode is going to turn into 'requirement' sooner or later. |
Since it hasn't been mentioned here yet: Apple TV apps must support Bitcode. Not optional. Search for "bitcode" here: https://developer.apple.com/tvos/submit/ This has caused us problems when trying to support a client wanting to use our library on Apple TV. |
Just ran into this. |
I'll throw my hat in this ring too. We have iOS/Android sdks that use a go-mobile framework for some common encryption/decryption. Lack of bitcode is a major issue for us. I am attempting to replace the go-mobile framework in the iOS project with a js framework that does the same stuff, but it'd be nice to be able to keep the go framework |
It is a showstopper for us as well |
WWDC is coming soon, hopefully Bitcode will not become a requirement... The lack of any response from anyone in the know about how one an get Bitcode going for golang/gomobile is definitely concerning. |
As far as I know the only way to get the required Bitcode is to run LLVM. There is an active project to add Go support to LLVM; you can follow it at https://go.googlesource.com/gollvm/ . Until that project is complete and working, there will be no way to get Bitcode. That is essentially what @eliasnaur said on March 16. While I understand that the pace of these things is frustrating, I don't think it's entirely fair to say that there has been no response. Go is an open source project; if you want this to happen faster, try building GoLLVM, report bugs, and send in fixes. |
Hi, Checking to see if there is any new development on this ? Thanks, |
Hi, To add to the need, if that's important. I'm working on a project that started cloud based, and elected to write the code in "go." It turns out we also need to run the code on the client, both iOS and Android. But, our partners are demanding bit-code compliance. We are at a decision point to decide whether to rewrite the entire set of code so we can have a single code base. Curious about the thinking regarding bit code compliance for "go." Is it a project? If so, what is the time-frame? Go is perfect for our application, incidentally. |
Hi, Checking again on this. Is there any roadmap for this support ? Thanks, |
Please refrain from asking about updates on this issue; fixing it is a lot of work and only benefits niche platforms for Go: tvOS and watchOS. @ianlancetaylor suggested you try gollvm; have you done that? If so, what problems did you run into? |
Ahem, what do you mean tvOS and watchOS? What about iOS? :) Not sure if that is a 'niche' environment for gomobile bind.. |
Only watchOS and tvOS require bitcode; iOS does not. |
But we don’t know that will be the case forever. In fact, I’d say it’s highly likely to not be the case.
Drew
…Sent from my iPhone XS Max
On Dec 18, 2018, at 10:48 AM, Elias Naur ***@***.***> wrote:
Only watchOS and tvOS require bitcode; iOS does not.
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub, or mute the thread.
|
Whatever the likelyhood, let's worry about it when it happens and not waste precious development efforts on hypotheticals. Who knows, perhaps the very existence of non-bitcode gomobile apps will delay Apple's decision. |
iOS "requires" bitcode in the way that if you are making a library with golang / gomobile bind, the library you produce will force the iOS app developer to disable bitcode in their app; and we iOS devs really do not like that. :) Also of course there is a point to having bitcode support in the first place and that is now lost. third, who knows when iSteve will decide bitcode support will become mandatory .. |
Everyone agrees that it would be good if we could compile Go into bitcode. As mentioned above, the only way that is ever going to happen is if you use the GoLLVM compiler. So if you want Go compiled into bitcode, please help with GoLLVM. |
The Kotlin/Native team has found a work-around to full bitcode support: they add a See discussion on the kotlin-native repo: JetBrains/kotlin-native#1202 (comment) The technique was discovered on an earlier PR, which attempted to emit bitcode but was unable to do so reliably without using Apple's version of LLVM: JetBrains/kotlin-native#1564 (comment) Would it be possible to add a similar empty |
It would not be hard to add an empty section to the binary. I worry that this is essentially a way to hack around Apple's policy. As such, they could revoke this exception at any time and then we're back to square one. |
Updates #22395 Change-Id: I6c207934b32d38374875f756c4f8c6dfe38d8cb0 Reviewed-on: https://go-review.googlesource.com/c/go/+/168318 Run-TryBot: Elias Naur <mail@eliasnaur.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
Add -fembed-bitcode to the host compiler and linker to instruct it to add bitcode to object files. Updates golang/go#22395 Change-Id: Ie0297079f27c9b5b8ea55e0a36067dc768342986 Reviewed-on: https://go-review.googlesource.com/c/mobile/+/168062 Run-TryBot: Elias Naur <mail@eliasnaur.com> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
@eliasnaur I'm curious what impact your whitelist change in b4f3b8a has? |
Very little; it allows the tvOS and watchOS flags in #cgo directives. I noticed the missing flags while working on this. |
Aha, okay. It was working for me already via the
Another idea would be to add some new flags to the go linker, so the user could do something like If we can settle on a good approach here, I'm happy to start putting together some CLs. Another thing to keep in mind is that the For reference, here are the two load command definitions: struct version_min_command {
uint32_t cmd; // LC_VERSION_MIN_MACOSX or
// LC_VERSION_MIN_IPHONEOS
uint32_t cmdsize; // sizeof(struct version_min_command)
uint32_t version; // X.Y.Z is encoded in nibbles xxxx.yy.zz
uint32_t sdk; // X.Y.Z is encoded in nibbles xxxx.yy.zz
};
struct build_tool_version {
uint32_t tool; // enum for the tool
uint32_t version; // version of the tool
};
struct build_version_command {
uint32_t cmd; // LC_BUILD_VERSION
uint32_t cmdsize; // sizeof(struct build_version_command) +
// ntools * sizeof(struct build_tool_version)
uint32_t platform; // platform
uint32_t minos; // X.Y.Z is encoded in nibbles xxxx.yy.zz
uint32_t sdk; // X.Y.Z is encoded in nibbles xxxx.yy.zz
uint32_t ntools; // number of tool entries following this
}; One advantage to the linker flag approach is that we could add more flags like |
Change https://golang.org/cl/168321 mentions this issue: |
Change https://golang.org/cl/168320 mentions this issue: |
You can check out my current progress at the two CLs posted above. I got LC_VERSION_MIN_* and LC_BUILD_VERSION copying to work, and only need tests. |
Updates golang#22395 Change-Id: I6c207934b32d38374875f756c4f8c6dfe38d8cb0 Reviewed-on: https://go-review.googlesource.com/c/go/+/168318 Run-TryBot: Elias Naur <mail@eliasnaur.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
Change https://golang.org/cl/168459 mentions this issue: |
We're going to need the ability to extract the LC_VERSION_MIN_* and LC_BUILD_VERSION load commands. This CL adds peekMachoPlatform to do that and in the process simplifies machoCombineDwarf. While here, disable DWARF combining for Apple platforms other than macOS (watchOS, tvOS, bridgeOS), not just iOS. Updates #22395 Change-Id: I4862b0f15ccc87b7be1a6532b4d37b47c8f7f243 Reviewed-on: https://go-review.googlesource.com/c/go/+/168459 Reviewed-by: Ian Lance Taylor <iant@golang.org>
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 golang#22395 (at least until Apple tightens bitcode requirements.) Change-Id: Ic1c1448c4d46222bb3dd097b1f4df80848051e5f Reviewed-on: https://go-review.googlesource.com/c/go/+/168320 Reviewed-by: Cherry Zhang <cherryyz@google.com> (cherry picked from commit ba96564)
We're going to need the ability to extract the LC_VERSION_MIN_* and LC_BUILD_VERSION load commands. This CL adds peekMachoPlatform to do that and in the process simplifies machoCombineDwarf. While here, disable DWARF combining for Apple platforms other than macOS (watchOS, tvOS, bridgeOS), not just iOS. Updates golang#22395 Change-Id: I4862b0f15ccc87b7be1a6532b4d37b47c8f7f243 Reviewed-on: https://go-review.googlesource.com/c/go/+/168459 Reviewed-by: Ian Lance Taylor <iant@golang.org> (cherry picked from commit 0fe1986)
To build for watchOS and tvOS the Apple toolchain requires a Mach-O load command that matches the platform for all object files in a build. The go.o object file produced by the Go linker contains no such command. The loader commands are mutually exclusive so we need to pick the right one. Fortunately, cgo must be enabled for watchOS and tvOS to be useful, so we can copy the first loader command we find in the object files produced by the host compiler. Add a test that builds a small program for tvOS to test both this CL and the previous CL that added bitcode support. Updates #22395 Change-Id: I7a47d19be9d80f0459dc358c600cddd9f236c444 Reviewed-on: https://go-review.googlesource.com/c/go/+/168321 TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
To build for watchOS and tvOS the Apple toolchain requires a Mach-O load command that matches the platform for all object files in a build. The go.o object file produced by the Go linker contains no such command. The loader commands are mutually exclusive so we need to pick the right one. Fortunately, cgo must be enabled for watchOS and tvOS to be useful, so we can copy the first loader command we find in the object files produced by the host compiler. Add a test that builds a small program for tvOS to test both this CL and the previous CL that added bitcode support. Updates golang#22395 Change-Id: I7a47d19be9d80f0459dc358c600cddd9f236c444 Reviewed-on: https://go-review.googlesource.com/c/go/+/168321 TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com> (cherry picked from commit 277609f)
How this should be used? Just update my gomobile package? I did so, but Xcode still fail and complains the framework is not bitcode enabled. |
go.o does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. for architecture arm64 |
You would need to compile golang from master and use that. |
aha, thanks! I though run |
I've been using the new golang patches on master for a few days and have been able to run my golang code in the simulator and on tvOS/iOS devices. (Note that I am still using Now I'm trying to submit an app to the store and running into some weird issues. When submitting to the App Store, I get an email saying processing was stopped:
I tried the debugging steps linked in the Tech Note to "rebuild from bitcode" in Xcode, and am getting a strange error about dSYMs missing in
I noticed this: So I tried again with I am now able to submit builds up to App Store:
|
I am able to successfully generate and use .framework file using gomobile bind command, however generated lib doesn't have bitcode enabled
Is there a way to enable bitcode in generated binary or are there are any plan to provide support in near future ?
Please answer these questions before submitting your issue. Thanks!
What version of Go are you using (
go version
)?go version go1.8.3 darwin/amd64
gomobile version +44a54e9
Does this issue reproduce with the latest release?
Yes
What operating system and processor architecture are you using (
go env
)?MacOS
What did you do?
Generated .framework lib from go source code using 'gomobile bind'
What did you expect to see?
bitcode should be enabled in generated framework
What did you see instead?
generated framework doesn't have bitcode enabled
The text was updated successfully, but these errors were encountered: