Эх сурвалжийг харах

Merge branch 'master' into fix/regression-tests

bidhan-a 3 өдөр өмнө
parent
commit
d75b6bb208

+ 43 - 10
crates/assembler/src/program.rs

@@ -114,6 +114,7 @@ impl Program {
                     rel_dyns.push(RelDyn::new(offset + elf_header.e_entry, rel_type as u64, 0));
                     rel_dyns.push(RelDyn::new(offset + elf_header.e_entry, rel_type as u64, 0));
                 }
                 }
             }
             }
+            // create four dynamic related sections
             let mut dynamic_section = SectionType::Dynamic(DynamicSection::new(
             let mut dynamic_section = SectionType::Dynamic(DynamicSection::new(
                 (section_names
                 (section_names
                     .iter()
                     .iter()
@@ -121,11 +122,6 @@ impl Program {
                     .sum::<usize>()
                     .sum::<usize>()
                     + 1) as u32,
                     + 1) as u32,
             ));
             ));
-            dynamic_section.set_offset(current_offset);
-            if let SectionType::Dynamic(ref mut dynamic_section) = dynamic_section {
-                dynamic_section.set_rel_count(rel_count);
-            }
-            current_offset += dynamic_section.size();
             section_names.push(dynamic_section.name().to_string());
             section_names.push(dynamic_section.name().to_string());
 
 
             let mut dynsym_section = SectionType::DynSym(DynSymSection::new(
             let mut dynsym_section = SectionType::DynSym(DynSymSection::new(
@@ -136,8 +132,6 @@ impl Program {
                     + 1) as u32,
                     + 1) as u32,
                 dyn_syms,
                 dyn_syms,
             ));
             ));
-            dynsym_section.set_offset(current_offset);
-            current_offset += dynsym_section.size();
             section_names.push(dynsym_section.name().to_string());
             section_names.push(dynsym_section.name().to_string());
 
 
             let mut dynstr_section = SectionType::DynStr(DynStrSection::new(
             let mut dynstr_section = SectionType::DynStr(DynStrSection::new(
@@ -148,8 +142,6 @@ impl Program {
                     + 1) as u32,
                     + 1) as u32,
                 symbol_names,
                 symbol_names,
             ));
             ));
-            dynstr_section.set_offset(current_offset);
-            current_offset += dynstr_section.size();
             section_names.push(dynstr_section.name().to_string());
             section_names.push(dynstr_section.name().to_string());
 
 
             let mut rel_dyn_section = SectionType::RelDyn(RelDynSection::new(
             let mut rel_dyn_section = SectionType::RelDyn(RelDynSection::new(
@@ -160,9 +152,50 @@ impl Program {
                     + 1) as u32,
                     + 1) as u32,
                 rel_dyns,
                 rel_dyns,
             ));
             ));
+            section_names.push(rel_dyn_section.name().to_string());
+
+            dynamic_section.set_offset(current_offset);
+            if let SectionType::Dynamic(ref mut dynamic_section) = dynamic_section {
+                // link to .dynstr
+                dynamic_section.set_link(
+                    section_names
+                        .iter()
+                        .position(|name| name == ".dynstr")
+                        .expect("missing .dynstr section") as u32
+                        + 1,
+                );
+                dynamic_section.set_rel_count(rel_count);
+            }
+            current_offset += dynamic_section.size();
+
+            dynsym_section.set_offset(current_offset);
+            if let SectionType::DynSym(ref mut dynsym_section) = dynsym_section {
+                // link to .dynstr
+                dynsym_section.set_link(
+                    section_names
+                        .iter()
+                        .position(|name| name == ".dynstr")
+                        .expect("missing .dynstr section") as u32
+                        + 1,
+                );
+            }
+            current_offset += dynsym_section.size();
+
+            dynstr_section.set_offset(current_offset);
+            current_offset += dynstr_section.size();
+
             rel_dyn_section.set_offset(current_offset);
             rel_dyn_section.set_offset(current_offset);
+            if let SectionType::RelDyn(ref mut rel_dyn_section) = rel_dyn_section {
+                // link to .dynsym
+                rel_dyn_section.set_link(
+                    section_names
+                        .iter()
+                        .position(|name| name == ".dynsym")
+                        .expect("missing .dynsym section") as u32
+                        + 1,
+                );
+            }
             current_offset += rel_dyn_section.size();
             current_offset += rel_dyn_section.size();
