Subversion Repositories Kolibri OS

Rev

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))