// 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": {},
}