mirror of
https://github.com/golang/go
synced 2024-10-02 22:25:08 +00:00
cmd/link: use path from "cc --print-prog-name ar" for c-archive buildmode
[This is a roll-forward of CL 479775, which had to be rolled back due to bad interactions with the wrappers used by the ios-arm64-corellium builder. ios-arm64-corellium is no longer being maintained AFAICT, meaning that it should be ok to move ahead with this patch again]. When external linking with -buildmode=c-archive, the Go linker eventually invokes the "ar" tool to create the final archive library. Prior to this patch, if the '-extar' flag was not in use, we would just run "ar". This works well in most cases but breaks down if we're doing cross-compilation targeting Windows (macos system "ar" apparently doesn't create the windows symdef section correctly). To fix the problem, capture the output of "cc --print-prog-name ar" and invoke "ar" using the path returned by that command. Fixes #59221. Change-Id: Ie367541b23641266a6f48ac68adf971501bff9fb Reviewed-on: https://go-review.googlesource.com/c/go/+/592375 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Cherry Mui <cherryyz@google.com>
This commit is contained in:
parent
a2026cf0d9
commit
7bfc82429c
|
@ -1367,7 +1367,12 @@ func (ctxt *Link) archive() {
|
|||
exitIfErrors()
|
||||
|
||||
if *flagExtar == "" {
|
||||
const printProgName = "--print-prog-name=ar"
|
||||
cc := ctxt.extld()
|
||||
*flagExtar = "ar"
|
||||
if linkerFlagSupported(ctxt.Arch, cc[0], "", printProgName) {
|
||||
*flagExtar = ctxt.findExtLinkTool("ar")
|
||||
}
|
||||
}
|
||||
|
||||
mayberemoveoutfile()
|
||||
|
@ -1997,22 +2002,8 @@ func (ctxt *Link) hostlink() {
|
|||
uuidUpdated := false
|
||||
if combineDwarf {
|
||||
// Find "dsymutils" and "strip" tools using CC --print-prog-name.
|
||||
var cc []string
|
||||
cc = append(cc, ctxt.extld()...)
|
||||
cc = append(cc, hostlinkArchArgs(ctxt.Arch)...)
|
||||
cc = append(cc, "--print-prog-name", "dsymutil")
|
||||
out, err := exec.Command(cc[0], cc[1:]...).CombinedOutput()
|
||||
if err != nil {
|
||||
Exitf("%s: finding dsymutil failed: %v\n%s", os.Args[0], err, out)
|
||||
}
|
||||
dsymutilCmd := strings.TrimSuffix(string(out), "\n")
|
||||
|
||||
cc[len(cc)-1] = "strip"
|
||||
out, err = exec.Command(cc[0], cc[1:]...).CombinedOutput()
|
||||
if err != nil {
|
||||
Exitf("%s: finding strip failed: %v\n%s", os.Args[0], err, out)
|
||||
}
|
||||
stripCmd := strings.TrimSuffix(string(out), "\n")
|
||||
dsymutilCmd := ctxt.findExtLinkTool("dsymutil")
|
||||
stripCmd := ctxt.findExtLinkTool("strip")
|
||||
|
||||
dsym := filepath.Join(*flagTmpdir, "go.dwarf")
|
||||
cmd := exec.Command(dsymutilCmd, "-f", *flagOutfile, "-o", dsym)
|
||||
|
@ -2913,3 +2904,19 @@ func captureHostObj(h *Hostobj) {
|
|||
fmt.Fprintf(os.Stderr, "link: info: captured host object %s to %s\n",
|
||||
h.file, opath)
|
||||
}
|
||||
|
||||
// findExtLinkTool invokes the external linker CC with --print-prog-name
|
||||
// passing the name of the tool we're interested in, such as "strip",
|
||||
// "ar", or "dsymutil", and returns the path passed back from the command.
|
||||
func (ctxt *Link) findExtLinkTool(toolname string) string {
|
||||
var cc []string
|
||||
cc = append(cc, ctxt.extld()...)
|
||||
cc = append(cc, hostlinkArchArgs(ctxt.Arch)...)
|
||||
cc = append(cc, "--print-prog-name", toolname)
|
||||
out, err := exec.Command(cc[0], cc[1:]...).CombinedOutput()
|
||||
if err != nil {
|
||||
Exitf("%s: finding %s failed: %v\n%s", os.Args[0], toolname, err, out)
|
||||
}
|
||||
cmdpath := strings.TrimSuffix(string(out), "\n")
|
||||
return cmdpath
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue