| // 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, |
| Version: "GLIBC_2.2.5", |
| Library: "libc.so.6", |
| }, |
| Symbol{ |
| Name: "__libc_start_main", |
| Info: 0x12, |
| Other: 0x0, |
| Section: 0x0, |
| Value: 0x0, |
| Size: 0x1C2, |
| Version: "GLIBC_2.2.5", |
| Library: "libc.so.6", |
| }, |
| }, |
| "testdata/go-relocation-test-clang-x86.obj": {}, |
| "testdata/hello-world-core.gz": {}, |
| } |