diff --git a/.github/workflows/windows-builds.yml b/.github/workflows/windows-builds.yml index 34534ced..1b4b5b0b 100644 --- a/.github/workflows/windows-builds.yml +++ b/.github/workflows/windows-builds.yml @@ -41,4 +41,4 @@ jobs: - name: Test # Disable parallel test runs on GitHub runners due to resource constraints - run: ctest --preset=${{ matrix.preset }} --parallel 1 + run: ctest --preset=${{ matrix.preset }} --parallel 1 \ No newline at end of file diff --git a/systemc-components/common/include/loader.h b/systemc-components/common/include/loader.h index a16c6b7e..e3adc5e1 100644 --- a/systemc-components/common/include/loader.h +++ b/systemc-components/common/include/loader.h @@ -645,7 +645,14 @@ class loader : public sc_core::sc_module { if (elf_version(EV_CURRENT) == EV_NONE) SCP_FATAL("elf_reader") << "failed to read libelf version"; +#ifdef _WIN32 + // On Windows, open() defaults to text mode which can corrupt binary files (e.g. .so, .skel.so) during ELF loading. + // O_BINARY forces raw binary reads to prevent this. + m_fd = open(filename(), O_RDONLY | O_BINARY, 0); +#else m_fd = open(filename(), O_RDONLY, 0); +#endif + if (m_fd < 0) SCP_FATAL("elf_reader") << "cannot open elf file " << filename(); Elf* elf = elf_begin(m_fd, ELF_C_READ, nullptr); diff --git a/tests/components/loader/loader-test.cc b/tests/components/loader/loader-test.cc index 36f651c3..d268b0b9 100644 --- a/tests/components/loader/loader-test.cc +++ b/tests/components/loader/loader-test.cc @@ -25,6 +25,14 @@ TEST_BENCH(LoaderTest, SimpleReadELFFile) ASSERT_EQ(m_initiator.do_read(0x0000, data), tlm::TLM_OK_RESPONSE); ASSERT_EQ(data, 0xaf); + + /* CRLF bytes at offset 0x0004-0x0005: without O_BINARY on Windows, 0x0D 0x0A + * is collapsed to 0x0A by the CRT text-mode translation, corrupting the data. */ + ASSERT_EQ(m_initiator.do_read(0x0004, data), tlm::TLM_OK_RESPONSE); + ASSERT_EQ(data, 0x0d); + + ASSERT_EQ(m_initiator.do_read(0x0005, data), tlm::TLM_OK_RESPONSE); + ASSERT_EQ(data, 0x0a); } TEST_BENCH(LoaderTest, SimpleReadData) diff --git a/tests/components/loader/src/loader-test.asm b/tests/components/loader/src/loader-test.asm index 690834fa..563a64fb 100644 --- a/tests/components/loader/src/loader-test.asm +++ b/tests/components/loader/src/loader-test.asm @@ -1,2 +1,3 @@ .section .data .word 0xdeadbeaf +.byte 0x0D, 0x0A /* CRLF: collapsed to 0x0A in Windows text mode without O_BINARY */ diff --git a/tests/components/loader/src/loader-test.bin b/tests/components/loader/src/loader-test.bin index b296cb08..47ebc34e 100755 --- a/tests/components/loader/src/loader-test.bin +++ b/tests/components/loader/src/loader-test.bin @@ -1 +1 @@ -¯¾­Þ \ No newline at end of file +¯¾­Þ diff --git a/tests/components/loader/src/loader-test.elf b/tests/components/loader/src/loader-test.elf index 60b5298f..daaba7aa 100755 Binary files a/tests/components/loader/src/loader-test.elf and b/tests/components/loader/src/loader-test.elf differ