mirror of
https://github.com/golang/go
synced 2024-10-04 18:31:22 -06:00
500547f28b
The immediate goal is to support the new object file format, which libmach (nm's support library) does not understand. Rather than add code to libmach or reengineer liblink to support this new use, just write it in Go. The C version of nm reads the Plan 9 symbol table stored in Go binaries, now otherwise unused. This reimplementation uses the standard symbol table for the corresponding file format instead, bringing us one step closer to removing the Plan 9 symbol table from Go binaries. Tell cmd/dist not to build cmd/nm anymore. Tell cmd/go to install cmd/nm in the tool directory. R=golang-dev, r, iant, alex.brainman CC=golang-dev https://golang.org/cl/40600043
55 lines
1.1 KiB
Go
55 lines
1.1 KiB
Go
// Copyright 2013 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// Parsing of ELF executables (Linux, FreeBSD, and so on).
|
|
|
|
package main
|
|
|
|
import (
|
|
"debug/elf"
|
|
"os"
|
|
)
|
|
|
|
func elfSymbols(f *os.File) []Sym {
|
|
p, err := elf.NewFile(f)
|
|
if err != nil {
|
|
errorf("parsing %s: %v", f.Name(), err)
|
|
return nil
|
|
}
|
|
|
|
elfSyms, err := p.Symbols()
|
|
if err != nil {
|
|
errorf("parsing %s: %v", f.Name(), err)
|
|
return nil
|
|
}
|
|
|
|
var syms []Sym
|
|
for _, s := range elfSyms {
|
|
sym := Sym{Addr: s.Value, Name: s.Name, Size: int64(s.Size), Code: '?'}
|
|
switch s.Section {
|
|
case elf.SHN_UNDEF:
|
|
sym.Code = 'U'
|
|
case elf.SHN_COMMON:
|
|
sym.Code = 'B'
|
|
default:
|
|
i := int(s.Section)
|
|
if i <= 0 || i > len(p.Sections) {
|
|
break
|
|
}
|
|
sect := p.Sections[i-1]
|
|
switch sect.Flags & (elf.SHF_WRITE | elf.SHF_ALLOC | elf.SHF_EXECINSTR) {
|
|
case elf.SHF_ALLOC | elf.SHF_EXECINSTR:
|
|
sym.Code = 'T'
|
|
case elf.SHF_ALLOC:
|
|
sym.Code = 'R'
|
|
case elf.SHF_ALLOC | elf.SHF_WRITE:
|
|
sym.Code = 'D'
|
|
}
|
|
}
|
|
syms = append(syms, sym)
|
|
}
|
|
|
|
return syms
|
|
}
|