From 236dc538b0692c14fe1d3a6b349736132dedb197 Mon Sep 17 00:00:00 2001 From: Kelvin Sherlock Date: Sat, 14 Dec 2019 19:09:47 -0500 Subject: [PATCH] bug fixes. - didn't generate SUPER for 3-byte, no shift interseg - labels not properly truncated at 255. --- omf.cpp | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/omf.cpp b/omf.cpp index 48b3aef..224df5f 100644 --- a/omf.cpp +++ b/omf.cpp @@ -63,6 +63,9 @@ struct omf_express_header { #pragma pack(pop) +static_assert(sizeof(omf_header) == 44, "OMF Header not packed"); +static_assert(sizeof(omf_express_header) == 48, "OMF Express Header not packed"); + void push(std::vector &v, uint8_t x) { v.push_back(x); } @@ -86,7 +89,7 @@ void push(std::vector &v, uint32_t x) { void push(std::vector &v, const std::string &s) { uint8_t count = std::min((int)s.size(), 255); push(v, count); - v.insert(v.end(), s.begin(), s.end()); + v.insert(v.end(), s.begin(), s.begin() + count); } class super_helper { @@ -201,9 +204,9 @@ uint32_t add_relocs(std::vector &data, size_t data_offset, omf::segment auto &sr = ss[n]; if (!sr) sr.emplace(); + sr->append(r.offset); uint32_t value = r.value; - sr->append(r.offset); for (int i = 0; i < 2; ++i, value >>= 8) data[data_offset + r.offset + i] = value; continue; @@ -217,9 +220,9 @@ uint32_t add_relocs(std::vector &data, size_t data_offset, omf::segment auto &sr = ss[n]; if (!sr) sr.emplace(); + sr->append(r.offset); uint32_t value = r.value; - sr->append(r.offset); for (int i = 0; i < 3; ++i, value >>= 8) data[data_offset + r.offset + i] = value; continue; @@ -231,9 +234,9 @@ uint32_t add_relocs(std::vector &data, size_t data_offset, omf::segment int n = SUPER_INTERSEG24 + seg.segnum; auto &sr = ss[n]; if (!sr) sr.emplace(); + sr->append(r.offset); uint32_t value = r.value; - sr->append(r.offset); for (int i = 0; i < 2; ++i, value >>= 8) data[data_offset + r.offset + i] = value; continue; @@ -265,8 +268,10 @@ uint32_t add_relocs(std::vector &data, size_t data_offset, omf::segment constexpr int n = SUPER_INTERSEG1; auto &sr = ss[n]; if (!sr) sr.emplace(); + sr->append(r.offset); uint32_t value = r.segment_offset; + data[data_offset + r.offset + 0] = value; value >>= 8; data[data_offset + r.offset + 1] = value; value >>= 8; data[data_offset + r.offset + 2] = r.segment; @@ -279,9 +284,9 @@ uint32_t add_relocs(std::vector &data, size_t data_offset, omf::segment int n = SUPER_INTERSEG12 + r.segment; auto &sr = ss[n]; if (!sr) sr.emplace(); + sr->append(r.offset); uint32_t value = r.segment_offset; - sr->append(r.offset); for (int i = 0; i < 2; ++i, value >>= 8) data[data_offset + r.offset + i] = value; continue; @@ -292,9 +297,9 @@ uint32_t add_relocs(std::vector &data, size_t data_offset, omf::segment int n = SUPER_INTERSEG24 + r.segment; auto &sr = ss[n]; if (!sr) sr.emplace(); + sr->append(r.offset); uint32_t value = r.segment_offset; - sr->append(r.offset); for (int i = 0; i < 2; ++i, value >>= 8) data[data_offset + r.offset + i] = value; continue; @@ -501,4 +506,5 @@ void save_omf(const std::string &path, std::vector &segments, bool } close(fd); -} \ No newline at end of file +} +