forked from rust-lang/backtrace-rs
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Handle compressed debug sections in ELF files
ELF files allow debug info sections to be compressed. The libbacktrace backed supported these compressed sections, but the Gimli backend did not. This commit adds that support to the Gimli backend. In my tests (with the BFD linker, lld, and gold) these debug info sections do not obey the alignment requirements that the object crate expects for the gABI compression header, so this commit additionally enables the "unaligned" feature in the upcoming version of the object crate. There is a bit of unsafe to ensure the lifetime of the decompressed sections matches the lifetime of the mmap'd file. I don't think there is a way around this unsafe code, unless we are willing to ditch Gimli's EndianSlice for an (apparently slower) EndianReader backed by a Cow<[u8]>. Fix rust-lang#342.
- Loading branch information
Showing
7 changed files
with
145 additions
and
43 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
use std::cell::UnsafeCell; | ||
use std::vec::Vec; | ||
|
||
/// A simple arena allocator for byte buffers. | ||
pub struct Stash { | ||
buffers: UnsafeCell<Vec<Vec<u8>>>, | ||
} | ||
|
||
impl Stash { | ||
pub fn new() -> Stash { | ||
Stash { | ||
buffers: UnsafeCell::new(Vec::new()), | ||
} | ||
} | ||
|
||
/// Allocates a buffer of the specified size and returns a mutable reference | ||
/// to it. | ||
pub fn allocate(&self, size: usize) -> &mut [u8] { | ||
// SAFETY: this is the only function that ever constructs a mutable | ||
// reference to `self.buffers`. | ||
let buffers = unsafe { &mut *self.buffers.get() }; | ||
let i = buffers.len(); | ||
buffers.push(vec![0; size]); | ||
// SAFETY: we never remove elements from `self.buffers`, so a reference | ||
// to the data inside any buffer will live as long as `self` does. | ||
&mut buffers[i] | ||
} | ||
} |