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