cmd/go, go/internal/gccgoimporter: pass -X to ar on AIX

Change-Id: I21c3591f41be619d6f02fad6c5f0a5a22802cdbf
Reviewed-on: https://go-review.googlesource.com/72930
Reviewed-by: Ian Lance Taylor <iant@golang.org>
diff --git a/libgo/go/cmd/go/internal/work/build.go b/libgo/go/cmd/go/internal/work/build.go
index 562730b..75f3c1a 100644
--- a/libgo/go/cmd/go/internal/work/build.go
+++ b/libgo/go/cmd/go/internal/work/build.go
@@ -2757,7 +2757,14 @@
 	absAfile := mkAbs(objDir, afile)
 	// Try with D modifier first, then without if that fails.
 	if b.run(p.Dir, p.ImportPath, nil, "ar", "rcD", absAfile, absOfiles) != nil {
-		return b.run(p.Dir, p.ImportPath, nil, "ar", "rc", absAfile, absOfiles)
+		if cfg.Goos == "aix" && cfg.Goarch == "ppc64" {
+			// AIX puts both 32-bit and 64-bit objects in the same archive.
+			// Tell the AIX "ar" command to only care about 64-bit objects.
+			// AIX "ar" command does not know D option.
+			return b.run(p.Dir, p.ImportPath, nil, "ar", "-X64", "rc", absAfile, absOfiles)
+		} else {
+			return b.run(p.Dir, p.ImportPath, nil, "ar", "rc", absAfile, absOfiles)
+		}
 	}
 	return nil
 }
diff --git a/libgo/go/go/internal/gccgoimporter/importer.go b/libgo/go/go/internal/gccgoimporter/importer.go
index ee573ff..923f368 100644
--- a/libgo/go/go/internal/gccgoimporter/importer.go
+++ b/libgo/go/go/internal/gccgoimporter/importer.go
@@ -104,12 +104,14 @@
 		// TODO(pcc): Read the archive directly instead of using "ar".
 		f.Close()
 		closer = nil
+		var cmd *exec.Cmd
 
-		cmd := exec.Command("ar", "p", fpath)
 		if runtime.GOOS == "aix" && runtime.GOARCH == "ppc64" {
 			// AIX puts both 32-bit and 64-bit objects in the same archive.
 			// Tell the AIX "ar" command to only care about 64-bit objects.
-			cmd.Env = append(os.Environ(), "OBJECT_MODE=64")
+			cmd = exec.Command("ar", "-X64", "p", fpath)
+		} else {
+			cmd = exec.Command("ar", "p", fpath)
 		}
 		var out []byte
 		out, err = cmd.Output()