summaryrefslogtreecommitdiff
path: root/le/le_parse_util.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'le/le_parse_util.cpp')
-rw-r--r--le/le_parse_util.cpp98
1 files changed, 62 insertions, 36 deletions
diff --git a/le/le_parse_util.cpp b/le/le_parse_util.cpp
index 003c953..4455d24 100644
--- a/le/le_parse_util.cpp
+++ b/le/le_parse_util.cpp
@@ -1,5 +1,8 @@
#include "le_parse_util.hpp"
+#include <sstream>
+#include <iomanip>
+
#include <boost/assert.hpp>
#include "parse.hpp"
@@ -34,37 +37,65 @@ le::File parse_file(std::istream& is)
return file;
}
-void relocate(std::vector<le::FixupRecordTable::Entry> fixups, uint8_t* binary, binparse::Value32 page_nr, le::File const& file) {
- binparse::Offset32 page_offset;
- for(auto&& object : file.object_table.entries) {
- if(page_nr >= object.second.page_table_index && page_nr < object.second.page_table_index + object.second.nr_page_table_entries) {
- page_offset = object.second.reloc_base_address;
- page_offset += ((page_nr - 1) - object.second.page_table_index) * file.le_header.page_size;
- break;
- }
- }
-
- for(auto&& fixup : fixups) {
- auto internal = boost::get<le::FixupRecordTable::Entry::Internal>(fixup.data);
-
- auto source_offset = boost::get<binparse::Offset16>(fixup.source_offset_or_source_list_count);
-
- auto target_object = boost::get<binparse::Value8>(internal.object_number);
-
- auto binary_offset = page_offset + (int32_t) source_offset;
-
- binparse::Offset32 dest_offset;
- if(bit(4, fixup.target_flags)) {
- dest_offset = boost::get<binparse::Offset32>(internal.target_offset);
- } else {
- dest_offset = binparse::Offset32(boost::get<binparse::Offset16>(internal.target_offset));
- }
- dest_offset += file.object_table.entries.at(target_object).reloc_base_address;
- for(int i = 0; i < 4; ++i) {
- uint8_t& byte = *(binary + binary_offset + i);
- byte = ((dest_offset >> (i * 8)) & 255);
- }
- }
+//works only for relocation type 7 (internal) (source flags == 7)
+void relocate(le::File const& file, std::vector<uint8_t>& binary, binparse::Offset32 offset) {
+ for(auto&& entry : file.fixup_record_table.entries) {
+ auto&& page_nr = entry.first;
+ auto&& fixups = entry.second;
+
+ std::cout << "page_nr: " << page_nr << std::endl;
+ binparse::Offset32 page_offset;
+ for(auto&& object : file.object_table.entries) {
+ if(page_nr >= object.second.page_table_index && page_nr < object.second.page_table_index + object.second.nr_page_table_entries) {
+ page_offset = object.second.reloc_base_address;
+ //both page_nr and page_table_index are 1-indexed so this subtraction works out.
+ page_offset += (page_nr - object.second.page_table_index) * file.le_header.page_size;
+ break;
+ }
+ }
+
+ std::cout << "Page_offset: " << page_offset << std::endl;
+
+ for(auto&& fixup : fixups) {
+ auto internal = boost::get<le::FixupRecordTable::Entry::Internal>(fixup.data);
+
+ auto source_offset = boost::get<binparse::Offset16>(fixup.source_offset_or_source_list_count);
+
+ auto target_object = boost::get<binparse::Value8>(internal.object_number);
+
+ auto binary_offset = page_offset + source_offset;
+
+ binparse::Offset32 dest_offset;
+ if(bit(4, fixup.target_flags)) {
+ dest_offset = boost::get<binparse::Offset32>(internal.target_offset);
+ } else {
+ dest_offset = binparse::Offset32(boost::get<binparse::Offset16>(internal.target_offset));
+ }
+ dest_offset += file.object_table.entries.at(target_object).reloc_base_address;
+ dest_offset += offset;
+
+ std::stringstream byte_stream;
+ std::stringstream fixup_stream;
+
+ for(int i = 3; i >= 0; --i) {
+ uint8_t& byte = *(binary.data() + binary_offset + i);
+ const uint8_t fixup_byte = (dest_offset >> (i * 8)) & 255;
+
+ byte_stream << std::hex << std::setw(2) << std::setfill('0') << (unsigned int) byte;
+ fixup_stream << std::hex << std::setw(2) << std::setfill('0') << (unsigned int) fixup_byte;
+
+ byte = fixup_byte;
+ }
+
+ std::cout << fixup << std::endl;
+
+ std::cout <<
+ "Fixup ("
+ << std::hex << binary_offset <<
+ "): " << byte_stream.str() << " => " << fixup_stream.str() << std::endl;
+
+ }
+ }
}
size_t determine_binary_size(le::File const& file) {
@@ -93,11 +124,6 @@ static void load_binary_into(le::File const& file, uint8_t* buffer, size_t buffe
std::copy(page.begin(), page.end(), buffer + dest_offset);
}
}
-
- for(auto&& entry : file.fixup_record_table.entries) {
- auto&& relocation = entry.second;
- relocate(relocation, buffer, entry.first, file);
- }
}
std::vector<uint8_t> load_binary(le::File const& file)