]> Cypherpunks repositories - gostls13.git/commitdiff
debug/elf: Add support for getting DynTag string table values.
authorMike Rosset <mike.rosset@gmail.com>
Fri, 3 Aug 2012 18:46:20 +0000 (14:46 -0400)
committerRuss Cox <rsc@golang.org>
Fri, 3 Aug 2012 18:46:20 +0000 (14:46 -0400)
R=rsc
CC=golang-dev
https://golang.org/cl/6430064

src/pkg/debug/elf/file.go
src/pkg/debug/elf/file_test.go

index 241430e5c6534483fab5ef6724b283ec63447c0e..d38da4bf8e9125d56d0aff07b821a272da80aafd 100644 (file)
@@ -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
 }
index 6ec5f4f62cb7bf63d9a79a94c7ccbb3a042b45f3..12036e816b4bdc766f59c8a106558fc661739187 100644 (file)
@@ -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)
+               }
        }
 }