]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/cgo: disable clang's integrated assembler
authorDave Cheney <dave@cheney.net>
Mon, 20 Oct 2014 23:28:39 +0000 (23:28 +0000)
committerDave Cheney <dave@cheney.net>
Mon, 20 Oct 2014 23:28:39 +0000 (23:28 +0000)
Fixes #8348.

Clang's internal assembler (introduced by default in clang 3.4) understands the .arch directive, but doesn't change the default value of -march. This causes the build to fail when we use BLX (armv5 and above) when clang is compiled for the default armv4t architecture (which appears to be the default on all the distros I've used).

This is probably a clang bug, so work around it for the time being by disabling the integrated assembler when compiling the cgo assembly shim.

This CL also includes a small change to ldelf.c which was required as clang 3.4 and above generate more weird symtab entries.

LGTM=iant
R=golang-codereviews, iant
CC=golang-codereviews
https://golang.org/cl/156430044

src/cmd/cgo/gcc.go
src/cmd/ld/ldelf.c

index d77d56c22abc8c3b4a1b59259e0dbc5ba59ec996..e45839e8a4640d00eec1a06f53f139379bca5903 100644 (file)
@@ -745,7 +745,13 @@ func (p *Package) gccMachine() []string {
        case "386":
                return []string{"-m32"}
        case "arm":
-               return []string{"-marm"} // not thumb
+               args := []string{"-marm"} // not thumb
+               if strings.Contains(p.gccBaseCmd()[0], "clang") {
+                       // The clang integrated assembler understands the .arch directive
+                       // but does not appear to honor it, so disable it. Issue 8348.
+                       args = append(args, "-no-integrated-as")
+               }
+               return args
        }
        return nil
 }
index 35f8b49856ba23d8d7f32a2270366dff971ec791..b5d0819493f2a5ffcc89e6bfc2fcffff6aa8c81f 100644 (file)
@@ -819,7 +819,7 @@ readsym(ElfObj *obj, int i, ElfSym *sym, int needSym)
                        }
                        break;
                case ElfSymBindLocal:
-                       if(!(thechar == '5' && (strcmp(sym->name, "$a") == 0 || strcmp(sym->name, "$d") == 0))) // binutils for arm generate these mapping symbols, ignore these
+                       if(!(thechar == '5' && (strncmp(sym->name, "$a", 2) == 0 || strncmp(sym->name, "$d", 2) == 0))) // binutils for arm generate these mapping symbols, ignore these
                                if(needSym) {
                                        // local names and hidden visiblity global names are unique
                                        // and should only reference by its index, not name, so we