#include #include #include #include #include "mem.hpp" int main(int argc, char **argv) { ELFIO::elfio reader; weee::core::mem mem; cflags::cflags flags; flags.add_string_callback('\0', "elf", [&](const std::string &v) { reader.load(v); }, "ELF binary to load"); if (!flags.parse(argc, argv)) return -1; size_t sanity_bss_check_count = 0; for (const auto &segment : reader.segments) { const auto segment_type = segment->get_type(); if (segment_type != ELFIO::PT_LOAD && segment_type != ELFIO::PT_TLS && segment_type != ELFIO::PT_NOTE) continue; if (segment->get_memory_size() == 0) continue; const bool exc = segment->get_flags() & ELFIO::PF_X; const bool rd = segment->get_flags() & ELFIO::PF_R; const bool wr = segment->get_flags() & ELFIO::PF_W; std::println("Segment {} {}{}{} @ 0x{:08X} -> 0x{:08X}", segment->get_index(), rd ? 'R' : '_', wr ? 'W' : '_', exc ? 'X' : '_', segment->get_virtual_address(), segment->get_virtual_address() + segment->get_memory_size() - 1); if (segment->get_file_size() == 0) { sanity_bss_check_count++; if (sanity_bss_check_count > 1) { std::println("weee does not support multiple .bss segments"); return -2; } // .bss we zero out mem.set(0, segment->get_memory_size(), segment->get_virtual_address() & 0x0FFFFFFF); continue; } mem.copy((const ircolib::u8 *)segment->get_data(), segment->get_file_size(), segment->get_virtual_address() & 0x0FFFFFFF); } return 0; }