]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: zero elf addr for debug sections
authorMeng Zhuo <mzh@golangcn.org>
Sat, 26 Mar 2022 06:44:09 +0000 (14:44 +0800)
committermzh <mzh@golangcn.org>
Wed, 30 Mar 2022 01:13:21 +0000 (01:13 +0000)
The Addr should be zero if SHF_ALLOC is not set.

Update #51939

Change-Id: I030f6243d05efabe6b9ebf558e9c0201f7922d23
Reviewed-on: https://go-review.googlesource.com/c/go/+/395919
Trust: mzh <mzh@golangcn.org>
Run-TryBot: mzh <mzh@golangcn.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Cherry Mui <cherryyz@google.com>
src/cmd/link/elf_test.go
src/cmd/link/internal/ld/elf.go

index 318bd76abae07c52346d35e5d81eb43b67dc8f48..5b7b95757b8c6e07558e709ea3a0e4f8cde63790 100644 (file)
@@ -469,3 +469,31 @@ func TestPIESize(t *testing.T) {
                })
        }
 }
+
+func TestIssue51939(t *testing.T) {
+       testenv.MustHaveGoBuild(t)
+       t.Parallel()
+       td := t.TempDir()
+       goFile := filepath.Join(td, "issue51939.go")
+       if err := os.WriteFile(goFile, []byte(goSource), 0444); err != nil {
+               t.Fatal(err)
+       }
+       outFile := filepath.Join(td, "issue51939.exe")
+       goTool := testenv.GoToolPath(t)
+       cmd := exec.Command(goTool, "build", "-o", outFile, goFile)
+       if out, err := cmd.CombinedOutput(); err != nil {
+               t.Logf("%s", out)
+               t.Fatal(err)
+       }
+
+       ef, err := elf.Open(outFile)
+       if err != nil {
+               t.Fatal(err)
+       }
+
+       for _, s := range ef.Sections {
+               if s.Flags&elf.SHF_ALLOC == 0 && s.Addr != 0 {
+                       t.Errorf("section %s should not allocated with addr %x", s.Name, s.Addr)
+               }
+       }
+}
index cb094a373a2447d367d6c27b775eb2afa946165e..08de21cab603cd0966466406ecad714b2a2c87b0 100644 (file)
@@ -1100,16 +1100,18 @@ func elfshbits(linkmode LinkMode, sect *sym.Section) *ElfShdr {
                sh.Flags |= uint64(elf.SHF_TLS)
                sh.Type = uint32(elf.SHT_NOBITS)
        }
+       if linkmode != LinkExternal {
+               sh.Addr = sect.Vaddr
+       }
+
        if strings.HasPrefix(sect.Name, ".debug") || strings.HasPrefix(sect.Name, ".zdebug") {
                sh.Flags = 0
+               sh.Addr = 0
                if sect.Compressed {
                        sh.Flags |= uint64(elf.SHF_COMPRESSED)
                }
        }
 
-       if linkmode != LinkExternal {
-               sh.Addr = sect.Vaddr
-       }
        sh.Addralign = uint64(sect.Align)
        sh.Size = sect.Length
        if sect.Name != ".tbss" {