From 54bfdd1040c08db57f361efbf97cf311b9fe2ff9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C3=ABl=20Hauspie?= <michael.hauspie@univ-lille.fr>
Date: Fri, 7 Jun 2024 16:56:11 +0200
Subject: [PATCH] Add crt0 binary export

---
 src/link.rs | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/src/link.rs b/src/link.rs
index 93245e9..577ed3d 100644
--- a/src/link.rs
+++ b/src/link.rs
@@ -25,6 +25,7 @@ use std::io::Write;
 const PADDING_SIZE: usize = 32;
 const PADDING_BUFFER: [u8; PADDING_SIZE] = [0xff; PADDING_SIZE];
 const PIP_EXPORT_SECTIONS: &'static [&str] = &[".vector_table", ".text", ".data"];
+const CRT0_EXPORT_SECTIONS: &'static [&str] = &[".text", ".rodata", ".ARM.exidx"];
 
 /// Options for the link subcommand
 #[derive(Parser, Debug)]
@@ -80,7 +81,7 @@ pub fn link(opts: Opts) -> Result<()> {
 
     let crt0_elf_file = std::fs::read(&opts.crt0_elf)?;
     let crt0_elf_data = crt0_elf_file.as_slice();
-    let _crt0_elf = elf::ElfBytes::<AnyEndian>::minimal_parse(crt0_elf_data)?;
+    let crt0_elf = elf::ElfBytes::<AnyEndian>::minimal_parse(crt0_elf_data)?;
 
     let user_code_elf_file = std::fs::read(&opts.user_code_elf)?;
     let user_code_elf_data = user_code_elf_file.as_slice();
@@ -109,6 +110,10 @@ pub fn link(opts: Opts) -> Result<()> {
             output.write_all(&PADDING_BUFFER[0..pad_bytes])?;
         }
     }
+    // Then, dump crt0
+    // no need for output size here, padding is not necessary for crt0
+    dump_sections(&crt0_elf, CRT0_EXPORT_SECTIONS, &mut output)?;
+    
     Ok(())
 }
 
-- 
GitLab