diff --git a/tools/elf2rpl/main.cpp b/tools/elf2rpl/main.cpp index 4f253644c..688d47906 100644 --- a/tools/elf2rpl/main.cpp +++ b/tools/elf2rpl/main.cpp @@ -616,7 +616,7 @@ calculateSectionOffsets(ElfFile &file) } // Next the "readMin / readMax" sections, which are: - // - !(flags & SHF_EXECINSTR) || type == SHT_RPL_EXPORTS || type == SHT_RPL_IMPORTS + // - !(flags & SHF_EXECINSTR) || type == SHT_RPL_EXPORTS // - !(flags & SHF_WRITE) // - flags & SHF_ALLOC for (auto §ion : file.sections) { @@ -629,8 +629,7 @@ calculateSectionOffsets(ElfFile &file) } if ((!(section->header.flags & elf::SHF_EXECINSTR) || - section->header.type == elf::SHT_RPL_EXPORTS || - section->header.type == elf::SHT_RPL_IMPORTS) && + section->header.type == elf::SHT_RPL_EXPORTS) && !(section->header.flags & elf::SHF_WRITE) && (section->header.flags & elf::SHF_ALLOC)) { section->header.offset = offset; @@ -639,6 +638,16 @@ calculateSectionOffsets(ElfFile &file) } } + // Import sections are part of the read sections, but have execinstr flag set + // so let's insert them here to avoid complicating the above logic. + for (auto §ion : file.sections) { + if (section->header.type == elf::SHT_RPL_IMPORTS) { + section->header.offset = offset; + section->header.size = static_cast(section->data.size()); + offset += section->header.size; + } + } + // Next the "textMin / textMax" sections, which are: // - flags & SHF_EXECINSTR // - type != SHT_RPL_EXPORTS