You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

847 lines
14 KiB

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