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(()) |     Ok(()) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn print_pltrel_section(elf_file: &ElfFile) -> Result<(), Error> { | pub fn print_rela_plt_section(elf_file: &ElfFile) -> Result<(), Error> { | ||||||
|     let rela_entries = get_pltrel_entries(elf_file) |     let rela_entries = get_rela_entries(elf_file, ".rela.plt") | ||||||
|         .map_err(|e| (Errno::ENOEXEC, |         .map_err(|e| (Errno::ENOEXEC, | ||||||
|                       "Failed to get .pltrel entries"))?; |                       "Failed to get .pltrel entries"))?; | ||||||
|     let dynsym_entries = get_dynsym_entries(elf_file) |     let dynsym_entries = get_dynsym_entries(elf_file) | ||||||
|         .map_err(|e| (Errno::ENOEXEC, |         .map_err(|e| (Errno::ENOEXEC, | ||||||
|                       "Failed to get .dynsym entries"))?; |                       "Failed to get .dynsym entries"))?; | ||||||
| 
 | 
 | ||||||
|     println!(".plt.rela section:"); |     println!(".rela.plt section:"); | ||||||
|     for entry in rela_entries { |     for entry in rela_entries { | ||||||
|         println!("\toffset: {}, symbol index: {}, type: {}, addend: {}", |         println!("\toffset: {}, symbol index: {}, type: {}, addend: {}", | ||||||
|                  entry.get_offset(), |                  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()) |         }).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> |     -> 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| { |         .and_then(|plt_rela_section| { | ||||||
|             plt_rela_section.get_data(&elf_file).ok() |             plt_rela_section.get_data(&elf_file).ok() | ||||||
|         }).and_then(|rela_table| { |         }).and_then(|rela_table| { | ||||||
|  | |||||||
| @ -232,8 +232,10 @@ impl Process { | |||||||
|     { |     { | ||||||
|         let mut new_process : Process = Default::default(); |         let mut new_process : Process = Default::default(); | ||||||
|         new_process.create_process_image(elf_file)?; |         new_process.create_process_image(elf_file)?; | ||||||
|  |         new_process.reloc_symbols(elf_file)?; | ||||||
|         new_process.link_syscalls(elf_file)?; |         new_process.link_syscalls(elf_file)?; | ||||||
|         new_process.mprotect()?; |         new_process.mprotect()?; | ||||||
|  |         //println!("Process image: {:#X?}", new_process);
 | ||||||
| 
 | 
 | ||||||
|         new_process.task = Task { |         new_process.task = Task { | ||||||
|             user_stack_addr: new_process.init_stack(argv, envp)? as usize, |             user_stack_addr: new_process.init_stack(argv, envp)? as usize, | ||||||
| @ -298,12 +300,41 @@ impl Process { | |||||||
|         Ok(base_addr) |         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) |     fn link_syscalls(self: &mut Process, elf_file: &ElfFile) | ||||||
|         -> Result<(), Error> |         -> Result<(), Error> | ||||||
|     { |     { | ||||||
|         let syscall_addr = __occlum_syscall as *const () as usize; |         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)?; |         let dynsym_entries = elf_helper::get_dynsym_entries(&elf_file)?; | ||||||
|         for rela_entry in rela_entries { |         for rela_entry in rela_entries { | ||||||
|             let dynsym_idx = rela_entry.get_symbol_table_index() as usize; |             let dynsym_idx = rela_entry.get_symbol_table_index() as usize; | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| CUR_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) | CUR_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) | ||||||
| PROJECT_DIR := $(realpath $(CUR_DIR)/../) | PROJECT_DIR := $(realpath $(CUR_DIR)/../) | ||||||
| 
 | 
 | ||||||
| TEST_SUITES := empty | TEST_SUITES := empty hello_world | ||||||
| BUILD_TEST_SUITES := $(TEST_SUITES:%=%) | BUILD_TEST_SUITES := $(TEST_SUITES:%=%) | ||||||
| RUN_TEST_SUITES := $(TEST_SUITES:%=run-%) | RUN_TEST_SUITES := $(TEST_SUITES:%=run-%) | ||||||
| CLEAN_TEST_SUITES := $(TEST_SUITES:%=clean-%) | 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