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 these debug info sections do not obey the alignment requirements that the object crate expects for the gABI compression header (nor can I find a source documenting any alignment requirements), 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
8 changed files
with
142 additions
and
44 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
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; | ||
|
||
pub struct Stash { | ||
/// Additional byte vectors that need to live as long as the mmap. | ||
buffers: UnsafeCell<Vec<Vec<u8>>>, | ||
} | ||
|
||
impl Stash { | ||
pub fn new() -> Stash { | ||
Stash { | ||
buffers: UnsafeCell::new(Vec::new()), | ||
} | ||
} | ||
|
||
/// Takes ownership of `buf` and returns a reference to its contents that | ||
/// lives as long as the `Stash` does. | ||
pub fn stash(&self, buf: Vec<u8>) -> &[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(buf); | ||
// SAFETY: we never remove elements from `self.buffers`, so a reference | ||
// to the data inside any buffer will live as long as `Mmap` does. | ||
&buffers[i] | ||
} | ||
} |