Rev 5191 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 5191 | Rev 6324 | ||
---|---|---|---|
Line 696... | Line 696... | ||
696 | unsigned char cl; |
696 | unsigned char cl; |
697 | size_t ehdr_size; |
697 | size_t ehdr_size; |
698 | unsigned char buf[sizeof (Elf64_External_Ehdr)]; |
698 | unsigned char buf[sizeof (Elf64_External_Ehdr)]; |
699 | simple_object_write_section *section; |
699 | simple_object_write_section *section; |
700 | unsigned int shnum; |
700 | unsigned int shnum; |
- | 701 | unsigned int shstrndx; |
|
Line 701... | Line 702... | ||
701 | 702 | ||
702 | fns = attrs->type_functions; |
703 | fns = attrs->type_functions; |
Line 703... | Line 704... | ||
703 | cl = attrs->ei_class; |
704 | cl = attrs->ei_class; |
Line 741... | Line 742... | ||
741 | /* e_phnum left as zero. */ |
742 | /* e_phnum left as zero. */ |
742 | ELF_SET_FIELD (fns, cl, Ehdr, buf, e_shentsize, Elf_Half, |
743 | ELF_SET_FIELD (fns, cl, Ehdr, buf, e_shentsize, Elf_Half, |
743 | (cl == ELFCLASS32 |
744 | (cl == ELFCLASS32 |
744 | ? sizeof (Elf32_External_Shdr) |
745 | ? sizeof (Elf32_External_Shdr) |
745 | : sizeof (Elf64_External_Shdr))); |
746 | : sizeof (Elf64_External_Shdr))); |
746 | ELF_SET_FIELD (fns, cl, Ehdr, buf, e_shnum, Elf_Half, shnum); |
747 | ELF_SET_FIELD (fns, cl, Ehdr, buf, e_shnum, Elf_Half, |
747 | ELF_SET_FIELD (fns, cl, Ehdr, buf, e_shstrndx, Elf_Half, |
748 | shnum >= SHN_LORESERVE ? 0 : shnum); |
- | 749 | if (shnum == 0) |
|
- | 750 | shstrndx = 0; |
|
- | 751 | else |
|
- | 752 | { |
|
748 | shnum == 0 ? 0 : shnum - 1); |
753 | shstrndx = shnum - 1; |
- | 754 | if (shstrndx >= SHN_LORESERVE) |
|
- | 755 | shstrndx = SHN_XINDEX; |
|
- | 756 | } |
|
- | 757 | ELF_SET_FIELD (fns, cl, Ehdr, buf, e_shstrndx, Elf_Half, shstrndx); |
|
Line 749... | Line 758... | ||
749 | 758 | ||
750 | return simple_object_internal_write (descriptor, 0, buf, ehdr_size, |
759 | return simple_object_internal_write (descriptor, 0, buf, ehdr_size, |
751 | errmsg, err); |
760 | errmsg, err); |
Line 756... | Line 765... | ||
756 | static int |
765 | static int |
757 | simple_object_elf_write_shdr (simple_object_write *sobj, int descriptor, |
766 | simple_object_elf_write_shdr (simple_object_write *sobj, int descriptor, |
758 | off_t offset, unsigned int sh_name, |
767 | off_t offset, unsigned int sh_name, |
759 | unsigned int sh_type, unsigned int sh_flags, |
768 | unsigned int sh_type, unsigned int sh_flags, |
760 | unsigned int sh_offset, unsigned int sh_size, |
769 | unsigned int sh_offset, unsigned int sh_size, |
761 | unsigned int sh_addralign, const char **errmsg, |
770 | unsigned int sh_link, unsigned int sh_addralign, |
762 | int *err) |
771 | const char **errmsg, int *err) |
763 | { |
772 | { |
764 | struct simple_object_elf_attributes *attrs = |
773 | struct simple_object_elf_attributes *attrs = |
765 | (struct simple_object_elf_attributes *) sobj->data; |
774 | (struct simple_object_elf_attributes *) sobj->data; |
766 | const struct elf_type_functions* fns; |
775 | const struct elf_type_functions* fns; |
767 | unsigned char cl; |
776 | unsigned char cl; |
Line 779... | Line 788... | ||
779 | ELF_SET_FIELD (fns, cl, Shdr, buf, sh_name, Elf_Word, sh_name); |
788 | ELF_SET_FIELD (fns, cl, Shdr, buf, sh_name, Elf_Word, sh_name); |
780 | ELF_SET_FIELD (fns, cl, Shdr, buf, sh_type, Elf_Word, sh_type); |
789 | ELF_SET_FIELD (fns, cl, Shdr, buf, sh_type, Elf_Word, sh_type); |
781 | ELF_SET_FIELD (fns, cl, Shdr, buf, sh_flags, Elf_Addr, sh_flags); |
790 | ELF_SET_FIELD (fns, cl, Shdr, buf, sh_flags, Elf_Addr, sh_flags); |
782 | ELF_SET_FIELD (fns, cl, Shdr, buf, sh_offset, Elf_Addr, sh_offset); |
791 | ELF_SET_FIELD (fns, cl, Shdr, buf, sh_offset, Elf_Addr, sh_offset); |
783 | ELF_SET_FIELD (fns, cl, Shdr, buf, sh_size, Elf_Addr, sh_size); |
792 | ELF_SET_FIELD (fns, cl, Shdr, buf, sh_size, Elf_Addr, sh_size); |
784 | /* sh_link left as zero. */ |
793 | ELF_SET_FIELD (fns, cl, Shdr, buf, sh_link, Elf_Word, sh_link); |
785 | /* sh_info left as zero. */ |
794 | /* sh_info left as zero. */ |
786 | ELF_SET_FIELD (fns, cl, Shdr, buf, sh_addralign, Elf_Addr, sh_addralign); |
795 | ELF_SET_FIELD (fns, cl, Shdr, buf, sh_addralign, Elf_Addr, sh_addralign); |
787 | /* sh_entsize left as zero. */ |
796 | /* sh_entsize left as zero. */ |
Line 788... | Line 797... | ||
788 | 797 | ||
Line 810... | Line 819... | ||
810 | const char *errmsg; |
819 | const char *errmsg; |
811 | simple_object_write_section *section; |
820 | simple_object_write_section *section; |
812 | unsigned int shnum; |
821 | unsigned int shnum; |
813 | size_t shdr_offset; |
822 | size_t shdr_offset; |
814 | size_t sh_offset; |
823 | size_t sh_offset; |
- | 824 | unsigned int first_sh_size; |
|
- | 825 | unsigned int first_sh_link; |
|
815 | size_t sh_name; |
826 | size_t sh_name; |
816 | unsigned char zero; |
827 | unsigned char zero; |
Line 817... | Line 828... | ||
817 | 828 | ||
818 | if (!simple_object_elf_write_ehdr (sobj, descriptor, &errmsg, err)) |
829 | if (!simple_object_elf_write_ehdr (sobj, descriptor, &errmsg, err)) |
Line 840... | Line 851... | ||
840 | shnum += 2; |
851 | shnum += 2; |
Line 841... | Line 852... | ||
841 | 852 | ||
842 | shdr_offset = ehdr_size; |
853 | shdr_offset = ehdr_size; |
Line -... | Line 854... | ||
- | 854 | sh_offset = shdr_offset + shnum * shdr_size; |
|
- | 855 | ||
- | 856 | if (shnum < SHN_LORESERVE) |
|
- | 857 | first_sh_size = 0; |
|
- | 858 | else |
|
- | 859 | first_sh_size = shnum; |
|
- | 860 | if (shnum - 1 < SHN_LORESERVE) |
|
- | 861 | first_sh_link = 0; |
|
843 | sh_offset = shdr_offset + shnum * shdr_size; |
862 | else |
- | 863 | first_sh_link = shnum - 1; |
|
844 | 864 | if (!simple_object_elf_write_shdr (sobj, descriptor, shdr_offset, |
|
845 | if (!simple_object_elf_write_shdr (sobj, descriptor, shdr_offset, |
865 | 0, 0, 0, 0, first_sh_size, first_sh_link, |
Line 846... | Line 866... | ||
846 | 0, 0, 0, 0, 0, 0, &errmsg, err)) |
866 | 0, &errmsg, err)) |
Line 847... | Line 867... | ||
847 | return errmsg; |
867 | return errmsg; |
Line 885... | Line 905... | ||
885 | sh_size += buffer->size; |
905 | sh_size += buffer->size; |
886 | } |
906 | } |
Line 887... | Line 907... | ||
887 | 907 | ||
888 | if (!simple_object_elf_write_shdr (sobj, descriptor, shdr_offset, |
908 | if (!simple_object_elf_write_shdr (sobj, descriptor, shdr_offset, |
889 | sh_name, SHT_PROGBITS, 0, sh_offset, |
909 | sh_name, SHT_PROGBITS, 0, sh_offset, |
890 | sh_size, 1U << section->align, |
910 | sh_size, 0, 1U << section->align, |
891 | &errmsg, err)) |
911 | &errmsg, err)) |
Line 892... | Line 912... | ||
892 | return errmsg; |
912 | return errmsg; |
893 | 913 | ||
894 | shdr_offset += shdr_size; |
914 | shdr_offset += shdr_size; |
895 | sh_name += strlen (section->name) + 1; |
915 | sh_name += strlen (section->name) + 1; |
Line 896... | Line 916... | ||
896 | sh_offset += sh_size; |
916 | sh_offset += sh_size; |
897 | } |
917 | } |
898 | 918 | ||
899 | if (!simple_object_elf_write_shdr (sobj, descriptor, shdr_offset, |
919 | if (!simple_object_elf_write_shdr (sobj, descriptor, shdr_offset, |
900 | sh_name, SHT_STRTAB, 0, sh_offset, |
920 | sh_name, SHT_STRTAB, 0, sh_offset, |
Line 901... | Line 921... | ||
901 | sh_name + strlen (".shstrtab") + 1, |
921 | sh_name + strlen (".shstrtab") + 1, 0, |
902 | 1, &errmsg, err)) |
922 | 1, &errmsg, err)) |