@@ -62,6 +62,7 @@ ASSERT_FIELD(Dec_Ehdr, e_ident, DeeDec_Ehdr_OFFSETOF__e_ident, 4);
6262ASSERT_FIELD (Dec_Ehdr , e_mach , DeeDec_Ehdr_OFFSETOF__e_mach , 1 );
6363ASSERT_FIELD (Dec_Ehdr , e_type , DeeDec_Ehdr_OFFSETOF__e_type , 1 );
6464ASSERT_FIELD (Dec_Ehdr , e_version , DeeDec_Ehdr_OFFSETOF__e_version , 2 );
65+ ASSERT_FIELD (Dec_Ehdr , e_offsetof_heap , DeeDec_Ehdr_OFFSETOF__e_offsetof_heap , 2 );
6566ASSERT_FIELD (Dec_Ehdr , e_offsetof_eof , DeeDec_Ehdr_OFFSETOF__e_offsetof_eof , 4 );
6667ASSERT_FIELD (Dec_Ehdr , e_offsetof_gchead , DeeDec_Ehdr_OFFSETOF__e_offsetof_gchead , 4 );
6768ASSERT_FIELD (Dec_Ehdr , e_offsetof_gctail , DeeDec_Ehdr_OFFSETOF__e_offsetof_gctail , 4 );
@@ -706,6 +707,10 @@ DeeDec_OpenFile(/*inherit(on_success)*/ struct DeeMapFile *__restrict fmap,
706707 goto_fail ("Bad 'e_type'" );
707708 if unlikely (ehdr -> e_version != DVERSION_CUR )
708709 goto_fail ("Bad 'e_version'" );
710+ if unlikely (ehdr -> e_offsetof_heap != offsetof(Dec_Ehdr , e_heap ))
711+ goto_fail ("Bad 'e_offsetof_heap'" );
712+ if unlikely (ehdr -> _e_unused_zero != 0 )
713+ goto_fail ("Bad '_e_unused_zero'" );
709714 if unlikely (ehdr -> e_offsetof_eof != DeeMapFile_GetSize (fmap ))
710715 goto_fail ("Bad 'e_offsetof_eof' does not match size of file" );
711716 if unlikely (ehdr -> e_offsetof_eof > DFILE_LIMIT )
@@ -834,7 +839,8 @@ DeeDecWriter_PackEhdr(DeeDecWriter *__restrict self,
834839 ehdr -> e_version = DVERSION_CUR ;
835840 ehdr -> e_offsetof_gchead = self -> dw_gchead ;
836841 ehdr -> e_offsetof_gctail = self -> dw_gctail ;
837- ehdr -> _e_pad = 0 ;
842+ ehdr -> e_offsetof_heap = offsetof(Dec_Ehdr , e_heap );
843+ ehdr -> _e_unused_zero = 0 ;
838844
839845 /* Space for the heap tail is always pre-allocated! */
840846 {
@@ -849,7 +855,7 @@ DeeDecWriter_PackEhdr(DeeDecWriter *__restrict self,
849855
850856 /* Calculate the total needed buffer size. */
851857 total_need = seraddr32 (self -> dw_used );
852- total_need += sizeof (struct Dee_heaptail ); /* Heap tail */
858+ total_need += ( Dee_dec_addr32_t ) sizeof (struct Dee_heaptail ); /* Heap tail */
853859
854860#ifndef CONFIG_NO_DEC
855861 if (!(flags & DeeModule_IMPORT_F_NOGDEC ) && !(self -> dw_flags & DeeDecWriter_F_NRELOC )) {
@@ -869,38 +875,42 @@ DeeDecWriter_PackEhdr(DeeDecWriter *__restrict self,
869875 /* Module dependency tables. */
870876 if (self -> dw_deps .ddpt_depc ) {
871877 ehdr -> e_typedata .td_reloc .er_offsetof_deps = total_need ;
872- total_need += self -> dw_deps .ddpt_depc * sizeof (Dec_Dhdr );
878+ total_need += seraddr32 ( self -> dw_deps .ddpt_depc * sizeof (Dec_Dhdr ) );
873879 /* Add space for "terminated by a d_modspec.d_mod==NULL-entry" */
874- total_need += offsetafter (Dec_Dhdr , d_modspec .d_mod );
880+ total_need += ( Dee_dec_addr32_t ) offsetafter (Dec_Dhdr , d_modspec .d_mod );
875881 } else {
876882 ehdr -> e_typedata .td_reloc .er_offsetof_deps = addrof_zero - offsetof(Dec_Dhdr , d_modspec .d_mod );
877883 }
878884
879885 /* Relocations against self. */
880886 if (self -> dw_srel .drlt_relc ) {
881887 ehdr -> e_typedata .td_reloc .er_offsetof_srel = total_need ;
882- total_need += (self -> dw_srel .drlt_relc * sizeof (Dec_Rel )) + offsetafter (Dec_Rel , r_addr );
888+ total_need += seraddr32 (self -> dw_srel .drlt_relc * sizeof (Dec_Rel ));
889+ total_need += (Dee_dec_addr32_t )offsetafter (Dec_Rel , r_addr );
883890 } else {
884891 ehdr -> e_typedata .td_reloc .er_offsetof_srel = addrof_zero ;
885892 }
886893
887894 /* Relocations against deemon. */
888895 if (self -> dw_drel .drlt_relc ) {
889896 ehdr -> e_typedata .td_reloc .er_offsetof_drel = total_need ;
890- total_need += (self -> dw_drel .drlt_relc * sizeof (Dec_Rel )) + offsetafter (Dec_Rel , r_addr );
897+ total_need += seraddr32 (self -> dw_drel .drlt_relc * sizeof (Dec_Rel ));
898+ total_need += (Dee_dec_addr32_t )offsetafter (Dec_Rel , r_addr );
891899 } else {
892900 ehdr -> e_typedata .td_reloc .er_offsetof_drel = addrof_zero ;
893901 }
894902 if (self -> dw_drrel .drrt_relc ) {
895903 ehdr -> e_typedata .td_reloc .er_offsetof_drrel = total_need ;
896- total_need += (self -> dw_drrel .drrt_relc * sizeof (Dec_RRel )) + offsetafter (Dec_RRel , r_addr );
904+ total_need += seraddr32 (self -> dw_drrel .drrt_relc * sizeof (Dec_RRel ));
905+ total_need += (Dee_dec_addr32_t )offsetafter (Dec_RRel , r_addr );
897906 } else {
898907 ehdr -> e_typedata .td_reloc .er_offsetof_drrel = addrof_zero ;
899908 }
900909 ASSERTF (!self -> dw_drrela_miss , "This should have been handled by 'DeeDecWriter_F_NRELOC' being checked above!" );
901910 if (self -> dw_drrela .drat_relc ) {
902911 ehdr -> e_typedata .td_reloc .er_offsetof_drrela = total_need ;
903- total_need += (self -> dw_drrela .drat_relc * sizeof (Dec_RRela )) + offsetafter (Dec_RRela , r_addr );
912+ total_need += seraddr32 (self -> dw_drrela .drat_relc * sizeof (Dec_RRela ));
913+ total_need += (Dee_dec_addr32_t )offsetafter (Dec_RRela , r_addr );
904914 } else {
905915 ehdr -> e_typedata .td_reloc .er_offsetof_drrela = addrof_zero ;
906916 }
@@ -909,12 +919,17 @@ DeeDecWriter_PackEhdr(DeeDecWriter *__restrict self,
909919 addrof_modrel = total_need ;
910920 for (i = 0 ; i < self -> dw_deps .ddpt_depc ; ++ i ) {
911921 struct Dee_dec_depmod * dep = & self -> dw_deps .ddpt_depv [i ];
912- if (dep -> ddm_rel .drlt_relc )
913- total_need += (dep -> ddm_rel .drlt_relc * sizeof (Dec_Rel )) + offsetafter (Dec_Rel , r_addr );
914- if (dep -> ddm_rrel .drrt_relc )
915- total_need += (dep -> ddm_rrel .drrt_relc * sizeof (Dec_RRel )) + offsetafter (Dec_RRel , r_addr );
922+ if (dep -> ddm_rel .drlt_relc ) {
923+ total_need += seraddr32 (dep -> ddm_rel .drlt_relc * sizeof (Dec_Rel ));
924+ total_need += (Dee_dec_addr32_t )offsetafter (Dec_Rel , r_addr );
925+ }
926+ if (dep -> ddm_rrel .drrt_relc ) {
927+ total_need += seraddr32 (dep -> ddm_rrel .drrt_relc * sizeof (Dec_RRel ));
928+ total_need += (Dee_dec_addr32_t )offsetafter (Dec_RRel , r_addr );
929+ }
916930 if (dep -> ddm_rrela .drat_relc )
917- total_need += (dep -> ddm_rrela .drat_relc * sizeof (Dec_RRela )) + offsetafter (Dec_RRela , r_addr );
931+ total_need += seraddr32 (dep -> ddm_rrela .drat_relc * sizeof (Dec_RRela ));
932+ total_need += (Dee_dec_addr32_t )offsetafter (Dec_RRela , r_addr );
918933 }
919934
920935 /* String tables */
@@ -924,20 +939,20 @@ DeeDecWriter_PackEhdr(DeeDecWriter *__restrict self,
924939 char const * impstr_utf8 ;
925940 ASSERT (dep -> ddm_impstr );
926941 total_need = CEIL_ALIGN (total_need , __ALIGNOF_SIZE_T__ );
927- total_need += offsetof(Dec_Dstr , ds_string );
942+ total_need += ( Dee_dec_addr32_t ) offsetof(Dec_Dstr , ds_string );
928943 impstr_utf8 = DeeString_AsUtf8 ((DeeObject * )dep -> ddm_impstr );
929944 if unlikely (!impstr_utf8 )
930945 goto err ;
931- total_need += ( WSTR_LENGTH (impstr_utf8 ) + 1 ) * sizeof (char );
946+ total_need += seraddr32 (( WSTR_LENGTH (impstr_utf8 ) + 1 ) * sizeof (char ) );
932947 }
933948
934949 /* Additional file dependencies */
935950 if (self -> dw_fdeps .dfdt_depc ) {
936951 total_need = CEIL_ALIGN (total_need , __ALIGNOF_SIZE_T__ );
937952 ehdr -> e_typedata .td_reloc .er_offsetof_files = total_need ;
938- total_need += self -> dw_fdeps .dfdt_depc ;
953+ total_need += seraddr32 ( self -> dw_fdeps .dfdt_depc ) ;
939954 total_need = CEIL_ALIGN (total_need , __ALIGNOF_SIZE_T__ );
940- total_need += offsetafter (Dec_Dstr , ds_length ); /* For trailing 0 */
955+ total_need += ( Dee_dec_addr32_t ) offsetafter (Dec_Dstr , ds_length ); /* For trailing 0 */
941956 } else {
942957 ehdr -> e_typedata .td_reloc .er_offsetof_files = 0 ;
943958 }
@@ -971,7 +986,8 @@ DeeDecWriter_PackEhdr(DeeDecWriter *__restrict self,
971986 dep -> ddm_rel .drlt_relc ,
972987 sizeof (Dec_Rel ));
973988 out_rel -> r_addr = 0 ;
974- addrof_outrel += (dep -> ddm_rel .drlt_relc * sizeof (Dec_Rel )) + offsetafter (Dec_Rel , r_addr );
989+ addrof_outrel += seraddr32 (dep -> ddm_rel .drlt_relc * sizeof (Dec_Rel ));
990+ addrof_outrel += (Dee_dec_addr32_t )offsetafter (Dec_Rel , r_addr );
975991 } else {
976992 out_deps -> d_modspec .d_file .d_offsetof_rel = addrof_zero ;
977993 }
@@ -984,7 +1000,8 @@ DeeDecWriter_PackEhdr(DeeDecWriter *__restrict self,
9841000 dep -> ddm_rrel .drrt_relc ,
9851001 sizeof (Dec_RRel ));
9861002 out_rel -> r_addr = 0 ;
987- addrof_outrel += (dep -> ddm_rrel .drrt_relc * sizeof (Dec_RRel )) + offsetafter (Dec_RRel , r_addr );
1003+ addrof_outrel += seraddr32 (dep -> ddm_rrel .drrt_relc * sizeof (Dec_RRel ));
1004+ addrof_outrel += (Dee_dec_addr32_t )offsetafter (Dec_RRel , r_addr );
9881005 } else {
9891006 out_deps -> d_offsetof_rrel = addrof_zero ;
9901007 }
@@ -997,7 +1014,8 @@ DeeDecWriter_PackEhdr(DeeDecWriter *__restrict self,
9971014 dep -> ddm_rrela .drat_relc ,
9981015 sizeof (Dec_RRela ));
9991016 out_rel -> r_addr = 0 ;
1000- addrof_outrel += (dep -> ddm_rrela .drat_relc * sizeof (Dec_RRela )) + offsetafter (Dec_RRela , r_addr );
1017+ addrof_outrel += seraddr32 (dep -> ddm_rrela .drat_relc * sizeof (Dec_RRela ));
1018+ addrof_outrel += (Dee_dec_addr32_t )offsetafter (Dec_RRela , r_addr );
10011019 } else {
10021020 out_deps -> d_offsetof_rrela = addrof_zero ;
10031021 }
@@ -1007,7 +1025,7 @@ DeeDecWriter_PackEhdr(DeeDecWriter *__restrict self,
10071025 ASSERTF (impstr_utf8 , "Should have been pre-loaded since was needed to calc buffer size" );
10081026 addrof_outname = CEIL_ALIGN (addrof_outname , __ALIGNOF_SIZE_T__ );
10091027 out_name = (Dec_Dstr * )((byte_t * )ehdr + addrof_outname );
1010- out_name -> ds_length = WSTR_LENGTH (impstr_utf8 );
1028+ out_name -> ds_length = seraddr32 ( WSTR_LENGTH (impstr_utf8 ) );
10111029 * (char * )mempcpyc (out_name -> ds_string , impstr_utf8 , out_name -> ds_length , sizeof (char )) = '\0' ;
10121030 out_deps -> d_modspec .d_file .d_offsetof_modname = addrof_outname ;
10131031 addrof_outname += offsetof(Dec_Dstr , ds_string );
@@ -1536,19 +1554,19 @@ decwriter_gcobject_malloc_impl(DeeDecWriter *__restrict self, size_t num_bytes,
15361554 if (self -> dw_gctail == 0 ) {
15371555 /* First GC object... */
15381556 struct gc_head_link * link ;
1539- self -> dw_gchead = result ;
1557+ self -> dw_gchead = seraddr32 ( result ) ;
15401558 link = DeeDecWriter_Addr2Mem (self , result , struct gc_head_link );
15411559 link -> gc_next = NULL ;
15421560 link -> gc_pself = NULL ;
15431561 } else {
15441562 /* Append to end of GC list. */
1545- if (decwriter_putaddr (self , self -> dw_gctail + offsetof(struct gc_head_link , gc_next ), result ))
1563+ if (decwriter_putaddr (self , self -> dw_gctail + ( Dee_dec_addr32_t ) offsetof(struct gc_head_link , gc_next ), result ))
15461564 goto err_r ;
1547- if (decwriter_putaddr (self , result + offsetof(struct gc_head_link , gc_pself ),
1548- self -> dw_gctail + offsetof(struct gc_head_link , gc_next )))
1565+ if (decwriter_putaddr (self , result + ( Dee_dec_addr32_t ) offsetof(struct gc_head_link , gc_pself ),
1566+ self -> dw_gctail + ( Dee_dec_addr32_t ) offsetof(struct gc_head_link , gc_next )))
15491567 goto err_r ;
15501568 }
1551- self -> dw_gctail = result ;
1569+ self -> dw_gctail = seraddr32 ( result ) ;
15521570
15531571 /* Initialize "ob_refcnt" and "ob_type" of the newly allocated object */
15541572 copy = DeeDecWriter_Addr2Mem (self , result , struct gc_head );
0 commit comments