diff --git a/misc/ios/go_darwin_arm_exec.go b/misc/ios/go_darwin_arm_exec.go index 4406c9aa4f..46e3fcbc43 100644 --- a/misc/ios/go_darwin_arm_exec.go +++ b/misc/ios/go_darwin_arm_exec.go @@ -147,22 +147,22 @@ func run(bin string, args []string) (err error) { return err } + pkgpath, err := copyLocalData(appdir) + if err != nil { + return err + } + entitlementsPath := filepath.Join(tmpdir, "Entitlements.plist") if err := ioutil.WriteFile(entitlementsPath, []byte(entitlementsPlist()), 0744); err != nil { return err } - if err := ioutil.WriteFile(filepath.Join(appdir, "Info.plist"), []byte(infoPlist()), 0744); err != nil { + if err := ioutil.WriteFile(filepath.Join(appdir, "Info.plist"), []byte(infoPlist(pkgpath)), 0744); err != nil { return err } if err := ioutil.WriteFile(filepath.Join(appdir, "ResourceRules.plist"), []byte(resourceRules), 0744); err != nil { return err } - pkgpath, err := copyLocalData(appdir) - if err != nil { - return err - } - cmd := exec.Command( "codesign", "-f", @@ -244,20 +244,9 @@ func run(bin string, args []string) (err error) { return nil } - s.do(`breakpoint set -n getwd`) // in runtime/cgo/gcc_darwin_arm.go - started = true - s.doCmd("run", "stop reason = breakpoint", 20*time.Second) - - // Move the current working directory into the faux gopath. - if pkgpath != "src" { - s.do(`breakpoint delete 1`) - s.do(`expr char* $mem = (char*)malloc(512)`) - s.do(`expr $mem = (char*)getwd($mem, 512)`) - s.do(`expr $mem = (char*)strcat($mem, "/` + pkgpath + `")`) - s.do(`call (void)chdir($mem)`) - } + s.doCmd("run", "stop reason = signal SIGINT", 20*time.Second) startTestsLen := s.out.Len() fmt.Fprintln(s.in, `process continue`) @@ -579,7 +568,7 @@ func subdir() (pkgpath string, underGoRoot bool, err error) { ) } -func infoPlist() string { +func infoPlist(pkgpath string) string { return ` @@ -592,6 +581,7 @@ func infoPlist() string { CFBundleResourceSpecificationResourceRules.plist LSRequiresIPhoneOS CFBundleDisplayNamegotest +GoExecWrapperWorkingDirectory` + pkgpath + ` ` diff --git a/src/runtime/cgo/gcc_darwin_arm.c b/src/runtime/cgo/gcc_darwin_arm.c index b3f8046011..3e1574f66d 100644 --- a/src/runtime/cgo/gcc_darwin_arm.c +++ b/src/runtime/cgo/gcc_darwin_arm.c @@ -107,30 +107,40 @@ init_working_dir() return; } CFStringRef url_str_ref = CFURLGetString(url_ref); - char url[MAXPATHLEN]; - if (!CFStringGetCString(url_str_ref, url, sizeof(url), kCFStringEncodingUTF8)) { + char buf[MAXPATHLEN]; + if (!CFStringGetCString(url_str_ref, buf, sizeof(buf), kCFStringEncodingUTF8)) { fprintf(stderr, "runtime/cgo: cannot get URL string\n"); return; } // url is of the form "file:///path/to/Info.plist". // strip it down to the working directory "/path/to". - int url_len = strlen(url); + int url_len = strlen(buf); if (url_len < sizeof("file://")+sizeof("/Info.plist")) { - fprintf(stderr, "runtime/cgo: bad URL: %s\n", url); + fprintf(stderr, "runtime/cgo: bad URL: %s\n", buf); return; } - url[url_len-sizeof("/Info.plist")+1] = 0; - char *dir = &url[0] + sizeof("file://")-1; + buf[url_len-sizeof("/Info.plist")+1] = 0; + char *dir = &buf[0] + sizeof("file://")-1; if (chdir(dir) != 0) { fprintf(stderr, "runtime/cgo: chdir(%s) failed\n", dir); } - // No-op to set a breakpoint on, immediately after the real chdir. - // Gives the test harness in go_darwin_arm_exec (which uses lldb) a - // chance to move the working directory. - getwd(dir); + // The test harness in go_darwin_arm_exec passes the relative working directory + // in the GoExecWrapperWorkingDirectory property of the app bundle. + CFStringRef wd_ref = CFBundleGetValueForInfoDictionaryKey(bundle, CFSTR("GoExecWrapperWorkingDirectory")); + if (wd_ref != NULL) { + if (!CFStringGetCString(wd_ref, buf, sizeof(buf), kCFStringEncodingUTF8)) { + fprintf(stderr, "runtime/cgo: cannot get GoExecWrapperWorkingDirectory string\n"); + return; + } + if (chdir(buf) != 0) { + fprintf(stderr, "runtime/cgo: chdir(%s) failed\n", buf); + } + // Notify the test harness that we're correctly set up + raise(SIGINT); + } } void diff --git a/src/runtime/cgo/gcc_darwin_arm64.c b/src/runtime/cgo/gcc_darwin_arm64.c index 039dcc02bd..05b0121d0f 100644 --- a/src/runtime/cgo/gcc_darwin_arm64.c +++ b/src/runtime/cgo/gcc_darwin_arm64.c @@ -109,30 +109,40 @@ init_working_dir() return; } CFStringRef url_str_ref = CFURLGetString(url_ref); - char url[MAXPATHLEN]; - if (!CFStringGetCString(url_str_ref, url, sizeof(url), kCFStringEncodingUTF8)) { + char buf[MAXPATHLEN]; + if (!CFStringGetCString(url_str_ref, buf, sizeof(buf), kCFStringEncodingUTF8)) { fprintf(stderr, "runtime/cgo: cannot get URL string\n"); return; } // url is of the form "file:///path/to/Info.plist". // strip it down to the working directory "/path/to". - int url_len = strlen(url); + int url_len = strlen(buf); if (url_len < sizeof("file://")+sizeof("/Info.plist")) { - fprintf(stderr, "runtime/cgo: bad URL: %s\n", url); + fprintf(stderr, "runtime/cgo: bad URL: %s\n", buf); return; } - url[url_len-sizeof("/Info.plist")+1] = 0; - char *dir = &url[0] + sizeof("file://")-1; + buf[url_len-sizeof("/Info.plist")+1] = 0; + char *dir = &buf[0] + sizeof("file://")-1; if (chdir(dir) != 0) { fprintf(stderr, "runtime/cgo: chdir(%s) failed\n", dir); } - // No-op to set a breakpoint on, immediately after the real chdir. - // Gives the test harness in go_darwin_arm_exec (which uses lldb) a - // chance to move the working directory. - getwd(dir); + // The test harness in go_darwin_arm_exec passes the relative working directory + // in the GoExecWrapperWorkingDirectory property of the app bundle. + CFStringRef wd_ref = CFBundleGetValueForInfoDictionaryKey(bundle, CFSTR("GoExecWrapperWorkingDirectory")); + if (wd_ref != NULL) { + if (!CFStringGetCString(wd_ref, buf, sizeof(buf), kCFStringEncodingUTF8)) { + fprintf(stderr, "runtime/cgo: cannot get GoExecWrapperWorkingDirectory string\n"); + return; + } + if (chdir(buf) != 0) { + fprintf(stderr, "runtime/cgo: chdir(%s) failed\n", buf); + } + // Notify the test harness that we're correctly set up + raise(SIGINT); + } } void