diff --git a/main.cpp b/main.cpp index c8252ec..fd0243f 100644 --- a/main.cpp +++ b/main.cpp @@ -2,18 +2,34 @@ #include #include -int main() { +int main(int argc, char **argv) { ELFIO::elfio reader; - if (!reader.load("tests/elf/application.elf")) + if (!reader.load("tests/application/application.elf")) return 1; - for (const auto §ion : reader.sections) { - for (const auto &segment : reader.segments) { - if (ircolib::IsInsideRange(section->get_address(), segment->get_virtual_address(), - segment->get_virtual_address() + segment->get_memory_size() - 1)) - std::println("Found section {} @ 0x{:08X} -> 0x{:08X}", section->get_index(), section->get_address(), - section->get_address() + section->get_size() - 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; + + 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"); } + + 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); } return 0;