@@ -64,6 +64,8 @@ ElfView::ElfView(BinaryView* data, bool parseOnly): BinaryView("ELF", data->GetF
6464 memset (&m_dynamicSymbolTableSection, 0 , sizeof (m_dynamicSymbolTableSection));
6565 memset (&m_dynamicStringTable, 0 , sizeof (m_dynamicStringTable));
6666 memset (&m_dynamicTable, 0 , sizeof (m_dynamicTable));
67+ memset (&m_relocSection, 0 , sizeof (m_relocSection));
68+ memset (&m_relocaSection, 0 , sizeof (m_relocaSection));
6769 memset (&m_tlsSegment, 0 , sizeof (m_tlsSegment));
6870 memset (&m_auxSymbolTable, 0 , sizeof (m_auxSymbolTable));
6971 memset (&m_sectionStringTable, 0 , sizeof (m_sectionStringTable));
@@ -784,10 +786,8 @@ bool ElfView::Init()
784786 uint64_t adjustedVirtualAddr = m_dynamicTable.virtualAddress + imageBaseAdjustment;
785787 reader.Seek (adjustedVirtualAddr - dynSeg->GetStart () + dynSeg->GetDataOffset ());
786788
787- Elf64SectionHeader reloca, plt, rel;
788- memset (&reloca, 0 , sizeof (reloca));
789+ Elf64SectionHeader plt;
789790 memset (&plt, 0 , sizeof (plt));
790- memset (&rel, 0 , sizeof (rel));
791791 uint64_t pltType = ELF_DT_RELA;
792792 bool end = false ;
793793 uint64_t entrySize = m_elf32 ? 8 : 16 ;
@@ -852,25 +852,25 @@ bool ElfView::Init()
852852 m_gnuHashHeader = value + imageBaseAdjustment;
853853 break ;
854854 case ELF_DT_RELA:
855- reloca .offset = value + imageBaseAdjustment;
855+ m_relocaSection .offset = value + imageBaseAdjustment;
856856 break ;
857857 case ELF_DT_RELASZ:
858- reloca .size = value;
858+ m_relocaSection .size = value;
859859 break ;
860860 case ELF_DT_RELAENT:
861- reloca .entrySize = value;
861+ m_relocaSection .entrySize = value;
862862 break ;
863863 case ELF_DT_STRSZ:
864864 m_dynamicStringTable.size = value;
865865 break ;
866866 case ELF_DT_REL:
867- rel .offset = value + imageBaseAdjustment;
867+ m_relocSection .offset = value + imageBaseAdjustment;
868868 break ;
869869 case ELF_DT_RELSZ:
870- rel .size = value;
870+ m_relocSection .size = value;
871871 break ;
872872 case ELF_DT_RELENT:
873- rel .entrySize = value;
873+ m_relocSection .entrySize = value;
874874 break ;
875875 case ELF_DT_PLTGOT:
876876 gotStart = value + imageBaseAdjustment;
@@ -925,16 +925,17 @@ bool ElfView::Init()
925925 StoreMetadata (" Libraries" , new Metadata (libraries), true );
926926 StoreMetadata (" LibraryFound" , new Metadata (libraryFound), true );
927927
928- if (reloca .size > 0 )
928+ if (m_relocaSection .size > 0 )
929929 {
930930 bool alreadyExists = false ;
931931 for (auto & relSec : relocASections)
932- if (relSec.offset == reloca .offset )
932+ if (relSec.offset == m_relocaSection .offset )
933933 alreadyExists = true ;
934934 if (!alreadyExists)
935935 {
936- dynRelocASections.push_back (reloca);
937- AddAutoSection (" .dynamic_rela" , reloca.offset , reloca.size , ReadOnlyDataSectionSemantics);
936+ dynRelocASections.push_back (m_relocaSection);
937+ AddAutoSection (
938+ " .dynamic_rela" , m_relocaSection.offset , m_relocaSection.size , ReadOnlyDataSectionSemantics);
938939 }
939940 }
940941 if (plt.size > 0 )
@@ -964,16 +965,17 @@ bool ElfView::Init()
964965 }
965966 }
966967 }
967- if (rel .size > 0 )
968+ if (m_relocSection .size > 0 )
968969 {
969970 bool alreadyExists = false ;
970971 for (auto & relSec : relocSections)
971- if ((relSec.address + imageBaseAdjustment) == rel .offset )
972+ if ((relSec.address + imageBaseAdjustment) == m_relocSection .offset )
972973 alreadyExists = true ;
973974 if (!alreadyExists)
974975 {
975- dynRelocSections.push_back (rel);
976- AddAutoSection (" .dynamic_rel" , rel.offset , rel.size , ReadOnlyDataSectionSemantics);
976+ dynRelocSections.push_back (m_relocSection);
977+ AddAutoSection (
978+ " .dynamic_rel" , m_relocSection.offset , m_relocSection.size , ReadOnlyDataSectionSemantics);
977979 }
978980 }
979981 }
@@ -2237,6 +2239,58 @@ bool ElfView::Init()
22372239 }
22382240 }
22392241
2242+ if (m_relocSection.size )
2243+ {
2244+ StructureBuilder relocationTableBuilder;
2245+ if (m_elf32)
2246+ {
2247+ relocationTableBuilder.AddMember (Type::IntegerType (4 , false ), " r_offset" );
2248+ relocationTableBuilder.AddMember (Type::IntegerType (4 , false ), " r_info" );
2249+ }
2250+ else
2251+ {
2252+ relocationTableBuilder.AddMember (Type::IntegerType (8 , false ), " r_offset" );
2253+ relocationTableBuilder.AddMember (Type::IntegerType (8 , false ), " r_info" );
2254+ };
2255+ Ref<Structure> relocationTableStruct = relocationTableBuilder.Finalize ();
2256+ Ref<Type> relocationTableType = Type::StructureType (relocationTableStruct);
2257+ QualifiedName relocationTableName = m_elf32 ? string (" Elf32_Rel" ) : string (" Elf64_Rel" );
2258+ const string relocationTableTypeId = Type::GenerateAutoTypeId (" elf" , relocationTableName);
2259+
2260+ QualifiedName relocTableTypeName = DefineType (relocationTableTypeId, relocationTableName, relocationTableType);
2261+ DefineDataVariable (m_relocSection.offset ,
2262+ Type::ArrayType (Type::NamedType (this , relocTableTypeName), m_relocSection.size / m_relocSection.entrySize ));
2263+ DefineAutoSymbol (new Symbol (DataSymbol, " __elf_rel_table" , m_relocSection.offset , NoBinding));
2264+ }
2265+
2266+ if (m_relocaSection.size )
2267+ {
2268+ StructureBuilder relocationATableBuilder;
2269+ if (m_elf32)
2270+ {
2271+ relocationATableBuilder.AddMember (Type::IntegerType (4 , false ), " r_offset" );
2272+ relocationATableBuilder.AddMember (Type::IntegerType (4 , false ), " r_info" );
2273+ relocationATableBuilder.AddMember (Type::IntegerType (4 , true ), " r_addend" );
2274+ }
2275+ else
2276+ {
2277+ relocationATableBuilder.AddMember (Type::IntegerType (8 , false ), " r_offset" );
2278+ relocationATableBuilder.AddMember (Type::IntegerType (8 , false ), " r_info" );
2279+ relocationATableBuilder.AddMember (Type::IntegerType (8 , true ), " r_addend" );
2280+ };
2281+ Ref<Structure> relocationATableStruct = relocationATableBuilder.Finalize ();
2282+ Ref<Type> relocationATableType = Type::StructureType (relocationATableStruct);
2283+ QualifiedName relocationATableName = m_elf32 ? string (" Elf32_Rela" ) : string (" Elf64_Rela" );
2284+ const string relocationATableTypeId = Type::GenerateAutoTypeId (" elf" , relocationATableName);
2285+
2286+ QualifiedName relocaTableTypeName =
2287+ DefineType (relocationATableTypeId, relocationATableName, relocationATableType);
2288+ DefineDataVariable (m_relocaSection.offset ,
2289+ Type::ArrayType (
2290+ Type::NamedType (this , relocaTableTypeName), m_relocaSection.size / m_relocaSection.entrySize ));
2291+ DefineAutoSymbol (new Symbol (DataSymbol, " __elf_rela_table" , m_relocaSection.offset , NoBinding));
2292+ }
2293+
22402294 // In 32-bit mips with .got, add .extern symbol "RTL_Resolve"
22412295 if (gotStart && In (m_arch->GetName (), {" mips32" , " mipsel32" , " mips64" , " nanomips" }))
22422296 {
0 commit comments