@@ -64,8 +64,7 @@ void elf_generate_header(void)
6464    }
6565
6666    elf32_hdr_t  hdr ;
67-     /* 
68-      * The following table explains the meaning of each field in the 
67+     /* The following table explains the meaning of each field in the 
6968     * ELF32 file header. 
7069     * 
7170     * Notice that the following values are hexadecimal. 
@@ -134,26 +133,30 @@ void elf_generate_header(void)
134133    hdr .e_version  =  1 ;                        /* ELF version */ 
135134    hdr .e_entry  =  ELF_START  +  elf_header_len ; /* entry point */ 
136135    hdr .e_phoff  =  0x34 ;                       /* program header offset */ 
137-     hdr .e_shoff  =  elf_header_len  +  elf_code -> size  +  elf_data -> size  +  39  + 
138-                   elf_symtab -> size  + 
139-                   elf_strtab -> size ; /* section header offset */ 
140-     hdr .e_flags  =  ELF_FLAGS ;        /* flags */ 
141-     hdr .e_ehsize [0 ] =  (char ) 0x34 ;  /* header size */ 
136+     /* Section header offset: The section headers come after symtab, strtab, and 
137+      * shstrtab which are all written as part of elf_section buffer 
138+      */ 
139+     hdr .e_shoff  =  elf_header_len  +  elf_code -> size  +  elf_data -> size  + 
140+                   elf_rodata -> size  +  elf_symtab -> size  +  elf_strtab -> size  +  53 ;
141+     /* 53 is shstrtab size with new section names */ 
142+     hdr .e_flags  =  ELF_FLAGS ;       /* flags */ 
143+     hdr .e_ehsize [0 ] =  (char ) 0x34 ; /* header size */ 
142144    hdr .e_ehsize [1 ] =  0 ;
143145    hdr .e_phentsize [0 ] =  (char ) 0x20 ; /* program header size */ 
144146    hdr .e_phentsize [1 ] =  0 ;
145147    hdr .e_phnum [0 ] =  1 ; /* number of program headers */ 
146148    hdr .e_phnum [1 ] =  0 ;
147149    hdr .e_shentsize [0 ] =  (char ) 0x28 ; /* section header size */ 
148150    hdr .e_shentsize [1 ] =  0 ;
149-     hdr .e_shnum [0 ] =  6 ; /* number of section headers */ 
151+     /* number of section headers: .rodata and .bss included */ 
152+     hdr .e_shnum [0 ] =  8 ;
150153    hdr .e_shnum [1 ] =  0 ;
151-     hdr .e_shstrndx [0 ] =  5 ; /* section index with names */ 
154+     /* section index with names: updated for new sections */ 
155+     hdr .e_shstrndx [0 ] =  7 ;
152156    hdr .e_shstrndx [1 ] =  0 ;
153157    elf_write_blk (elf_header , & hdr , sizeof (elf32_hdr_t ));
154158
155-     /* 
156-      * Explain the meaning of each field in the ELF32 program header. 
159+     /* Explain the meaning of each field in the ELF32 program header. 
157160     * 
158161     *    |  Program       |                                                 | 
159162     *  & |  Header bytes  | Explanation                                     | 
@@ -176,14 +179,16 @@ void elf_generate_header(void)
176179     */ 
177180    /* program header - code and data combined */ 
178181    elf32_phdr_t  phdr ;
179-     phdr .p_type  =  1 ;                                 /* PT_LOAD */ 
180-     phdr .p_offset  =  elf_header_len ;                  /* offset of segment */ 
181-     phdr .p_vaddr  =  ELF_START  +  elf_header_len ;       /* virtual address */ 
182-     phdr .p_paddr  =  ELF_START  +  elf_header_len ;       /* physical address */ 
183-     phdr .p_filesz  =  elf_code -> size  +  elf_data -> size ; /* size in file */ 
184-     phdr .p_memsz  =  elf_code -> size  +  elf_data -> size ;  /* size in memory */ 
185-     phdr .p_flags  =  7 ;                                /* flags */ 
186-     phdr .p_align  =  4 ;                                /* alignment */ 
182+     phdr .p_type  =  1 ;                           /* PT_LOAD */ 
183+     phdr .p_offset  =  elf_header_len ;            /* offset of segment */ 
184+     phdr .p_vaddr  =  ELF_START  +  elf_header_len ; /* virtual address */ 
185+     phdr .p_paddr  =  ELF_START  +  elf_header_len ; /* physical address */ 
186+     phdr .p_filesz  =  elf_code -> size  +  elf_data -> size  + 
187+                     elf_rodata -> size ; /* size in file - includes .rodata */ 
188+     phdr .p_memsz  =  elf_code -> size  +  elf_data -> size  +  elf_rodata -> size  + 
189+                    elf_bss_size ; /* size in memory - includes .bss */ 
190+     phdr .p_flags  =  7 ;            /* flags */ 
191+     phdr .p_align  =  4 ;            /* alignment */ 
187192    elf_write_blk (elf_header , & phdr , sizeof (elf32_phdr_t ));
188193}
189194
@@ -195,22 +200,30 @@ void elf_generate_sections(void)
195200        return ;
196201    }
197202
203+     int  section_data_size  =  0 ;
204+ 
198205    /* symtab section */ 
199206    for  (int  b  =  0 ; b  <  elf_symtab -> size ; b ++ )
200207        elf_write_byte (elf_section , elf_symtab -> elements [b ]);
208+     section_data_size  +=  elf_symtab -> size ;
201209
202210    /* strtab section */ 
203211    for  (int  b  =  0 ; b  <  elf_strtab -> size ; b ++ )
204212        elf_write_byte (elf_section , elf_strtab -> elements [b ]);
213+     section_data_size  +=  elf_strtab -> size ;
205214
206-     /* shstr section; len = 39  */ 
215+     /* shstr section; len = 53 (was 39) - includes .rodata and .bss  */ 
207216    elf_write_byte (elf_section , 0 );
208217    elf_write_str (elf_section , ".shstrtab" );
209218    elf_write_byte (elf_section , 0 );
210219    elf_write_str (elf_section , ".text" );
211220    elf_write_byte (elf_section , 0 );
212221    elf_write_str (elf_section , ".data" );
213222    elf_write_byte (elf_section , 0 );
223+     elf_write_str (elf_section , ".rodata" );
224+     elf_write_byte (elf_section , 0 );
225+     elf_write_str (elf_section , ".bss" );
226+     elf_write_byte (elf_section , 0 );
214227    elf_write_str (elf_section , ".symtab" );
215228    elf_write_byte (elf_section , 0 );
216229    elf_write_str (elf_section , ".strtab" );
@@ -288,22 +301,51 @@ void elf_generate_sections(void)
288301    elf_write_blk (elf_section , & shdr , sizeof (elf32_shdr_t ));
289302    ofs  +=  elf_data -> size ;
290303
304+     /* .rodata */ 
305+     shdr .sh_name  =  0x17 ; /* Offset in shstrtab for ".rodata" */ 
306+     shdr .sh_type  =  1 ;    /* SHT_PROGBITS */ 
307+     shdr .sh_flags  =  2 ;   /* SHF_ALLOC only (read-only) */ 
308+     shdr .sh_addr  =  elf_code_start  +  elf_code -> size  +  elf_data -> size ;
309+     shdr .sh_offset  =  ofs ;
310+     shdr .sh_size  =  elf_rodata -> size ;
311+     shdr .sh_link  =  0 ;
312+     shdr .sh_info  =  0 ;
313+     shdr .sh_addralign  =  4 ;
314+     shdr .sh_entsize  =  0 ;
315+     elf_write_blk (elf_section , & shdr , sizeof (elf32_shdr_t ));
316+     ofs  +=  elf_rodata -> size ;
317+ 
318+     /* .bss */ 
319+     shdr .sh_name  =  0x1f ; /* Offset in shstrtab for ".bss" */ 
320+     shdr .sh_type  =  8 ;    /* SHT_NOBITS */ 
321+     shdr .sh_flags  =  3 ;   /* SHF_ALLOC | SHF_WRITE */ 
322+     shdr .sh_addr  = 
323+         elf_code_start  +  elf_code -> size  +  elf_data -> size  +  elf_rodata -> size ;
324+     shdr .sh_offset  =  ofs ; /* File offset (not actually used for NOBITS) */ 
325+     shdr .sh_size  =  elf_bss_size ;
326+     shdr .sh_link  =  0 ;
327+     shdr .sh_info  =  0 ;
328+     shdr .sh_addralign  =  4 ;
329+     shdr .sh_entsize  =  0 ;
330+     elf_write_blk (elf_section , & shdr , sizeof (elf32_shdr_t ));
331+     /* Note: .bss is not written to file (SHT_NOBITS) */ 
332+ 
291333    /* .symtab */ 
292-     shdr .sh_name  =  0x17 ; 
334+     shdr .sh_name  =  0x24 ;  /* Updated offset for ".symtab" */ 
293335    shdr .sh_type  =  2 ;
294336    shdr .sh_flags  =  0 ;
295337    shdr .sh_addr  =  0 ;
296338    shdr .sh_offset  =  ofs ;
297339    shdr .sh_size  =  elf_symtab -> size ;
298-     shdr .sh_link  =  4 ; 
340+     shdr .sh_link  =  6 ;  /* Link to .strtab (section 6) */ 
299341    shdr .sh_info  =  elf_symbol_index ;
300342    shdr .sh_addralign  =  4 ;
301343    shdr .sh_entsize  =  16 ;
302344    elf_write_blk (elf_section , & shdr , sizeof (elf32_shdr_t ));
303345    ofs  +=  elf_symtab -> size ;
304346
305347    /* .strtab */ 
306-     shdr .sh_name  =  0x1f ; 
348+     shdr .sh_name  =  0x2c ;  /* Updated offset for ".strtab" */ 
307349    shdr .sh_type  =  3 ;
308350    shdr .sh_flags  =  0 ;
309351    shdr .sh_addr  =  0 ;
@@ -322,7 +364,7 @@ void elf_generate_sections(void)
322364    shdr .sh_flags  =  0 ;
323365    shdr .sh_addr  =  0 ;
324366    shdr .sh_offset  =  ofs ;
325-     shdr .sh_size  =  39 ; 
367+     shdr .sh_size  =  53 ;  /* Updated from 39 to include new section names */ 
326368    shdr .sh_link  =  0 ;
327369    shdr .sh_info  =  0 ;
328370    shdr .sh_addralign  =  1 ;
@@ -333,14 +375,17 @@ void elf_generate_sections(void)
333375void  elf_align (void )
334376{
335377    /* Check for null pointers to prevent crashes */ 
336-     if  (!elf_data  ||  !elf_symtab  ||  !elf_strtab ) {
378+     if  (!elf_data  ||  !elf_rodata   ||  ! elf_symtab  ||  !elf_strtab ) {
337379        error ("ELF buffers not initialized for alignment" );
338380        return ;
339381    }
340382
341383    while  (elf_data -> size  &  3 )
342384        elf_write_byte (elf_data , 0 );
343385
386+     while  (elf_rodata -> size  &  3 )
387+         elf_write_byte (elf_rodata , 0 );
388+ 
344389    while  (elf_symtab -> size  &  3 )
345390        elf_write_byte (elf_symtab , 0 );
346391
@@ -387,6 +432,9 @@ void elf_generate(const char *outfile)
387432        fputc (elf_code -> elements [i ], fp );
388433    for  (int  i  =  0 ; i  <  elf_data -> size ; i ++ )
389434        fputc (elf_data -> elements [i ], fp );
435+     for  (int  i  =  0 ; i  <  elf_rodata -> size ; i ++ )
436+         fputc (elf_rodata -> elements [i ], fp );
437+     /* Note: .bss is not written to file (SHT_NOBITS) */ 
390438    for  (int  i  =  0 ; i  <  elf_section -> size ; i ++ )
391439        fputc (elf_section -> elements [i ], fp );
392440    fclose (fp );
0 commit comments