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