Do relocation for .rela.dyn section
This commit is contained in:
		
							parent
							
								
									cf77c3a9a8
								
							
						
					
					
						commit
						4c3f556c7d
					
				| @ -34,15 +34,15 @@ pub fn print_sections(elf_file: &ElfFile) -> Result<(), Error> { | ||||
|     Ok(()) | ||||
| } | ||||
| 
 | ||||
| pub fn print_pltrel_section(elf_file: &ElfFile) -> Result<(), Error> { | ||||
|     let rela_entries = get_pltrel_entries(elf_file) | ||||
| pub fn print_rela_plt_section(elf_file: &ElfFile) -> Result<(), Error> { | ||||
|     let rela_entries = get_rela_entries(elf_file, ".rela.plt") | ||||
|         .map_err(|e| (Errno::ENOEXEC, | ||||
|                       "Failed to get .pltrel entries"))?; | ||||
|     let dynsym_entries = get_dynsym_entries(elf_file) | ||||
|         .map_err(|e| (Errno::ENOEXEC, | ||||
|                       "Failed to get .dynsym entries"))?; | ||||
| 
 | ||||
|     println!(".plt.rela section:"); | ||||
|     println!(".rela.plt section:"); | ||||
|     for entry in rela_entries { | ||||
|         println!("\toffset: {}, symbol index: {}, type: {}, addend: {}", | ||||
|                  entry.get_offset(), | ||||
| @ -113,10 +113,10 @@ pub fn get_sym_entries<'b, 'a: 'b>(elf_file: &'b ElfFile<'a>) | ||||
|         }).ok_or_else(|| (Errno::ENOEXEC, "Failed get the symbol entries").into()) | ||||
| } | ||||
| 
 | ||||
| pub fn get_pltrel_entries<'b, 'a: 'b>(elf_file: &'b ElfFile<'a>) | ||||
| pub fn get_rela_entries<'b, 'a: 'b>(elf_file: &'b ElfFile<'a>, sec_name: &'b str) | ||||
|     -> Result<&'a [Rela<P64>], Error> | ||||
| { | ||||
|     elf_file.find_section_by_name(".rela.plt") | ||||
|     elf_file.find_section_by_name(sec_name) | ||||
|         .and_then(|plt_rela_section| { | ||||
|             plt_rela_section.get_data(&elf_file).ok() | ||||
|         }).and_then(|rela_table| { | ||||
|  | ||||
| @ -232,8 +232,10 @@ impl Process { | ||||
|     { | ||||
|         let mut new_process : Process = Default::default(); | ||||
|         new_process.create_process_image(elf_file)?; | ||||
|         new_process.reloc_symbols(elf_file)?; | ||||
|         new_process.link_syscalls(elf_file)?; | ||||
|         new_process.mprotect()?; | ||||
|         //println!("Process image: {:#X?}", new_process);
 | ||||
| 
 | ||||
|         new_process.task = Task { | ||||
|             user_stack_addr: new_process.init_stack(argv, envp)? as usize, | ||||
| @ -298,12 +300,41 @@ impl Process { | ||||
|         Ok(base_addr) | ||||
|     } | ||||
| 
 | ||||
|     fn reloc_symbols(self: &mut Process, elf_file: &ElfFile) | ||||
|         -> Result<(), Error> | ||||
|     { | ||||
|         let rela_entries = elf_helper::get_rela_entries(&elf_file, ".rela.dyn")?; | ||||
|         for rela_entry in rela_entries { | ||||
|             /* | ||||
|             println!("\toffset: {:#X}, symbol index: {}, type: {}, addend: {:#X}", | ||||
|                  rela_entry.get_offset(), | ||||
|                  rela_entry.get_symbol_table_index(), | ||||
|                  rela_entry.get_type(), | ||||
|                  rela_entry.get_addend()); | ||||
|             */ | ||||
| 
 | ||||
|             /* reloc type == R_X86_64_RELATIVE */ | ||||
|             match rela_entry.get_type() { | ||||
|                 8 if rela_entry.get_symbol_table_index() == 0 => { | ||||
|                     let rela_addr = self.program_base_addr + rela_entry.get_offset() as usize; | ||||
|                     let rela_val = self.program_base_addr + rela_entry.get_addend() as usize; | ||||
|                     unsafe { | ||||
|                         std::ptr::write_unaligned(rela_addr as *mut usize, rela_val); | ||||
|                     } | ||||
|                 } | ||||
|                 // TODO: need to handle other relocation types
 | ||||
|                 _ => {  } | ||||
|             } | ||||
|         } | ||||
|         Ok(()) | ||||
|     } | ||||
| 
 | ||||
|     fn link_syscalls(self: &mut Process, elf_file: &ElfFile) | ||||
|         -> Result<(), Error> | ||||
|     { | ||||
|         let syscall_addr = __occlum_syscall as *const () as usize; | ||||
| 
 | ||||
|         let rela_entries = elf_helper::get_pltrel_entries(&elf_file)?; | ||||
|         let rela_entries = elf_helper::get_rela_entries(&elf_file, ".rela.plt")?; | ||||
|         let dynsym_entries = elf_helper::get_dynsym_entries(&elf_file)?; | ||||
|         for rela_entry in rela_entries { | ||||
|             let dynsym_idx = rela_entry.get_symbol_table_index() as usize; | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| CUR_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) | ||||
| PROJECT_DIR := $(realpath $(CUR_DIR)/../) | ||||
| 
 | ||||
| TEST_SUITES := empty | ||||
| TEST_SUITES := empty hello_world | ||||
| BUILD_TEST_SUITES := $(TEST_SUITES:%=%) | ||||
| RUN_TEST_SUITES := $(TEST_SUITES:%=run-%) | ||||
| CLEAN_TEST_SUITES := $(TEST_SUITES:%=clean-%) | ||||
|  | ||||
							
								
								
									
										4
									
								
								test/hello_world/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										4
									
								
								test/hello_world/Makefile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | ||||
| include ../test_common.mk | ||||
| 
 | ||||
| EXTRA_C_FLAGS := | ||||
| EXTRA_LINK_FLAGS := | ||||
							
								
								
									
										9
									
								
								test/hello_world/main.c
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										9
									
								
								test/hello_world/main.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | ||||
| #include <unistd.h> | ||||
| #include <string.h> | ||||
| 
 | ||||
| static const char* msg = "Hello World\n"; | ||||
| 
 | ||||
| int main(void) { | ||||
|     write(1, msg, strlen(msg) + 1); | ||||
|     return 0; | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user