]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/cgo: remove -fsanitize=hwaddress hardware tags
authorIan Lance Taylor <iant@golang.org>
Fri, 10 Jun 2022 23:49:51 +0000 (16:49 -0700)
committerGopher Robot <gobot@golang.org>
Mon, 13 Jun 2022 19:09:14 +0000 (19:09 +0000)
No test because this isn't support on any of the builders.

Fixes #53285

Change-Id: If8d17bdcdac81a6ce404a35a289bf83f07f02855
Reviewed-on: https://go-review.googlesource.com/c/go/+/411698
Auto-Submit: Ian Lance Taylor <iant@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Run-TryBot: Ian Lance Taylor <iant@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>

src/cmd/cgo/gcc.go

index 8ce5d4de737ef71230ec13b6a5af828b3fc27575..4dff5e2b1c7abaea94dc27068d97b3c128170cd8 100644 (file)
@@ -1831,6 +1831,23 @@ func (p *Package) gccDebug(stdin []byte, nnames int) (d *dwarf.Data, ints []int6
                bo := f.ByteOrder
                symtab, err := f.Symbols()
                if err == nil {
+                       // Check for use of -fsanitize=hwaddress (issue 53285).
+                       removeTag := func(v uint64) uint64 { return v }
+                       if goarch == "arm64" {
+                               for i := range symtab {
+                                       if symtab[i].Name == "__hwasan_init" {
+                                               // -fsanitize=hwaddress on ARM
+                                               // uses the upper byte of a
+                                               // memory address as a hardware
+                                               // tag. Remove it so that
+                                               // we can find the associated
+                                               // data.
+                                               removeTag = func(v uint64) uint64 { return v &^ (0xff << (64 - 8)) }
+                                               break
+                                       }
+                               }
+                       }
+
                        for i := range symtab {
                                s := &symtab[i]
                                switch {
@@ -1838,9 +1855,10 @@ func (p *Package) gccDebug(stdin []byte, nnames int) (d *dwarf.Data, ints []int6
                                        // Found it. Now find data section.
                                        if i := int(s.Section); 0 <= i && i < len(f.Sections) {
                                                sect := f.Sections[i]
-                                               if sect.Addr <= s.Value && s.Value < sect.Addr+sect.Size {
+                                               val := removeTag(s.Value)
+                                               if sect.Addr <= val && val < sect.Addr+sect.Size {
                                                        if sdat, err := sect.Data(); err == nil {
-                                                               data := sdat[s.Value-sect.Addr:]
+                                                               data := sdat[val-sect.Addr:]
                                                                ints = make([]int64, len(data)/8)
                                                                for i := range ints {
                                                                        ints[i] = int64(bo.Uint64(data[i*8:]))
@@ -1852,9 +1870,10 @@ func (p *Package) gccDebug(stdin []byte, nnames int) (d *dwarf.Data, ints []int6
                                        // Found it. Now find data section.
                                        if i := int(s.Section); 0 <= i && i < len(f.Sections) {
                                                sect := f.Sections[i]
-                                               if sect.Addr <= s.Value && s.Value < sect.Addr+sect.Size {
+                                               val := removeTag(s.Value)
+                                               if sect.Addr <= val && val < sect.Addr+sect.Size {
                                                        if sdat, err := sect.Data(); err == nil {
-                                                               data := sdat[s.Value-sect.Addr:]
+                                                               data := sdat[val-sect.Addr:]
                                                                floats = make([]float64, len(data)/8)
                                                                for i := range floats {
                                                                        floats[i] = math.Float64frombits(bo.Uint64(data[i*8:]))
@@ -1867,9 +1886,10 @@ func (p *Package) gccDebug(stdin []byte, nnames int) (d *dwarf.Data, ints []int6
                                                // Found it. Now find data section.
                                                if i := int(s.Section); 0 <= i && i < len(f.Sections) {
                                                        sect := f.Sections[i]
-                                                       if sect.Addr <= s.Value && s.Value < sect.Addr+sect.Size {
+                                                       val := removeTag(s.Value)
+                                                       if sect.Addr <= val && val < sect.Addr+sect.Size {
                                                                if sdat, err := sect.Data(); err == nil {
-                                                                       data := sdat[s.Value-sect.Addr:]
+                                                                       data := sdat[val-sect.Addr:]
                                                                        strdata[n] = string(data)
                                                                }
                                                        }
@@ -1880,9 +1900,10 @@ func (p *Package) gccDebug(stdin []byte, nnames int) (d *dwarf.Data, ints []int6
                                                // Found it. Now find data section.
                                                if i := int(s.Section); 0 <= i && i < len(f.Sections) {
                                                        sect := f.Sections[i]
-                                                       if sect.Addr <= s.Value && s.Value < sect.Addr+sect.Size {
+                                                       val := removeTag(s.Value)
+                                                       if sect.Addr <= val && val < sect.Addr+sect.Size {
                                                                if sdat, err := sect.Data(); err == nil {
-                                                                       data := sdat[s.Value-sect.Addr:]
+                                                                       data := sdat[val-sect.Addr:]
                                                                        strlen := bo.Uint64(data[:8])
                                                                        if strlen > (1<<(uint(p.IntSize*8)-1) - 1) { // greater than MaxInt?
                                                                                fatalf("string literal too big")