1// Copyright 2014 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package elf
6
7import (
8	"io"
9	"path"
10	"reflect"
11	"testing"
12)
13
14// TODO: remove duplicate code
15func TestSymbols(t *testing.T) {
16	do := func(file string, ts []Symbol, getfunc func(*File) ([]Symbol, error)) {
17		var f *File
18		var err error
19		if path.Ext(file) == ".gz" {
20			var r io.ReaderAt
21			if r, err = decompress(file); err == nil {
22				f, err = NewFile(r)
23			}
24		} else {
25			f, err = Open(file)
26		}
27		if err != nil {
28			t.Errorf("TestSymbols: cannot open file %s: %v", file, err)
29			return
30		}
31		defer f.Close()
32		fs, err := getfunc(f)
33		if err != nil && err != ErrNoSymbols {
34			t.Error(err)
35			return
36		} else if err == ErrNoSymbols {
37			fs = []Symbol{}
38		}
39		if !reflect.DeepEqual(ts, fs) {
40			t.Errorf("%s: Symbols = %v, want %v", file, ts, fs)
41		}
42	}
43	for file, ts := range symbolsGolden {
44		do(file, ts, (*File).Symbols)
45	}
46	for file, ts := range dynamicSymbolsGolden {
47		do(file, ts, (*File).DynamicSymbols)
48	}
49}
50
51// golden symbol table data generated by testdata/getgoldsym.c
52
53var symbolsGolden = map[string][]Symbol{
54	"testdata/gcc-amd64-linux-exec": {
55		Symbol{
56			Name:    "",
57			Info:    0x3,
58			Other:   0x0,
59			Section: 0x1,
60			Value:   0x400200,
61			Size:    0x0,
62		},
63		Symbol{
64			Name:    "",
65			Info:    0x3,
66			Other:   0x0,
67			Section: 0x2,
68			Value:   0x40021C,
69			Size:    0x0,
70		},
71		Symbol{
72			Name:    "",
73			Info:    0x3,
74			Other:   0x0,
75			Section: 0x3,
76			Value:   0x400240,
77			Size:    0x0,
78		},
79		Symbol{
80			Name:    "",
81			Info:    0x3,
82			Other:   0x0,
83			Section: 0x4,
84			Value:   0x400268,
85			Size:    0x0,
86		},
87		Symbol{
88			Name:    "",
89			Info:    0x3,
90			Other:   0x0,
91			Section: 0x5,
92			Value:   0x400288,
93			Size:    0x0,
94		},
95		Symbol{
96			Name:    "",
97			Info:    0x3,
98			Other:   0x0,
99			Section: 0x6,
100			Value:   0x4002E8,
101			Size:    0x0,
102		},
103		Symbol{
104			Name:    "",
105			Info:    0x3,
106			Other:   0x0,
107			Section: 0x7,
108			Value:   0x400326,
109			Size:    0x0,
110		},
111		Symbol{
112			Name:    "",
113			Info:    0x3,
114			Other:   0x0,
115			Section: 0x8,
116			Value:   0x400330,
117			Size:    0x0,
118		},
119		Symbol{
120			Name:    "",
121			Info:    0x3,
122			Other:   0x0,
123			Section: 0x9,
124			Value:   0x400350,
125			Size:    0x0,
126		},
127		Symbol{
128			Name:    "",
129			Info:    0x3,
130			Other:   0x0,
131			Section: 0xA,
132			Value:   0x400368,
133			Size:    0x0,
134		},
135		Symbol{
136			Name:    "",
137			Info:    0x3,
138			Other:   0x0,
139			Section: 0xB,
140			Value:   0x400398,
141			Size:    0x0,
142		},
143		Symbol{
144			Name:    "",
145			Info:    0x3,
146			Other:   0x0,
147			Section: 0xC,
148			Value:   0x4003B0,
149			Size:    0x0,
150		},
151		Symbol{
152			Name:    "",
153			Info:    0x3,
154			Other:   0x0,
155			Section: 0xD,
156			Value:   0x4003E0,
157			Size:    0x0,
158		},
159		Symbol{
160			Name:    "",
161			Info:    0x3,
162			Other:   0x0,
163			Section: 0xE,
164			Value:   0x400594,
165			Size:    0x0,
166		},
167		Symbol{
168			Name:    "",
169			Info:    0x3,
170			Other:   0x0,
171			Section: 0xF,
172			Value:   0x4005A4,
173			Size:    0x0,
174		},
175		Symbol{
176			Name:    "",
177			Info:    0x3,
178			Other:   0x0,
179			Section: 0x10,
180			Value:   0x4005B8,
181			Size:    0x0,
182		},
183		Symbol{
184			Name:    "",
185			Info:    0x3,
186			Other:   0x0,
187			Section: 0x11,
188			Value:   0x4005E0,
189			Size:    0x0,
190		},
191		Symbol{
192			Name:    "",
193			Info:    0x3,
194			Other:   0x0,
195			Section: 0x12,
196			Value:   0x600688,
197			Size:    0x0,
198		},
199		Symbol{
200			Name:    "",
201			Info:    0x3,
202			Other:   0x0,
203			Section: 0x13,
204			Value:   0x600698,
205			Size:    0x0,
206		},
207		Symbol{
208			Name:    "",
209			Info:    0x3,
210			Other:   0x0,
211			Section: 0x14,
212			Value:   0x6006A8,
213			Size:    0x0,
214		},
215		Symbol{
216			Name:    "",
217			Info:    0x3,
218			Other:   0x0,
219			Section: 0x15,
220			Value:   0x6006B0,
221			Size:    0x0,
222		},
223		Symbol{
224			Name:    "",
225			Info:    0x3,
226			Other:   0x0,
227			Section: 0x16,
228			Value:   0x600850,
229			Size:    0x0,
230		},
231		Symbol{
232			Name:    "",
233			Info:    0x3,
234			Other:   0x0,
235			Section: 0x17,
236			Value:   0x600858,
237			Size:    0x0,
238		},
239		Symbol{
240			Name:    "",
241			Info:    0x3,
242			Other:   0x0,
243			Section: 0x18,
244			Value:   0x600880,
245			Size:    0x0,
246		},
247		Symbol{
248			Name:    "",
249			Info:    0x3,
250			Other:   0x0,
251			Section: 0x19,
252			Value:   0x600898,
253			Size:    0x0,
254		},
255		Symbol{
256			Name:    "",
257			Info:    0x3,
258			Other:   0x0,
259			Section: 0x1A,
260			Value:   0x0,
261			Size:    0x0,
262		},
263		Symbol{
264			Name:    "",
265			Info:    0x3,
266			Other:   0x0,
267			Section: 0x1B,
268			Value:   0x0,
269			Size:    0x0,
270		},
271		Symbol{
272			Name:    "",
273			Info:    0x3,
274			Other:   0x0,
275			Section: 0x1C,
276			Value:   0x0,
277			Size:    0x0,
278		},
279		Symbol{
280			Name:    "",
281			Info:    0x3,
282			Other:   0x0,
283			Section: 0x1D,
284			Value:   0x0,
285			Size:    0x0,
286		},
287		Symbol{
288			Name:    "",
289			Info:    0x3,
290			Other:   0x0,
291			Section: 0x1E,
292			Value:   0x0,
293			Size:    0x0,
294		},
295		Symbol{
296			Name:    "",
297			Info:    0x3,
298			Other:   0x0,
299			Section: 0x1F,
300			Value:   0x0,
301			Size:    0x0,
302		},
303		Symbol{
304			Name:    "",
305			Info:    0x3,
306			Other:   0x0,
307			Section: 0x20,
308			Value:   0x0,
309			Size:    0x0,
310		},
311		Symbol{
312			Name:    "",
313			Info:    0x3,
314			Other:   0x0,
315			Section: 0x21,
316			Value:   0x0,
317			Size:    0x0,
318		},
319		Symbol{
320			Name:    "init.c",
321			Info:    0x4,
322			Other:   0x0,
323			Section: 0xFFF1,
324			Value:   0x0,
325			Size:    0x0,
326		},
327		Symbol{
328			Name:    "initfini.c",
329			Info:    0x4,
330			Other:   0x0,
331			Section: 0xFFF1,
332			Value:   0x0,
333			Size:    0x0,
334		},
335		Symbol{
336			Name:    "call_gmon_start",
337			Info:    0x2,
338			Other:   0x0,
339			Section: 0xD,
340			Value:   0x40040C,
341			Size:    0x0,
342		},
343		Symbol{
344			Name:    "crtstuff.c",
345			Info:    0x4,
346			Other:   0x0,
347			Section: 0xFFF1,
348			Value:   0x0,
349			Size:    0x0,
350		},
351		Symbol{
352			Name:    "__CTOR_LIST__",
353			Info:    0x1,
354			Other:   0x0,
355			Section: 0x12,
356			Value:   0x600688,
357			Size:    0x0,
358		},
359		Symbol{
360			Name:    "__DTOR_LIST__",
361			Info:    0x1,
362			Other:   0x0,
363			Section: 0x13,
364			Value:   0x600698,
365			Size:    0x0,
366		},
367		Symbol{
368			Name:    "__JCR_LIST__",
369			Info:    0x1,
370			Other:   0x0,
371			Section: 0x14,
372			Value:   0x6006A8,
373			Size:    0x0,
374		},
375		Symbol{
376			Name:    "__do_global_dtors_aux",
377			Info:    0x2,
378			Other:   0x0,
379			Section: 0xD,
380			Value:   0x400430,
381			Size:    0x0,
382		},
383		Symbol{
384			Name:    "completed.6183",
385			Info:    0x1,
386			Other:   0x0,
387			Section: 0x19,
388			Value:   0x600898,
389			Size:    0x1,
390		},
391		Symbol{
392			Name:    "p.6181",
393			Info:    0x1,
394			Other:   0x0,
395			Section: 0x18,
396			Value:   0x600890,
397			Size:    0x0,
398		},
399		Symbol{
400			Name:    "frame_dummy",
401			Info:    0x2,
402			Other:   0x0,
403			Section: 0xD,
404			Value:   0x400470,
405			Size:    0x0,
406		},
407		Symbol{
408			Name:    "crtstuff.c",
409			Info:    0x4,
410			Other:   0x0,
411			Section: 0xFFF1,
412			Value:   0x0,
413			Size:    0x0,
414		},
415		Symbol{
416			Name:    "__CTOR_END__",
417			Info:    0x1,
418			Other:   0x0,
419			Section: 0x12,
420			Value:   0x600690,
421			Size:    0x0,
422		},
423		Symbol{
424			Name:    "__DTOR_END__",
425			Info:    0x1,
426			Other:   0x0,
427			Section: 0x13,
428			Value:   0x6006A0,
429			Size:    0x0,
430		},
431		Symbol{
432			Name:    "__FRAME_END__",
433			Info:    0x1,
434			Other:   0x0,
435			Section: 0x11,
436			Value:   0x400680,
437			Size:    0x0,
438		},
439		Symbol{
440			Name:    "__JCR_END__",
441			Info:    0x1,
442			Other:   0x0,
443			Section: 0x14,
444			Value:   0x6006A8,
445			Size:    0x0,
446		},
447		Symbol{
448			Name:    "__do_global_ctors_aux",
449			Info:    0x2,
450			Other:   0x0,
451			Section: 0xD,
452			Value:   0x400560,
453			Size:    0x0,
454		},
455		Symbol{
456			Name:    "initfini.c",
457			Info:    0x4,
458			Other:   0x0,
459			Section: 0xFFF1,
460			Value:   0x0,
461			Size:    0x0,
462		},
463		Symbol{
464			Name:    "hello.c",
465			Info:    0x4,
466			Other:   0x0,
467			Section: 0xFFF1,
468			Value:   0x0,
469			Size:    0x0,
470		},
471		Symbol{
472			Name:    "_GLOBAL_OFFSET_TABLE_",
473			Info:    0x1,
474			Other:   0x2,
475			Section: 0x17,
476			Value:   0x600858,
477			Size:    0x0,
478		},
479		Symbol{
480			Name:    "__init_array_end",
481			Info:    0x0,
482			Other:   0x2,
483			Section: 0x12,
484			Value:   0x600684,
485			Size:    0x0,
486		},
487		Symbol{
488			Name:    "__init_array_start",
489			Info:    0x0,
490			Other:   0x2,
491			Section: 0x12,
492			Value:   0x600684,
493			Size:    0x0,
494		},
495		Symbol{
496			Name:    "_DYNAMIC",
497			Info:    0x1,
498			Other:   0x2,
499			Section: 0x15,
500			Value:   0x6006B0,
501			Size:    0x0,
502		},
503		Symbol{
504			Name:    "data_start",
505			Info:    0x20,
506			Other:   0x0,
507			Section: 0x18,
508			Value:   0x600880,
509			Size:    0x0,
510		},
511		Symbol{
512			Name:    "__libc_csu_fini",
513			Info:    0x12,
514			Other:   0x0,
515			Section: 0xD,
516			Value:   0x4004C0,
517			Size:    0x2,
518		},
519		Symbol{
520			Name:    "_start",
521			Info:    0x12,
522			Other:   0x0,
523			Section: 0xD,
524			Value:   0x4003E0,
525			Size:    0x0,
526		},
527		Symbol{
528			Name:    "__gmon_start__",
529			Info:    0x20,
530			Other:   0x0,
531			Section: 0x0,
532			Value:   0x0,
533			Size:    0x0,
534		},
535		Symbol{
536			Name:    "_Jv_RegisterClasses",
537			Info:    0x20,
538			Other:   0x0,
539			Section: 0x0,
540			Value:   0x0,
541			Size:    0x0,
542		},
543		Symbol{
544			Name:    "puts@@GLIBC_2.2.5",
545			Info:    0x12,
546			Other:   0x0,
547			Section: 0x0,
548			Value:   0x0,
549			Size:    0x18C,
550		},
551		Symbol{
552			Name:    "_fini",
553			Info:    0x12,
554			Other:   0x0,
555			Section: 0xE,
556			Value:   0x400594,
557			Size:    0x0,
558		},
559		Symbol{
560			Name:    "__libc_start_main@@GLIBC_2.2.5",
561			Info:    0x12,
562			Other:   0x0,
563			Section: 0x0,
564			Value:   0x0,
565			Size:    0x1C2,
566		},
567		Symbol{
568			Name:    "_IO_stdin_used",
569			Info:    0x11,
570			Other:   0x0,
571			Section: 0xF,
572			Value:   0x4005A4,
573			Size:    0x4,
574		},
575		Symbol{
576			Name:    "__data_start",
577			Info:    0x10,
578			Other:   0x0,
579			Section: 0x18,
580			Value:   0x600880,
581			Size:    0x0,
582		},
583		Symbol{
584			Name:    "__dso_handle",
585			Info:    0x11,
586			Other:   0x2,
587			Section: 0x18,
588			Value:   0x600888,
589			Size:    0x0,
590		},
591		Symbol{
592			Name:    "__libc_csu_init",
593			Info:    0x12,
594			Other:   0x0,
595			Section: 0xD,
596			Value:   0x4004D0,
597			Size:    0x89,
598		},
599		Symbol{
600			Name:    "__bss_start",
601			Info:    0x10,
602			Other:   0x0,
603			Section: 0xFFF1,
604			Value:   0x600898,
605			Size:    0x0,
606		},
607		Symbol{
608			Name:    "_end",
609			Info:    0x10,
610			Other:   0x0,
611			Section: 0xFFF1,
612			Value:   0x6008A0,
613			Size:    0x0,
614		},
615		Symbol{
616			Name:    "_edata",
617			Info:    0x10,
618			Other:   0x0,
619			Section: 0xFFF1,
620			Value:   0x600898,
621			Size:    0x0,
622		},
623		Symbol{
624			Name:    "main",
625			Info:    0x12,
626			Other:   0x0,
627			Section: 0xD,
628			Value:   0x400498,
629			Size:    0x1B,
630		},
631		Symbol{
632			Name:    "_init",
633			Info:    0x12,
634			Other:   0x0,
635			Section: 0xB,
636			Value:   0x400398,
637			Size:    0x0,
638		},
639	},
640	"testdata/go-relocation-test-clang-x86.obj": {
641		Symbol{
642			Name:    "go-relocation-test-clang.c",
643			Info:    0x4,
644			Other:   0x0,
645			Section: 0xFFF1,
646			Value:   0x0,
647			Size:    0x0,
648		},
649		Symbol{
650			Name:    ".Linfo_string0",
651			Info:    0x0,
652			Other:   0x0,
653			Section: 0xC,
654			Value:   0x0,
655			Size:    0x0,
656		},
657		Symbol{
658			Name:    ".Linfo_string1",
659			Info:    0x0,
660			Other:   0x0,
661			Section: 0xC,
662			Value:   0x2C,
663			Size:    0x0,
664		},
665		Symbol{
666			Name:    ".Linfo_string2",
667			Info:    0x0,
668			Other:   0x0,
669			Section: 0xC,
670			Value:   0x47,
671			Size:    0x0,
672		},
673		Symbol{
674			Name:    ".Linfo_string3",
675			Info:    0x0,
676			Other:   0x0,
677			Section: 0xC,
678			Value:   0x4C,
679			Size:    0x0,
680		},
681		Symbol{
682			Name:    ".Linfo_string4",
683			Info:    0x0,
684			Other:   0x0,
685			Section: 0xC,
686			Value:   0x4E,
687			Size:    0x0,
688		},
689		Symbol{
690			Name:    "",
691			Info:    0x3,
692			Other:   0x0,
693			Section: 0x1,
694			Value:   0x0,
695			Size:    0x0,
696		},
697		Symbol{
698			Name:    "",
699			Info:    0x3,
700			Other:   0x0,
701			Section: 0x2,
702			Value:   0x0,
703			Size:    0x0,
704		},
705		Symbol{
706			Name:    "",
707			Info:    0x3,
708			Other:   0x0,
709			Section: 0x3,
710			Value:   0x0,
711			Size:    0x0,
712		},
713		Symbol{
714			Name:    "",
715			Info:    0x3,
716			Other:   0x0,
717			Section: 0x4,
718			Value:   0x0,
719			Size:    0x0,
720		},
721		Symbol{
722			Name:    "",
723			Info:    0x3,
724			Other:   0x0,
725			Section: 0x6,
726			Value:   0x0,
727			Size:    0x0,
728		},
729		Symbol{
730			Name:    "",
731			Info:    0x3,
732			Other:   0x0,
733			Section: 0x7,
734			Value:   0x0,
735			Size:    0x0,
736		},
737		Symbol{
738			Name:    "",
739			Info:    0x3,
740			Other:   0x0,
741			Section: 0x8,
742			Value:   0x0,
743			Size:    0x0,
744		},
745		Symbol{
746			Name:    "",
747			Info:    0x3,
748			Other:   0x0,
749			Section: 0xA,
750			Value:   0x0,
751			Size:    0x0,
752		},
753		Symbol{
754			Name:    "",
755			Info:    0x3,
756			Other:   0x0,
757			Section: 0xC,
758			Value:   0x0,
759			Size:    0x0,
760		},
761		Symbol{
762			Name:    "",
763			Info:    0x3,
764			Other:   0x0,
765			Section: 0xD,
766			Value:   0x0,
767			Size:    0x0,
768		},
769		Symbol{
770			Name:    "",
771			Info:    0x3,
772			Other:   0x0,
773			Section: 0xE,
774			Value:   0x0,
775			Size:    0x0,
776		},
777		Symbol{
778			Name:    "",
779			Info:    0x3,
780			Other:   0x0,
781			Section: 0xF,
782			Value:   0x0,
783			Size:    0x0,
784		},
785		Symbol{
786			Name:    "",
787			Info:    0x3,
788			Other:   0x0,
789			Section: 0x10,
790			Value:   0x0,
791			Size:    0x0,
792		},
793		Symbol{
794			Name:    "v",
795			Info:    0x11,
796			Other:   0x0,
797			Section: 0xFFF2,
798			Value:   0x4,
799			Size:    0x4,
800		},
801	},
802	"testdata/hello-world-core.gz": {},
803}
804
805var dynamicSymbolsGolden = map[string][]Symbol{
806	"testdata/gcc-amd64-linux-exec": {
807		Symbol{
808			Name:    "__gmon_start__",
809			Info:    0x20,
810			Other:   0x0,
811			Section: 0x0,
812			Value:   0x0,
813			Size:    0x0,
814		},
815		Symbol{
816			Name:    "puts",
817			Info:    0x12,
818			Other:   0x0,
819			Section: 0x0,
820			Value:   0x0,
821			Size:    0x18C,
822			Version: "GLIBC_2.2.5",
823			Library: "libc.so.6",
824		},
825		Symbol{
826			Name:    "__libc_start_main",
827			Info:    0x12,
828			Other:   0x0,
829			Section: 0x0,
830			Value:   0x0,
831			Size:    0x1C2,
832			Version: "GLIBC_2.2.5",
833			Library: "libc.so.6",
834		},
835	},
836	"testdata/go-relocation-test-clang-x86.obj": {},
837	"testdata/hello-world-core.gz":              {},
838}
839