Skip to content

Commit 6423165

Browse files
authored
Merge pull request #206 from Freax13/pie
add support for position independent executables
2 parents 10c5ea0 + b9a4609 commit 6423165

14 files changed

+548
-56
lines changed

Cargo.lock

+9
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ members = [
1414
"tests/test_kernels/default_settings",
1515
"tests/test_kernels/map_phys_mem",
1616
"tests/test_kernels/higher_half",
17+
"tests/test_kernels/pie",
1718
]
1819
exclude = [
1920
"examples/basic",

src/binary/level_4_entries.rs

+8-3
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,22 @@ impl UsedLevel4Entries {
1616
/// Initializes a new instance from the given ELF program segments.
1717
///
1818
/// Marks the virtual address range of all segments as used.
19-
pub fn new<'a>(segments: impl Iterator<Item = ProgramHeader<'a>>) -> Self {
19+
pub fn new<'a>(
20+
segments: impl Iterator<Item = ProgramHeader<'a>>,
21+
virtual_address_offset: u64,
22+
) -> Self {
2023
let mut used = UsedLevel4Entries {
2124
entry_state: [false; 512],
2225
};
2326

2427
used.entry_state[0] = true; // TODO: Can we do this dynamically?
2528

2629
for segment in segments {
27-
let start_page: Page = Page::containing_address(VirtAddr::new(segment.virtual_addr()));
30+
let start_page: Page = Page::containing_address(VirtAddr::new(
31+
segment.virtual_addr() + virtual_address_offset,
32+
));
2833
let end_page: Page = Page::containing_address(VirtAddr::new(
29-
segment.virtual_addr() + segment.mem_size(),
34+
segment.virtual_addr() + virtual_address_offset + segment.mem_size(),
3035
));
3136

3237
for p4_index in u64::from(start_page.p4_index())..=u64::from(end_page.p4_index()) {

0 commit comments

Comments
 (0)