Commit cf067503 authored by Mike Rosset's avatar Mike Rosset Committed by Russ Cox

debug/elf: Add support for getting DynTag string table values.

R=rsc
CC=golang-dev
https://golang.org/cl/6430064
parent f3a45d46
...@@ -726,6 +726,20 @@ func (f *File) gnuVersion(i int, sym *ImportedSymbol) { ...@@ -726,6 +726,20 @@ func (f *File) gnuVersion(i int, sym *ImportedSymbol) {
// referred to by the binary f that are expected to be // referred to by the binary f that are expected to be
// linked with the binary at dynamic link time. // linked with the binary at dynamic link time.
func (f *File) ImportedLibraries() ([]string, error) { 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) ds := f.SectionByType(SHT_DYNAMIC)
if ds == nil { if ds == nil {
// not dynamic, so no libraries // not dynamic, so no libraries
...@@ -741,25 +755,24 @@ func (f *File) ImportedLibraries() ([]string, error) { ...@@ -741,25 +755,24 @@ func (f *File) ImportedLibraries() ([]string, error) {
} }
var all []string var all []string
for len(d) > 0 { for len(d) > 0 {
var tag DynTag var t DynTag
var value uint64 var v uint64
switch f.Class { switch f.Class {
case ELFCLASS32: case ELFCLASS32:
tag = DynTag(f.ByteOrder.Uint32(d[0:4])) t = DynTag(f.ByteOrder.Uint32(d[0:4]))
value = uint64(f.ByteOrder.Uint32(d[4:8])) v = uint64(f.ByteOrder.Uint32(d[4:8]))
d = d[8:] d = d[8:]
case ELFCLASS64: case ELFCLASS64:
tag = DynTag(f.ByteOrder.Uint64(d[0:8])) t = DynTag(f.ByteOrder.Uint64(d[0:8]))
value = f.ByteOrder.Uint64(d[8:16]) v = f.ByteOrder.Uint64(d[8:16])
d = d[16:] d = d[16:]
} }
if tag == DT_NEEDED { if t == tag {
s, ok := getString(str, int(value)) s, ok := getString(str, int(v))
if ok { if ok {
all = append(all, s) all = append(all, s)
} }
} }
} }
return all, nil return all, nil
} }
...@@ -19,6 +19,7 @@ type fileTest struct { ...@@ -19,6 +19,7 @@ type fileTest struct {
hdr FileHeader hdr FileHeader
sections []SectionHeader sections []SectionHeader
progs []ProgHeader progs []ProgHeader
needed []string
} }
var fileTests = []fileTest{ var fileTests = []fileTest{
...@@ -64,6 +65,7 @@ var fileTests = []fileTest{ ...@@ -64,6 +65,7 @@ var fileTests = []fileTest{
{PT_LOAD, PF_R + PF_W, 0x5fc, 0x80495fc, 0x80495fc, 0xd8, 0xf8, 0x1000}, {PT_LOAD, PF_R + PF_W, 0x5fc, 0x80495fc, 0x80495fc, 0xd8, 0xf8, 0x1000},
{PT_DYNAMIC, PF_R + PF_W, 0x60c, 0x804960c, 0x804960c, 0x98, 0x98, 0x4}, {PT_DYNAMIC, PF_R + PF_W, 0x60c, 0x804960c, 0x804960c, 0x98, 0x98, 0x4},
}, },
[]string{"libc.so.6"},
}, },
{ {
"testdata/gcc-amd64-linux-exec", "testdata/gcc-amd64-linux-exec",
...@@ -117,6 +119,7 @@ var fileTests = []fileTest{ ...@@ -117,6 +119,7 @@ var fileTests = []fileTest{
{PT_LOOS + 0x474E550, PF_R, 0x5b8, 0x4005b8, 0x4005b8, 0x24, 0x24, 0x4}, {PT_LOOS + 0x474E550, PF_R, 0x5b8, 0x4005b8, 0x4005b8, 0x24, 0x24, 0x4},
{PT_LOOS + 0x474E551, PF_R + PF_W, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8}, {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) { ...@@ -161,6 +164,14 @@ func TestOpen(t *testing.T) {
if tn != fn { if tn != fn {
t.Errorf("open %s: len(Progs) = %d, want %d", tt.file, fn, tn) 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)
}
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment