diff --git a/irdb-libs/rida/rida.cpp b/irdb-libs/rida/rida.cpp index ed5064372430ac773e6ce834b1a67c342ebb5d2e..471d5b8e1cc8b9d58cb2522a989d6ec57d192d1d 100644 --- a/irdb-libs/rida/rida.cpp +++ b/irdb-libs/rida/rida.cpp @@ -74,9 +74,10 @@ class CreateFunctions_t } const auto cs_mode= - machine_type==mtAarch64 ? CS_MODE_LITTLE_ENDIAN : - file_class==ELF64 ? CS_MODE_64 : - file_class==ELF32 ? CS_MODE_32 : + machine_type == mtArm32 ? CS_MODE_LITTLE_ENDIAN : + machine_type == mtAarch64 ? CS_MODE_LITTLE_ENDIAN : + file_class == ELF64 ? CS_MODE_64 : + file_class == ELF32 ? CS_MODE_32 : throw std::runtime_error("Cannot handle ELF class"); const auto my_cs_arch = @@ -394,7 +395,7 @@ class CreateFunctions_t addName(i,dynsymEntryIndex++); } }; - const auto handle_arm_plt=[&]() + const auto handle_arm64_plt=[&]() { const auto plt_entry_size=16; const auto plt_header_size=8*4; @@ -406,6 +407,18 @@ class CreateFunctions_t addName(i,dynsymEntryIndex++); } }; + const auto handle_arm32_plt=[&]() + { + const auto plt_entry_size=3*4; // 3 instructions + const auto plt_header_size=5*4; // 5 instructions + + addRange(startAddr,plt_header_size); + for(auto i=startAddr+plt_header_size; i<endAddr; i+=plt_entry_size) + { + addRange(i,plt_entry_size); + addName(i,dynsymEntryIndex++); + } + }; switch(machine_type) { @@ -414,7 +427,10 @@ class CreateFunctions_t handle_x86_plt(); break; case mtAarch64: - handle_arm_plt(); + handle_arm64_plt(); + break; + case mtArm32: + handle_arm32_plt(); break; default: assert(0);