diff options
| author | Clément Chigot <clement.chigot@atos.net> | 2018-11-23 11:17:36 +0100 |
|---|---|---|
| committer | Ian Lance Taylor <iant@golang.org> | 2018-11-26 23:51:21 +0000 |
| commit | 3f9efe750058308bc499c5eb22bc84193fedb6b3 (patch) | |
| tree | ac7caccf0bf25ffbf00abba0e32db25bee45b8f0 /src/cmd/internal/objfile/xcoff.go | |
| parent | 9e849dcee4a7049325e483bddef27c22b19dd88b (diff) | |
| download | go-3f9efe750058308bc499c5eb22bc84193fedb6b3.tar.xz | |
cmd/link: fix XCOFF sections
XCOFF files can't have multiples text or data sections. The name
of each type section must be .text, .data and .bss.
This commit also updates cmd/internal/objfile/xcoff.go to retrieve Go
sections using runtime symbols.
Change-Id: Ib6315f19dad2d154a4531fc6508e7cbd8bc94743
Reviewed-on: https://go-review.googlesource.com/c/151037
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'src/cmd/internal/objfile/xcoff.go')
| -rw-r--r-- | src/cmd/internal/objfile/xcoff.go | 48 |
1 files changed, 40 insertions, 8 deletions
diff --git a/src/cmd/internal/objfile/xcoff.go b/src/cmd/internal/objfile/xcoff.go index c36b4362ba..f62a7edf89 100644 --- a/src/cmd/internal/objfile/xcoff.go +++ b/src/cmd/internal/objfile/xcoff.go @@ -91,15 +91,11 @@ func (f *xcoffFile) pcln() (textStart uint64, symtab, pclntab []byte, err error) if sect := f.xcoff.Section(".text"); sect != nil { textStart = sect.VirtualAddress } - if sect := f.xcoff.Section(".gosymtab"); sect != nil { - if symtab, err = sect.Data(); err != nil { - return 0, nil, nil, err - } + if pclntab, err = loadXCOFFTable(f.xcoff, "runtime.pclntab", "runtime.epclntab"); err != nil { + return 0, nil, nil, err } - if sect := f.xcoff.Section(".gopclntab"); sect != nil { - if pclntab, err = sect.Data(); err != nil { - return 0, nil, nil, err - } + if symtab, err = loadXCOFFTable(f.xcoff, "runtime.symtab", "runtime.esymtab"); err != nil { + return 0, nil, nil, err } return textStart, symtab, pclntab, nil } @@ -114,6 +110,42 @@ func (f *xcoffFile) text() (textStart uint64, text []byte, err error) { return } +func findXCOFFSymbol(f *xcoff.File, name string) (*xcoff.Symbol, error) { + for _, s := range f.Symbols { + if s.Name != name { + continue + } + if s.SectionNumber <= 0 { + return nil, fmt.Errorf("symbol %s: invalid section number %d", name, s.SectionNumber) + } + if len(f.Sections) < int(s.SectionNumber) { + return nil, fmt.Errorf("symbol %s: section number %d is larger than max %d", name, s.SectionNumber, len(f.Sections)) + } + return s, nil + } + return nil, fmt.Errorf("no %s symbol found", name) +} + +func loadXCOFFTable(f *xcoff.File, sname, ename string) ([]byte, error) { + ssym, err := findXCOFFSymbol(f, sname) + if err != nil { + return nil, err + } + esym, err := findXCOFFSymbol(f, ename) + if err != nil { + return nil, err + } + if ssym.SectionNumber != esym.SectionNumber { + return nil, fmt.Errorf("%s and %s symbols must be in the same section", sname, ename) + } + sect := f.Sections[ssym.SectionNumber-1] + data, err := sect.Data() + if err != nil { + return nil, err + } + return data[ssym.Value:esym.Value], nil +} + func (f *xcoffFile) goarch() string { switch f.xcoff.TargetMachine { case xcoff.U802TOCMAGIC: |
