commit | 69262d48717771cedb1da86563eb3f1b094b4e92 | [log] [tgz] |
---|---|---|
author | Austin Clements <austin@google.com> | Sun Apr 11 15:44:25 2021 -0400 |
committer | Austin Clements <austin@google.com> | Tue Apr 13 20:07:47 2021 +0000 |
tree | 9f5a1720a907b8b18ed796b28e68f716011bc293 | |
parent | 48531da9e706a9f3cf5e08319202e97022fb6813 [diff] |
cmd/compile,cmd/link: resolve cgo symbols to the correct Go ABI Currently, Go functions exported to cgo have some confusion around ABIs that leads to crashes. The cmd/cgo-generated C code references an exported Go wrapper function (which calls the underlying exported user function). The linker resolves this reference to the ABI0 entry-point to that Go wrapper function because all host object references are currently assumed to be to version 0 of a symbol. This gets passed via crosscall2 and winds its way to cgocallbackg1, which puts this ABI0 entry-point into a function value and calls it. Unfortunately, function values always use the ABIInternal calling convention, so calling this ABI0 entry-point goes poorly. Fix this by threading definition ABIs through the cgo export mechanism so the linker can resolve host object references (which have no concept of multiple ABIs) to the correct Go symbol. This involves a few pieces: - The compiler extends the cgo_export_{static,dynamic} directives that get passed on to the linker with symbol definition ABIs. - The linker parses the ABIs in the cgo_export_{static,dynamic} directives to look up the right symbol to apply export attributes to and put in the dynexp list. - For internal linking, the linker's Loader structure tracks the right symbol (in particular the right ABI) to resolve host object references to, and we use this in all of the host object loaders. - For external linking, we mangle only the non-ABIInternal symbols now, so the external linker is able to resolve the correct reference from host objects to Go symbols. Updates #40724. Change-Id: I70a0b1610596768c3f473745fa1a3e630afbf1a8 Reviewed-on: https://go-review.googlesource.com/c/go/+/309341 Trust: Austin Clements <austin@google.com> Run-TryBot: Austin Clements <austin@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com> Reviewed-by: Than McIntosh <thanm@google.com>
Go is an open source programming language that makes it easy to build simple, reliable, and efficient software.
Gopher image by Renee French, licensed under Creative Commons 3.0 Attributions license.
Our canonical Git repository is located at https://go.googlesource.com/go. There is a mirror of the repository at https://github.com/golang/go.
Unless otherwise noted, the Go source files are distributed under the BSD-style license found in the LICENSE file.
Official binary distributions are available at https://golang.org/dl/.
After downloading a binary release, visit https://golang.org/doc/install for installation instructions.
If a binary distribution is not available for your combination of operating system and architecture, visit https://golang.org/doc/install/source for source installation instructions.
Go is the work of thousands of contributors. We appreciate your help!
To contribute, please read the contribution guidelines at https://golang.org/doc/contribute.html.
Note that the Go project uses the issue tracker for bug reports and proposals only. See https://golang.org/wiki/Questions for a list of places to ask questions about the Go language.