...
Run Format

Source file src/debug/elf/symbols_test.go

Documentation: debug/elf

  // Copyright 2014 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.
  
  package elf
  
  import (
  	"io"
  	"path"
  	"reflect"
  	"testing"
  )
  
  // TODO: remove duplicate code
  func TestSymbols(t *testing.T) {
  	do := func(file string, ts []Symbol, getfunc func(*File) ([]Symbol, error)) {
  		var f *File
  		var err error
  		if path.Ext(file) == ".gz" {
  			var r io.ReaderAt
  			if r, err = decompress(file); err == nil {
  				f, err = NewFile(r)
  			}
  		} else {
  			f, err = Open(file)
  		}
  		if err != nil {
  			t.Errorf("TestSymbols: cannot open file %s: %v", file, err)
  			return
  		}
  		defer f.Close()
  		fs, err := getfunc(f)
  		if err != nil && err != ErrNoSymbols {
  			t.Error(err)
  			return
  		} else if err == ErrNoSymbols {
  			fs = []Symbol{}
  		}
  		if !reflect.DeepEqual(ts, fs) {
  			t.Errorf("%s: Symbols = %v, want %v", file, ts, fs)
  		}
  	}
  	for file, ts := range symbolsGolden {
  		do(file, ts, (*File).Symbols)
  	}
  	for file, ts := range dynamicSymbolsGolden {
  		do(file, ts, (*File).DynamicSymbols)
  	}
  }
  
  // golden symbol table data generated by testdata/getgoldsym.c
  
  var symbolsGolden = map[string][]Symbol{
  	"testdata/gcc-amd64-linux-exec": {
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x1,
  			Value:   0x400200,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x2,
  			Value:   0x40021C,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x3,
  			Value:   0x400240,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x4,
  			Value:   0x400268,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x5,
  			Value:   0x400288,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x6,
  			Value:   0x4002E8,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x7,
  			Value:   0x400326,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x8,
  			Value:   0x400330,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x9,
  			Value:   0x400350,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0xA,
  			Value:   0x400368,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0xB,
  			Value:   0x400398,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0xC,
  			Value:   0x4003B0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0xD,
  			Value:   0x4003E0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0xE,
  			Value:   0x400594,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0xF,
  			Value:   0x4005A4,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x10,
  			Value:   0x4005B8,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x11,
  			Value:   0x4005E0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x12,
  			Value:   0x600688,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x13,
  			Value:   0x600698,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x14,
  			Value:   0x6006A8,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x15,
  			Value:   0x6006B0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x16,
  			Value:   0x600850,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x17,
  			Value:   0x600858,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x18,
  			Value:   0x600880,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x19,
  			Value:   0x600898,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x1A,
  			Value:   0x0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x1B,
  			Value:   0x0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x1C,
  			Value:   0x0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x1D,
  			Value:   0x0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x1E,
  			Value:   0x0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x1F,
  			Value:   0x0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x20,
  			Value:   0x0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x21,
  			Value:   0x0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "init.c",
  			Info:    0x4,
  			Other:   0x0,
  			Section: 0xFFF1,
  			Value:   0x0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "initfini.c",
  			Info:    0x4,
  			Other:   0x0,
  			Section: 0xFFF1,
  			Value:   0x0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "call_gmon_start",
  			Info:    0x2,
  			Other:   0x0,
  			Section: 0xD,
  			Value:   0x40040C,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "crtstuff.c",
  			Info:    0x4,
  			Other:   0x0,
  			Section: 0xFFF1,
  			Value:   0x0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "__CTOR_LIST__",
  			Info:    0x1,
  			Other:   0x0,
  			Section: 0x12,
  			Value:   0x600688,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "__DTOR_LIST__",
  			Info:    0x1,
  			Other:   0x0,
  			Section: 0x13,
  			Value:   0x600698,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "__JCR_LIST__",
  			Info:    0x1,
  			Other:   0x0,
  			Section: 0x14,
  			Value:   0x6006A8,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "__do_global_dtors_aux",
  			Info:    0x2,
  			Other:   0x0,
  			Section: 0xD,
  			Value:   0x400430,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "completed.6183",
  			Info:    0x1,
  			Other:   0x0,
  			Section: 0x19,
  			Value:   0x600898,
  			Size:    0x1,
  		},
  		Symbol{
  			Name:    "p.6181",
  			Info:    0x1,
  			Other:   0x0,
  			Section: 0x18,
  			Value:   0x600890,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "frame_dummy",
  			Info:    0x2,
  			Other:   0x0,
  			Section: 0xD,
  			Value:   0x400470,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "crtstuff.c",
  			Info:    0x4,
  			Other:   0x0,
  			Section: 0xFFF1,
  			Value:   0x0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "__CTOR_END__",
  			Info:    0x1,
  			Other:   0x0,
  			Section: 0x12,
  			Value:   0x600690,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "__DTOR_END__",
  			Info:    0x1,
  			Other:   0x0,
  			Section: 0x13,
  			Value:   0x6006A0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "__FRAME_END__",
  			Info:    0x1,
  			Other:   0x0,
  			Section: 0x11,
  			Value:   0x400680,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "__JCR_END__",
  			Info:    0x1,
  			Other:   0x0,
  			Section: 0x14,
  			Value:   0x6006A8,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "__do_global_ctors_aux",
  			Info:    0x2,
  			Other:   0x0,
  			Section: 0xD,
  			Value:   0x400560,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "initfini.c",
  			Info:    0x4,
  			Other:   0x0,
  			Section: 0xFFF1,
  			Value:   0x0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "hello.c",
  			Info:    0x4,
  			Other:   0x0,
  			Section: 0xFFF1,
  			Value:   0x0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "_GLOBAL_OFFSET_TABLE_",
  			Info:    0x1,
  			Other:   0x2,
  			Section: 0x17,
  			Value:   0x600858,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "__init_array_end",
  			Info:    0x0,
  			Other:   0x2,
  			Section: 0x12,
  			Value:   0x600684,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "__init_array_start",
  			Info:    0x0,
  			Other:   0x2,
  			Section: 0x12,
  			Value:   0x600684,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "_DYNAMIC",
  			Info:    0x1,
  			Other:   0x2,
  			Section: 0x15,
  			Value:   0x6006B0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "data_start",
  			Info:    0x20,
  			Other:   0x0,
  			Section: 0x18,
  			Value:   0x600880,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "__libc_csu_fini",
  			Info:    0x12,
  			Other:   0x0,
  			Section: 0xD,
  			Value:   0x4004C0,
  			Size:    0x2,
  		},
  		Symbol{
  			Name:    "_start",
  			Info:    0x12,
  			Other:   0x0,
  			Section: 0xD,
  			Value:   0x4003E0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "__gmon_start__",
  			Info:    0x20,
  			Other:   0x0,
  			Section: 0x0,
  			Value:   0x0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "_Jv_RegisterClasses",
  			Info:    0x20,
  			Other:   0x0,
  			Section: 0x0,
  			Value:   0x0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "puts@@GLIBC_2.2.5",
  			Info:    0x12,
  			Other:   0x0,
  			Section: 0x0,
  			Value:   0x0,
  			Size:    0x18C,
  		},
  		Symbol{
  			Name:    "_fini",
  			Info:    0x12,
  			Other:   0x0,
  			Section: 0xE,
  			Value:   0x400594,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "__libc_start_main@@GLIBC_2.2.5",
  			Info:    0x12,
  			Other:   0x0,
  			Section: 0x0,
  			Value:   0x0,
  			Size:    0x1C2,
  		},
  		Symbol{
  			Name:    "_IO_stdin_used",
  			Info:    0x11,
  			Other:   0x0,
  			Section: 0xF,
  			Value:   0x4005A4,
  			Size:    0x4,
  		},
  		Symbol{
  			Name:    "__data_start",
  			Info:    0x10,
  			Other:   0x0,
  			Section: 0x18,
  			Value:   0x600880,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "__dso_handle",
  			Info:    0x11,
  			Other:   0x2,
  			Section: 0x18,
  			Value:   0x600888,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "__libc_csu_init",
  			Info:    0x12,
  			Other:   0x0,
  			Section: 0xD,
  			Value:   0x4004D0,
  			Size:    0x89,
  		},
  		Symbol{
  			Name:    "__bss_start",
  			Info:    0x10,
  			Other:   0x0,
  			Section: 0xFFF1,
  			Value:   0x600898,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "_end",
  			Info:    0x10,
  			Other:   0x0,
  			Section: 0xFFF1,
  			Value:   0x6008A0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "_edata",
  			Info:    0x10,
  			Other:   0x0,
  			Section: 0xFFF1,
  			Value:   0x600898,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "main",
  			Info:    0x12,
  			Other:   0x0,
  			Section: 0xD,
  			Value:   0x400498,
  			Size:    0x1B,
  		},
  		Symbol{
  			Name:    "_init",
  			Info:    0x12,
  			Other:   0x0,
  			Section: 0xB,
  			Value:   0x400398,
  			Size:    0x0,
  		},
  	},
  	"testdata/go-relocation-test-clang-x86.obj": {
  		Symbol{
  			Name:    "go-relocation-test-clang.c",
  			Info:    0x4,
  			Other:   0x0,
  			Section: 0xFFF1,
  			Value:   0x0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    ".Linfo_string0",
  			Info:    0x0,
  			Other:   0x0,
  			Section: 0xC,
  			Value:   0x0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    ".Linfo_string1",
  			Info:    0x0,
  			Other:   0x0,
  			Section: 0xC,
  			Value:   0x2C,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    ".Linfo_string2",
  			Info:    0x0,
  			Other:   0x0,
  			Section: 0xC,
  			Value:   0x47,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    ".Linfo_string3",
  			Info:    0x0,
  			Other:   0x0,
  			Section: 0xC,
  			Value:   0x4C,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    ".Linfo_string4",
  			Info:    0x0,
  			Other:   0x0,
  			Section: 0xC,
  			Value:   0x4E,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x1,
  			Value:   0x0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x2,
  			Value:   0x0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x3,
  			Value:   0x0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x4,
  			Value:   0x0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x6,
  			Value:   0x0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x7,
  			Value:   0x0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x8,
  			Value:   0x0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0xA,
  			Value:   0x0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0xC,
  			Value:   0x0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0xD,
  			Value:   0x0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0xE,
  			Value:   0x0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0xF,
  			Value:   0x0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "",
  			Info:    0x3,
  			Other:   0x0,
  			Section: 0x10,
  			Value:   0x0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "v",
  			Info:    0x11,
  			Other:   0x0,
  			Section: 0xFFF2,
  			Value:   0x4,
  			Size:    0x4,
  		},
  	},
  	"testdata/hello-world-core.gz": {},
  }
  
  var dynamicSymbolsGolden = map[string][]Symbol{
  	"testdata/gcc-amd64-linux-exec": {
  		Symbol{
  			Name:    "__gmon_start__",
  			Info:    0x20,
  			Other:   0x0,
  			Section: 0x0,
  			Value:   0x0,
  			Size:    0x0,
  		},
  		Symbol{
  			Name:    "puts",
  			Info:    0x12,
  			Other:   0x0,
  			Section: 0x0,
  			Value:   0x0,
  			Size:    0x18C,
  		},
  		Symbol{
  			Name:    "__libc_start_main",
  			Info:    0x12,
  			Other:   0x0,
  			Section: 0x0,
  			Value:   0x0,
  			Size:    0x1C2,
  		},
  	},
  	"testdata/go-relocation-test-clang-x86.obj": {},
  	"testdata/hello-world-core.gz":              {},
  }
  

View as plain text