| ... | @@ -508,7 +508,6 @@ pub const Header = struct { | ... | @@ -508,7 +508,6 @@ pub const Header = struct { |
| 508 | }; | 508 | }; |
| 509 | } | 509 | } |
| 510 | | 510 | |
| 511 | <<<<<<< HEAD | | |
| 512 | pub const ReadError = std.io.Reader.Error || ParseError; | 511 | pub const ReadError = std.io.Reader.Error || ParseError; |
| 513 | | 512 | |
| 514 | pub fn read(r: *std.io.Reader) ReadError!Header { | 513 | pub fn read(r: *std.io.Reader) ReadError!Header { |
| ... | @@ -516,19 +515,6 @@ pub const Header = struct { | ... | @@ -516,19 +515,6 @@ pub const Header = struct { |
| 516 | const result = try parse(@ptrCast(buf)); | 515 | const result = try parse(@ptrCast(buf)); |
| 517 | r.toss(if (result.is_64) @sizeOf(Elf64_Ehdr) else @sizeOf(Elf32_Ehdr)); | 516 | r.toss(if (result.is_64) @sizeOf(Elf64_Ehdr) else @sizeOf(Elf32_Ehdr)); |
| 518 | return result; | 517 | return result; |
| 519 | ||||||| edf785db0f | | |
| 520 | pub fn read(parse_source: anytype) !Header { | | |
| 521 | var hdr_buf: [@sizeOf(Elf64_Ehdr)]u8 align(@alignOf(Elf64_Ehdr)) = undefined; | | |
| 522 | try parse_source.seekableStream().seekTo(0); | | |
| 523 | try parse_source.reader().readNoEof(&hdr_buf); | | |
| 524 | return Header.parse(&hdr_buf); | | |
| 525 | ======= | | |
| 526 | pub fn read(parse_source: anytype) !Header { | | |
| 527 | var hdr_buf: [@sizeOf(Elf64_Ehdr)]u8 align(@alignOf(Elf64_Ehdr)) = undefined; | | |
| 528 | try parse_source.seekableStream().seekTo(0); | | |
| 529 | try parse_source.deprecatedReader().readNoEof(&hdr_buf); | | |
| 530 | return Header.parse(&hdr_buf); | | |
| 531 | >>>>>>> origin/master | | |
| 532 | } | 518 | } |
| 533 | | 519 | |
| 534 | pub const ParseError = error{ | 520 | pub const ParseError = error{ |
| ... | @@ -604,92 +590,14 @@ pub const ProgramHeaderIterator = struct { | ... | @@ -604,92 +590,14 @@ pub const ProgramHeaderIterator = struct { |
| 604 | if (it.index >= it.elf_header.phnum) return null; | 590 | if (it.index >= it.elf_header.phnum) return null; |
| 605 | defer it.index += 1; | 591 | defer it.index += 1; |
| 606 | | 592 | |
| 607 | <<<<<<< HEAD | | |
| 608 | if (it.elf_header.is_64) { | 593 | if (it.elf_header.is_64) { |
| 609 | var phdr: Elf64_Phdr = undefined; | 594 | var phdr: Elf64_Phdr = undefined; |
| 610 | const offset = it.elf_header.phoff + @sizeOf(@TypeOf(phdr)) * it.index; | 595 | const offset = it.elf_header.phoff + @sizeOf(@TypeOf(phdr)) * it.index; |
| 611 | try it.file_reader.seekTo(offset); | 596 | try it.file_reader.seekTo(offset); |
| 612 | try it.file_reader.interface.readSlice(@ptrCast(&phdr)); | 597 | try it.file_reader.interface.readSlice(@ptrCast(&phdr)); |
| 613 | if (it.elf_header.endian != native_endian) | 598 | if (it.elf_header.endian != native_endian) |
| 614 | ||||||| edf785db0f | | |
| 615 | if (self.elf_header.is_64) { | | |
| 616 | var phdr: Elf64_Phdr = undefined; | | |
| 617 | const offset = self.elf_header.phoff + @sizeOf(@TypeOf(phdr)) * self.index; | | |
| 618 | try self.parse_source.seekableStream().seekTo(offset); | | |
| 619 | try self.parse_source.reader().readNoEof(mem.asBytes(&phdr)); | | |
| 620 | | | |
| 621 | // ELF endianness matches native endianness. | | |
| 622 | if (self.elf_header.endian == native_endian) return phdr; | | |
| 623 | | | |
| 624 | // Convert fields to native endianness. | | |
| 625 | ======= | | |
| 626 | if (self.elf_header.is_64) { | | |
| 627 | var phdr: Elf64_Phdr = undefined; | | |
| 628 | const offset = self.elf_header.phoff + @sizeOf(@TypeOf(phdr)) * self.index; | | |
| 629 | try self.parse_source.seekableStream().seekTo(offset); | | |
| 630 | try self.parse_source.deprecatedReader().readNoEof(mem.asBytes(&phdr)); | | |
| 631 | | | |
| 632 | // ELF endianness matches native endianness. | | |
| 633 | if (self.elf_header.endian == native_endian) return phdr; | | |
| 634 | | | |
| 635 | // Convert fields to native endianness. | | |
| 636 | >>>>>>> origin/master | | |
| 637 | mem.byteSwapAllFields(Elf64_Phdr, &phdr); | 599 | mem.byteSwapAllFields(Elf64_Phdr, &phdr); |
| 638 | <<<<<<< HEAD | | |
| 639 | return phdr; | 600 | return phdr; |
| 640 | ||||||| edf785db0f | | |
| 641 | return phdr; | | |
| 642 | } | | |
| 643 | | | |
| 644 | var phdr: Elf32_Phdr = undefined; | | |
| 645 | const offset = self.elf_header.phoff + @sizeOf(@TypeOf(phdr)) * self.index; | | |
| 646 | try self.parse_source.seekableStream().seekTo(offset); | | |
| 647 | try self.parse_source.reader().readNoEof(mem.asBytes(&phdr)); | | |
| 648 | | | |
| 649 | // ELF endianness does NOT match native endianness. | | |
| 650 | if (self.elf_header.endian != native_endian) { | | |
| 651 | // Convert fields to native endianness. | | |
| 652 | mem.byteSwapAllFields(Elf32_Phdr, &phdr); | | |
| 653 | } | | |
| 654 | | | |
| 655 | // Convert 32-bit header to 64-bit. | | |
| 656 | return Elf64_Phdr{ | | |
| 657 | .p_type = phdr.p_type, | | |
| 658 | .p_offset = phdr.p_offset, | | |
| 659 | .p_vaddr = phdr.p_vaddr, | | |
| 660 | .p_paddr = phdr.p_paddr, | | |
| 661 | .p_filesz = phdr.p_filesz, | | |
| 662 | .p_memsz = phdr.p_memsz, | | |
| 663 | .p_flags = phdr.p_flags, | | |
| 664 | .p_align = phdr.p_align, | | |
| 665 | }; | | |
| 666 | ======= | | |
| 667 | return phdr; | | |
| 668 | } | | |
| 669 | | | |
| 670 | var phdr: Elf32_Phdr = undefined; | | |
| 671 | const offset = self.elf_header.phoff + @sizeOf(@TypeOf(phdr)) * self.index; | | |
| 672 | try self.parse_source.seekableStream().seekTo(offset); | | |
| 673 | try self.parse_source.deprecatedReader().readNoEof(mem.asBytes(&phdr)); | | |
| 674 | | | |
| 675 | // ELF endianness does NOT match native endianness. | | |
| 676 | if (self.elf_header.endian != native_endian) { | | |
| 677 | // Convert fields to native endianness. | | |
| 678 | mem.byteSwapAllFields(Elf32_Phdr, &phdr); | | |
| 679 | } | | |
| 680 | | | |
| 681 | // Convert 32-bit header to 64-bit. | | |
| 682 | return Elf64_Phdr{ | | |
| 683 | .p_type = phdr.p_type, | | |
| 684 | .p_offset = phdr.p_offset, | | |
| 685 | .p_vaddr = phdr.p_vaddr, | | |
| 686 | .p_paddr = phdr.p_paddr, | | |
| 687 | .p_filesz = phdr.p_filesz, | | |
| 688 | .p_memsz = phdr.p_memsz, | | |
| 689 | .p_flags = phdr.p_flags, | | |
| 690 | .p_align = phdr.p_align, | | |
| 691 | }; | | |
| 692 | >>>>>>> origin/master | | |
| 693 | } | 601 | } |
| 694 | | 602 | |
| 695 | var phdr: Elf32_Phdr = undefined; | 603 | var phdr: Elf32_Phdr = undefined; |
| ... | @@ -716,23 +624,9 @@ pub const SectionHeaderIterator = struct { | ... | @@ -716,23 +624,9 @@ pub const SectionHeaderIterator = struct { |
| 716 | file_reader: *std.fs.File.Reader, | 624 | file_reader: *std.fs.File.Reader, |
| 717 | index: usize = 0, | 625 | index: usize = 0, |
| 718 | | 626 | |
| 719 | <<<<<<< HEAD | | |
| 720 | pub fn next(it: *SectionHeaderIterator) !?Elf64_Shdr { | 627 | pub fn next(it: *SectionHeaderIterator) !?Elf64_Shdr { |
| 721 | if (it.index >= it.elf_header.shnum) return null; | 628 | if (it.index >= it.elf_header.shnum) return null; |
| 722 | defer it.index += 1; | 629 | defer it.index += 1; |
| 723 | ||||||| edf785db0f | | |
| 724 | if (self.elf_header.is_64) { | | |
| 725 | var shdr: Elf64_Shdr = undefined; | | |
| 726 | const offset = self.elf_header.shoff + @sizeOf(@TypeOf(shdr)) * self.index; | | |
| 727 | try self.parse_source.seekableStream().seekTo(offset); | | |
| 728 | try self.parse_source.reader().readNoEof(mem.asBytes(&shdr)); | | |
| 729 | ======= | | |
| 730 | if (self.elf_header.is_64) { | | |
| 731 | var shdr: Elf64_Shdr = undefined; | | |
| 732 | const offset = self.elf_header.shoff + @sizeOf(@TypeOf(shdr)) * self.index; | | |
| 733 | try self.parse_source.seekableStream().seekTo(offset); | | |
| 734 | try self.parse_source.deprecatedReader().readNoEof(mem.asBytes(&shdr)); | | |
| 735 | >>>>>>> origin/master | | |
| 736 | | 630 | |
| 737 | if (it.elf_header.is_64) { | 631 | if (it.elf_header.is_64) { |
| 738 | var shdr: Elf64_Shdr = undefined; | 632 | var shdr: Elf64_Shdr = undefined; |
| ... | @@ -741,65 +635,7 @@ pub const SectionHeaderIterator = struct { | ... | @@ -741,65 +635,7 @@ pub const SectionHeaderIterator = struct { |
| 741 | try it.file_reader.interface.readSlice(@ptrCast(&shdr)); | 635 | try it.file_reader.interface.readSlice(@ptrCast(&shdr)); |
| 742 | if (it.elf_header.endian != native_endian) | 636 | if (it.elf_header.endian != native_endian) |
| 743 | mem.byteSwapAllFields(Elf64_Shdr, &shdr); | 637 | mem.byteSwapAllFields(Elf64_Shdr, &shdr); |
| 744 | <<<<<<< HEAD | | |
| 745 | return shdr; | 638 | return shdr; |
| 746 | ||||||| edf785db0f | | |
| 747 | return shdr; | | |
| 748 | } | | |
| 749 | | | |
| 750 | var shdr: Elf32_Shdr = undefined; | | |
| 751 | const offset = self.elf_header.shoff + @sizeOf(@TypeOf(shdr)) * self.index; | | |
| 752 | try self.parse_source.seekableStream().seekTo(offset); | | |
| 753 | try self.parse_source.reader().readNoEof(mem.asBytes(&shdr)); | | |
| 754 | | | |
| 755 | // ELF endianness does NOT match native endianness. | | |
| 756 | if (self.elf_header.endian != native_endian) { | | |
| 757 | // Convert fields to native endianness. | | |
| 758 | mem.byteSwapAllFields(Elf32_Shdr, &shdr); | | |
| 759 | } | | |
| 760 | | | |
| 761 | // Convert 32-bit header to 64-bit. | | |
| 762 | return Elf64_Shdr{ | | |
| 763 | .sh_name = shdr.sh_name, | | |
| 764 | .sh_type = shdr.sh_type, | | |
| 765 | .sh_flags = shdr.sh_flags, | | |
| 766 | .sh_addr = shdr.sh_addr, | | |
| 767 | .sh_offset = shdr.sh_offset, | | |
| 768 | .sh_size = shdr.sh_size, | | |
| 769 | .sh_link = shdr.sh_link, | | |
| 770 | .sh_info = shdr.sh_info, | | |
| 771 | .sh_addralign = shdr.sh_addralign, | | |
| 772 | .sh_entsize = shdr.sh_entsize, | | |
| 773 | }; | | |
| 774 | ======= | | |
| 775 | return shdr; | | |
| 776 | } | | |
| 777 | | | |
| 778 | var shdr: Elf32_Shdr = undefined; | | |
| 779 | const offset = self.elf_header.shoff + @sizeOf(@TypeOf(shdr)) * self.index; | | |
| 780 | try self.parse_source.seekableStream().seekTo(offset); | | |
| 781 | try self.parse_source.deprecatedReader().readNoEof(mem.asBytes(&shdr)); | | |
| 782 | | | |
| 783 | // ELF endianness does NOT match native endianness. | | |
| 784 | if (self.elf_header.endian != native_endian) { | | |
| 785 | // Convert fields to native endianness. | | |
| 786 | mem.byteSwapAllFields(Elf32_Shdr, &shdr); | | |
| 787 | } | | |
| 788 | | | |
| 789 | // Convert 32-bit header to 64-bit. | | |
| 790 | return Elf64_Shdr{ | | |
| 791 | .sh_name = shdr.sh_name, | | |
| 792 | .sh_type = shdr.sh_type, | | |
| 793 | .sh_flags = shdr.sh_flags, | | |
| 794 | .sh_addr = shdr.sh_addr, | | |
| 795 | .sh_offset = shdr.sh_offset, | | |
| 796 | .sh_size = shdr.sh_size, | | |
| 797 | .sh_link = shdr.sh_link, | | |
| 798 | .sh_info = shdr.sh_info, | | |
| 799 | .sh_addralign = shdr.sh_addralign, | | |
| 800 | .sh_entsize = shdr.sh_entsize, | | |
| 801 | }; | | |
| 802 | >>>>>>> origin/master | | |
| 803 | } | 639 | } |
| 804 | | 640 | |
| 805 | var shdr: Elf32_Shdr = undefined; | 641 | var shdr: Elf32_Shdr = undefined; |