-            section_names.push(rel_dyn_section.name().to_string());
 
 
             if let SectionType::Dynamic(ref mut dynamic_section) = dynamic_section {
             if let SectionType::Dynamic(ref mut dynamic_section) = dynamic_section {
                 dynamic_section.set_rel_offset(rel_dyn_section.offset());
                 dynamic_section.set_rel_offset(rel_dyn_section.offset());

+ 21 - 3
crates/assembler/src/section.rs

@@ -309,6 +309,7 @@ pub struct DynamicSection {
     name: String,
     name: String,
     name_offset: u32,
     name_offset: u32,
     offset: u64,
     offset: u64,
+    link: u32,
     rel_offset: u64,
     rel_offset: u64,
     rel_size: u64,
     rel_size: u64,
     rel_count: u64,
     rel_count: u64,
@@ -323,6 +324,7 @@ impl DynamicSection {
             name: String::from(".dynamic"),
             name: String::from(".dynamic"),
             name_offset,
             name_offset,
             offset: 0,
             offset: 0,
+            link: 0,
             rel_offset: 0,
             rel_offset: 0,
             rel_size: 0,
             rel_size: 0,
             rel_count: 0,
             rel_count: 0,
@@ -336,6 +338,10 @@ impl DynamicSection {
         self.offset = offset;
         self.offset = offset;
     }
     }
 
 
+    pub fn set_link(&mut self, link: u32) {
+        self.link = link;
+    }
+
     pub fn set_rel_offset(&mut self, offset: u64) {
     pub fn set_rel_offset(&mut self, offset: u64) {
         self.rel_offset = offset;
         self.rel_offset = offset;
     }
     }
@@ -368,7 +374,7 @@ impl DynamicSection {
             self.offset,
             self.offset,
             self.offset,
             self.offset,
             self.size(),
             self.size(),
-            5,
+            self.link,
             0,
             0,
             8,
             8,
             16,
             16,
@@ -520,6 +526,7 @@ pub struct DynSymSection {
     name: String,
     name: String,
     name_offset: u32,
     name_offset: u32,
     offset: u64,
     offset: u64,
+    link: u32,
     symbols: Vec<DynamicSymbol>,
     symbols: Vec<DynamicSymbol>,
 }
 }
 
 
@@ -529,6 +536,7 @@ impl DynSymSection {
             name: String::from(".dynsym"),
             name: String::from(".dynsym"),
             name_offset,
             name_offset,
             offset: 0,
             offset: 0,
+            link: 0,
             symbols,
             symbols,
         }
         }
     }
     }
@@ -537,6 +545,10 @@ impl DynSymSection {
         self.offset = offset;
         self.offset = offset;
     }
     }
 
 
+    pub fn set_link(&mut self, link: u32) {
+        self.link = link;
+    }
+
     pub fn section_header_bytecode(&self) -> Vec<u8> {
     pub fn section_header_bytecode(&self) -> Vec<u8> {
         let flags = SectionHeader::SHF_ALLOC;
         let flags = SectionHeader::SHF_ALLOC;
         SectionHeader::new(
         SectionHeader::new(
@@ -546,7 +558,7 @@ impl DynSymSection {
             self.offset,
             self.offset,
             self.offset,
             self.offset,
             self.size(),
             self.size(),
-            5,
+            self.link,
             1,
             1,
             8,
             8,
             24,
             24,
@@ -579,6 +591,7 @@ pub struct RelDynSection {
     name: String,
     name: String,
     name_offset: u32,
     name_offset: u32,
     offset: u64,
     offset: u64,
+    link: u32,
     entries: Vec<RelDyn>,
     entries: Vec<RelDyn>,
 }
 }
 
 
@@ -588,6 +601,7 @@ impl RelDynSection {
             name: String::from(".rel.dyn"),
             name: String::from(".rel.dyn"),
             name_offset,
             name_offset,
             offset: 0,
             offset: 0,
+            link: 0,
             entries,
             entries,
         }
         }
     }
     }
@@ -596,6 +610,10 @@ impl RelDynSection {
         self.offset = offset;
         self.offset = offset;
     }
     }
 
 
+    pub fn set_link(&mut self, link: u32) {
+        self.link = link;
+    }
+
     pub fn size(&self) -> u64 {
     pub fn size(&self) -> u64 {
         (self.entries.len() * 16) as u64 // Each RelDyn entry is 16 bytes
         (self.entries.len() * 16) as u64 // Each RelDyn entry is 16 bytes
     }
     }
@@ -609,7 +627,7 @@ impl RelDynSection {
             self.offset,
             self.offset,
             self.offset,
             self.offset,
             self.size(),
             self.size(),
-            4,
+            self.link,
             0,
             0,
             8,
             8,
             16,
             16,

+ 2 - 2
crates/assembler/tests/fixtures/index.toml

@@ -16,11 +16,11 @@ hash = "6aa6cbf02e43654aa6edc4f9baccc5ea5388f26d1f81ec7dda8893a6a2e586a0"
 
 
 [cases.calls]
 [cases.calls]
 file = "calls.s"
 file = "calls.s"
-hash = "62da885b11fb7ee98303959583dd89fde64b387281b16c170a19091ab113a416"
+hash = "64934ea68d9e2b5c503fabeb21ce2a133a431f2bcc16530ac87f986e9974d998"
 
 
 [cases.callx]
 [cases.callx]
 file = "callx.s"
 file = "callx.s"
-hash = "f066dfd480abc6404dcd890317da33deb356081cfeb55502522c05d40670dad9"
+hash = "394d7843fbe545405be96085be387e374308dc5188857cc483df633ae31cc016"
 
 
 [cases.endian]
 [cases.endian]
 file = "endian.s"
 file = "endian.s"

+ 4 - 2
crates/disassembler/src/program.rs

@@ -21,8 +21,10 @@ pub struct Program {
 
 
 impl Program {
 impl Program {
     pub fn from_bytes(b: &[u8]) -> Result<Self, DisassemblerError> {
     pub fn from_bytes(b: &[u8]) -> Result<Self, DisassemblerError> {
-        let elf_file = ElfFile64::<Endianness>::parse(b)
-            .map_err(|_| DisassemblerError::NonStandardElfHeader)?;
+        let elf_file = ElfFile64::<Endianness>::parse(b).map_err(|e| {
+            eprintln!("ELF parse error: {}", e);
+            DisassemblerError::NonStandardElfHeader
+        })?;
 
 
         // Parse elf header.
         // Parse elf header.
         let elf_header = ELFHeader::from_elf_file(&elf_file)?;
         let elf_header = ELFHeader::from_elf_file(&elf_file)?;