@@ -498,10 +498,10 @@ readfile_elf (char *filename)
498
498
struct elf32_hdr elfhdr ;
499
499
struct elf32_phdr * elf_phdata = NULL ;
500
500
struct elf32_shdr * elf_spstr , * elf_spnt , * elf_shdata ;
501
- struct elf32_sym * sym_tbl = ( struct elf32_sym * ) 0 ;
501
+ struct elf32_sym * sym_tbl = NULL ;
502
502
uint32_t syms = 0 ;
503
- char * str_tbl = ( char * ) 0 ;
504
- char * s_str = ( char * ) 0 ;
503
+ char * str_tbl = NULL ;
504
+ char * s_str = NULL ;
505
505
uint32_t inputbuf ;
506
506
uint32_t padd ;
507
507
uint32_t insn ;
@@ -513,12 +513,14 @@ readfile_elf (char *filename)
513
513
exit (1 );
514
514
}
515
515
516
+ /* Load elf header */
516
517
if (fread (& elfhdr , sizeof (elfhdr ), 1 , inputfs ) != 1 )
517
518
{
518
519
perror ("readfile_elf" );
519
520
exit (1 );
520
521
}
521
522
523
+ /* Read in elf section header */
522
524
if ((elf_shdata =
523
525
(struct elf32_shdr * ) malloc (ELF_SHORT_H (elfhdr .e_shentsize ) *
524
526
ELF_SHORT_H (elfhdr .e_shnum ))) == NULL )
@@ -542,6 +544,7 @@ readfile_elf (char *filename)
542
544
exit (1 );
543
545
}
544
546
547
+ /* Read in elf program headers if available */
545
548
if (ELF_LONG_H (elfhdr .e_phoff ))
546
549
{
547
550
if ((elf_phdata =
@@ -569,18 +572,15 @@ readfile_elf (char *filename)
569
572
}
570
573
}
571
574
575
+ /* Look for symbol table section and load string table. Used
576
+ for inserting symbol labels. */
572
577
for (i = 0 , elf_spnt = elf_shdata ; i < ELF_SHORT_H (elfhdr .e_shnum );
573
578
i ++ , elf_spnt ++ )
574
579
{
575
-
576
-
577
580
if (ELF_LONG_H (elf_spnt -> sh_type ) == SHT_SYMTAB )
578
581
{
579
-
580
582
if (NULL != sym_tbl )
581
- {
582
- free (sym_tbl );
583
- }
583
+ free (sym_tbl );
584
584
585
585
if ((sym_tbl =
586
586
(struct elf32_sym * ) malloc (ELF_LONG_H (elf_spnt -> sh_size )))
@@ -608,38 +608,37 @@ readfile_elf (char *filename)
608
608
ELF_LONG_H (elf_spnt -> sh_size ) /
609
609
ELF_LONG_H (elf_spnt -> sh_entsize );
610
610
611
- if (ELF_LONG_H (elf_spnt -> sh_link ) <= ELF_SHORT_H (elfhdr .e_shnum ))
612
- {
613
- if (NULL != str_tbl )
614
- {
615
- free (str_tbl );
616
- }
611
+ if (ELF_LONG_H (elf_spnt -> sh_link ) <= ELF_SHORT_H (elfhdr .e_shnum ))
612
+ {
613
+ if (NULL != str_tbl )
614
+ free (str_tbl );
617
615
618
- elf_spstr = & elf_shdata [ELF_LONG_H (elf_spnt -> sh_link )];
619
- if ((str_tbl =
620
- (char * ) malloc (ELF_LONG_H (elf_spstr -> sh_size ))) == NULL )
621
- {
622
- perror ("readfile_elf" );
623
- exit (1 );
624
- }
616
+ elf_spstr = & elf_shdata [ELF_LONG_H (elf_spnt -> sh_link )];
617
+ if ((str_tbl =
618
+ (char * ) malloc (ELF_LONG_H (elf_spstr -> sh_size ))) == NULL )
619
+ {
620
+ perror ("readfile_elf" );
621
+ exit (1 );
622
+ }
625
623
626
- if (fseek (inputfs , ELF_LONG_H (elf_spstr -> sh_offset ), SEEK_SET ) !=
627
- 0 )
628
- {
629
- perror ("readfile_elf" );
630
- exit (1 );
631
- }
624
+ if (fseek (inputfs , ELF_LONG_H (elf_spstr -> sh_offset ), SEEK_SET ) !=
625
+ 0 )
626
+ {
627
+ perror ("readfile_elf" );
628
+ exit (1 );
629
+ }
632
630
633
- if (fread (str_tbl , ELF_LONG_H (elf_spstr -> sh_size ), 1 , inputfs ) !=
634
- 1 )
635
- {
636
- perror ("readfile_elf" );
637
- exit (1 );
638
- }
631
+ if (fread (str_tbl , ELF_LONG_H (elf_spstr -> sh_size ), 1 , inputfs ) !=
632
+ 1 )
633
+ {
634
+ perror ("readfile_elf" );
635
+ exit (1 );
639
636
}
637
+ }
640
638
}
641
639
}
642
640
641
+ /* Load section name string table. Used for printing section names. */
643
642
if (ELF_SHORT_H (elfhdr .e_shstrndx ) != SHN_UNDEF )
644
643
{
645
644
elf_spnt = & elf_shdata [ELF_SHORT_H (elfhdr .e_shstrndx )];
@@ -663,6 +662,7 @@ readfile_elf (char *filename)
663
662
}
664
663
}
665
664
665
+ /* Iterate over section headers and load program bits. */
666
666
for (i = 0 , elf_spnt = elf_shdata ; i < ELF_SHORT_H (elfhdr .e_shnum );
667
667
i ++ , elf_spnt ++ )
668
668
{
@@ -672,6 +672,9 @@ readfile_elf (char *filename)
672
672
{
673
673
674
674
padd = ELF_LONG_H (elf_spnt -> sh_addr );
675
+ /* Search if section is within program header segment, if
676
+ so adjust the paddr to use the physical address of the
677
+ segment. */
675
678
for (j = 0 ; j < ELF_SHORT_H (elfhdr .e_phnum ); j ++ )
676
679
{
677
680
if (ELF_LONG_H (elf_phdata [j ].p_offset ) &&
@@ -686,8 +689,6 @@ readfile_elf (char *filename)
686
689
ELF_LONG_H (elf_phdata [j ].p_offset );
687
690
}
688
691
689
-
690
-
691
692
if (ELF_LONG_H (elf_spnt -> sh_name ) && s_str )
692
693
{
693
694
PRINTFQ ("Section: %s," , & s_str [ELF_LONG_H (elf_spnt -> sh_name )]);
@@ -723,6 +724,7 @@ readfile_elf (char *filename)
723
724
}
724
725
}
725
726
727
+ /* Load up sym_tbl symbols and names from str_tbl into symbol to label hash. */
726
728
if (str_tbl )
727
729
{
728
730
i = 0 ;
@@ -739,19 +741,18 @@ readfile_elf (char *filename)
739
741
}
740
742
741
743
if (NULL != str_tbl )
742
- {
743
- free (str_tbl );
744
- }
744
+ free (str_tbl );
745
745
746
746
if (NULL != sym_tbl )
747
- {
748
- free (sym_tbl );
749
- }
747
+ free (sym_tbl );
750
748
751
- free (s_str );
752
- free (elf_phdata );
753
- free (elf_shdata );
749
+ if (NULL != s_str )
750
+ free (s_str );
751
+
752
+ if (NULL != elf_phdata )
753
+ free (elf_phdata );
754
754
755
+ free (elf_shdata );
755
756
}
756
757
757
758
/* Identify file type and call appropriate readfile_X routine. It only
0 commit comments