mirror of
https://github.com/golang/go
synced 2024-11-20 07:54:39 -07:00
debug/elf: Add support for getting DynTag string table values.
R=rsc CC=golang-dev https://golang.org/cl/6430064
This commit is contained in:
parent
f3a45d4695
commit
cf06750372
@ -726,6 +726,20 @@ func (f *File) gnuVersion(i int, sym *ImportedSymbol) {
|
||||
// referred to by the binary f that are expected to be
|
||||
// linked with the binary at dynamic link time.
|
||||
func (f *File) ImportedLibraries() ([]string, error) {
|
||||
return f.DynString(DT_NEEDED)
|
||||
}
|
||||
|
||||
// DynString returns the strings listed for the given tag in the file's dynamic
|
||||
// section.
|
||||
//
|
||||
// The tag must be one that takes string values: DT_NEEDED, DT_SONAME, DT_RPATH, or
|
||||
// DT_RUNPATH.
|
||||
func (f *File) DynString(tag DynTag) ([]string, error) {
|
||||
switch tag {
|
||||
case DT_NEEDED, DT_SONAME, DT_RPATH, DT_RUNPATH:
|
||||
default:
|
||||
return nil, fmt.Errorf("non-string-valued tag %v", tag)
|
||||
}
|
||||
ds := f.SectionByType(SHT_DYNAMIC)
|
||||
if ds == nil {
|
||||
// not dynamic, so no libraries
|
||||
@ -741,25 +755,24 @@ func (f *File) ImportedLibraries() ([]string, error) {
|
||||
}
|
||||
var all []string
|
||||
for len(d) > 0 {
|
||||
var tag DynTag
|
||||
var value uint64
|
||||
var t DynTag
|
||||
var v uint64
|
||||
switch f.Class {
|
||||
case ELFCLASS32:
|
||||
tag = DynTag(f.ByteOrder.Uint32(d[0:4]))
|
||||
value = uint64(f.ByteOrder.Uint32(d[4:8]))
|
||||
t = DynTag(f.ByteOrder.Uint32(d[0:4]))
|
||||
v = uint64(f.ByteOrder.Uint32(d[4:8]))
|
||||
d = d[8:]
|
||||
case ELFCLASS64:
|
||||
tag = DynTag(f.ByteOrder.Uint64(d[0:8]))
|
||||
value = f.ByteOrder.Uint64(d[8:16])
|
||||
t = DynTag(f.ByteOrder.Uint64(d[0:8]))
|
||||
v = f.ByteOrder.Uint64(d[8:16])
|
||||
d = d[16:]
|
||||
}
|
||||
if tag == DT_NEEDED {
|
||||
s, ok := getString(str, int(value))
|
||||
if t == tag {
|
||||
s, ok := getString(str, int(v))
|
||||
if ok {
|
||||
all = append(all, s)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return all, nil
|
||||
}
|
||||
|
@ -19,6 +19,7 @@ type fileTest struct {
|
||||
hdr FileHeader
|
||||
sections []SectionHeader
|
||||
progs []ProgHeader
|
||||
needed []string
|
||||
}
|
||||
|
||||
var fileTests = []fileTest{
|
||||
@ -64,6 +65,7 @@ var fileTests = []fileTest{
|
||||
{PT_LOAD, PF_R + PF_W, 0x5fc, 0x80495fc, 0x80495fc, 0xd8, 0xf8, 0x1000},
|
||||
{PT_DYNAMIC, PF_R + PF_W, 0x60c, 0x804960c, 0x804960c, 0x98, 0x98, 0x4},
|
||||
},
|
||||
[]string{"libc.so.6"},
|
||||
},
|
||||
{
|
||||
"testdata/gcc-amd64-linux-exec",
|
||||
@ -117,6 +119,7 @@ var fileTests = []fileTest{
|
||||
{PT_LOOS + 0x474E550, PF_R, 0x5b8, 0x4005b8, 0x4005b8, 0x24, 0x24, 0x4},
|
||||
{PT_LOOS + 0x474E551, PF_R + PF_W, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8},
|
||||
},
|
||||
[]string{"libc.so.6"},
|
||||
},
|
||||
}
|
||||
|
||||
@ -161,6 +164,14 @@ func TestOpen(t *testing.T) {
|
||||
if tn != fn {
|
||||
t.Errorf("open %s: len(Progs) = %d, want %d", tt.file, fn, tn)
|
||||
}
|
||||
tl := tt.needed
|
||||
fl, err := f.ImportedLibraries()
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
if !reflect.DeepEqual(tl, fl) {
|
||||
t.Errorf("open %s: DT_NEEDED = %v, want %v", tt.file, tl, fl)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user