Index: src/pkg/debug/elf/file.go |
=================================================================== |
--- a/src/pkg/debug/elf/file.go |
+++ b/src/pkg/debug/elf/file.go |
@@ -726,6 +726,20 @@ |
// 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 @@ |
} |
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 |
} |