diff --git a/src/AnalThread.cpp b/src/AnalThread.cpp index ccef9466..73e8d82b 100644 --- a/src/AnalThread.cpp +++ b/src/AnalThread.cpp @@ -92,6 +92,11 @@ void AnalThread::run() core->loadPDB(ui->pdbLineEdit->text()); } + if (optionsDialog->getSelectedEndianness() != OptionsDialog::Endianness::Auto) + { + core->setEndianness(optionsDialog->getSelectedEndianness() == OptionsDialog::Endianness::Big); + } + // use prj.simple as default as long as regular projects are broken core->setConfig("prj.simple", true); diff --git a/src/cutter.cpp b/src/cutter.cpp index ea6d8488..60011789 100644 --- a/src/cutter.cpp +++ b/src/cutter.cpp @@ -559,6 +559,11 @@ void CutterCore::setCPU(QString arch, QString cpu, int bits, bool temporary) } } +void CutterCore::setEndianness(bool big) +{ + setConfig("cfg.bigendian", big); +} + void CutterCore::setDefaultCPU() { if (!default_arch.isEmpty()) diff --git a/src/cutter.h b/src/cutter.h index 6c3263a3..372b3a49 100644 --- a/src/cutter.h +++ b/src/cutter.h @@ -283,6 +283,7 @@ public: QString disassembleSingleInstruction(RVA addr); void setDefaultCPU(); void setCPU(QString arch, QString cpu, int bits, bool temporary = false); + void setEndianness(bool big); RAnalFunction *functionAt(ut64 addr); QString cmdFunctionAt(QString addr); QString cmdFunctionAt(RVA addr); diff --git a/src/dialogs/OptionsDialog.cpp b/src/dialogs/OptionsDialog.cpp index 31b19086..df7f2e16 100644 --- a/src/dialogs/OptionsDialog.cpp +++ b/src/dialogs/OptionsDialog.cpp @@ -120,6 +120,19 @@ int OptionsDialog::getSelectedBits() return 0; } +OptionsDialog::Endianness OptionsDialog::getSelectedEndianness() +{ + switch(ui->endiannessComboBox->currentIndex()) + { + case 1: + return Endianness::Little; + case 2: + return Endianness::Big; + default: + return Endianness::Auto; + } +} + QString OptionsDialog::getSelectedOS() { QVariant os = ui->kernelComboBox->currentData(); diff --git a/src/dialogs/OptionsDialog.h b/src/dialogs/OptionsDialog.h index d5708be1..ef1ab174 100644 --- a/src/dialogs/OptionsDialog.h +++ b/src/dialogs/OptionsDialog.h @@ -53,10 +53,14 @@ private: void setInteractionEnabled(bool enabled); public: + enum class Endianness { Auto, Little, Big }; + std::unique_ptr ui; + QString getSelectedArch(); QString getSelectedCPU(); int getSelectedBits(); + Endianness getSelectedEndianness(); QString getSelectedOS(); QTimer analTimer; QElapsedTimer analElapsedTimer; diff --git a/src/dialogs/OptionsDialog.ui b/src/dialogs/OptionsDialog.ui index 2c8addbe..2cdda856 100644 --- a/src/dialogs/OptionsDialog.ui +++ b/src/dialogs/OptionsDialog.ui @@ -225,9 +225,9 @@ 0 - 0 - 564 - 805 + -611 + 565 + 856 @@ -601,6 +601,13 @@ + + + + + + 0 + @@ -643,6 +650,44 @@ + + + + + 0 + 0 + + + + Endianness: + + + + + + + false + + + Auto + + + + Auto + + + + + Little + + + + + Big + + + +