parent
7556313b52
commit
08b59f8174
@ -0,0 +1 @@
|
||||
/findshlibs-0.5.0.crate
|
@ -0,0 +1,179 @@
|
||||
From 27e72713deb59f7c2e4d6ca06db9e9ff33f24bb4 Mon Sep 17 00:00:00 2001
|
||||
From: Jeremy Fitzhardinge <jeremy@goop.org>
|
||||
Date: Wed, 27 Nov 2019 21:42:52 -0800
|
||||
Subject: [PATCH] Fix address/bias on 32-bit systems
|
||||
|
||||
More generally, any platform where library addresses can be in the
|
||||
"negative" part of the address space (ie, address MSB is 1).
|
||||
|
||||
This consistently uses `usize` for both `Bias` and
|
||||
addresses (`Avma`, `Svma`). This assumes `Bias` is always positive, and
|
||||
can be very large.
|
||||
|
||||
Converting `Avma`/`Svma` to usize makes the address
|
||||
arithmetic easier, as it avoids `ptr::offset`, which can take both
|
||||
positive and negative offsets, which means it can't offset by more than
|
||||
half the address space. It is also undefined for general `*mut u8`
|
||||
pointer arithmetic ("Both the starting and resulting pointer must
|
||||
be either in bounds or one byte past the end of the same allocated
|
||||
object" is not met, nor is "The offset being in bounds cannot rely on
|
||||
"wrapping around" the address space. That is, the infinite-precision
|
||||
sum, in bytes must fit in a usize").
|
||||
|
||||
Fixes issue #47
|
||||
---
|
||||
src/lib.rs | 28 +++++++++++++---------------
|
||||
src/linux/mod.rs | 8 +++-----
|
||||
src/macos/mod.rs | 10 +++++-----
|
||||
3 files changed, 21 insertions(+), 25 deletions(-)
|
||||
|
||||
diff --git a/src/lib.rs b/src/lib.rs
|
||||
index 0da499f..63b385c 100644
|
||||
--- a/src/lib.rs
|
||||
+++ b/src/lib.rs
|
||||
@@ -91,7 +91,6 @@ pub mod linux;
|
||||
|
||||
use std::ffi::OsStr;
|
||||
use std::fmt::{self, Debug};
|
||||
-use std::ptr;
|
||||
|
||||
pub mod unsupported;
|
||||
|
||||
@@ -158,23 +157,23 @@ simple_newtypes! {
|
||||
/// Stated virtual memory address.
|
||||
///
|
||||
/// See the module documentation for details.
|
||||
- type Svma = *const u8
|
||||
+ type Svma = usize
|
||||
where
|
||||
- default = ptr::null(),
|
||||
- display = "{:p}";
|
||||
+ default = 0,
|
||||
+ display = "{:#x}";
|
||||
|
||||
/// Actual virtual memory address.
|
||||
///
|
||||
/// See the module documentation for details.
|
||||
- type Avma = *const u8
|
||||
+ type Avma = usize
|
||||
where
|
||||
- default = ptr::null(),
|
||||
- display = "{:p}";
|
||||
+ default = 0,
|
||||
+ display = "{:#x}";
|
||||
|
||||
/// Virtual memory bias.
|
||||
///
|
||||
/// See the module documentation for details.
|
||||
- type Bias = isize
|
||||
+ type Bias = usize
|
||||
where
|
||||
default = 0,
|
||||
display = "{:#x}";
|
||||
@@ -214,24 +213,24 @@ pub trait Segment: Sized + Debug {
|
||||
fn actual_virtual_memory_address(&self, shlib: &Self::SharedLibrary) -> Avma {
|
||||
let svma = self.stated_virtual_memory_address();
|
||||
let bias = shlib.virtual_memory_bias();
|
||||
- Avma(unsafe { svma.0.offset(bias.0) })
|
||||
+ Avma(svma.0 + bias.0 )
|
||||
}
|
||||
|
||||
/// Does this segment contain the given address?
|
||||
#[inline]
|
||||
fn contains_svma(&self, address: Svma) -> bool {
|
||||
- let start = self.stated_virtual_memory_address().0 as usize;
|
||||
+ let start = self.stated_virtual_memory_address().0;
|
||||
let end = start + self.len();
|
||||
- let address = address.0 as usize;
|
||||
+ let address = address.0;
|
||||
start <= address && address < end
|
||||
}
|
||||
|
||||
/// Does this segment contain the given address?
|
||||
#[inline]
|
||||
fn contains_avma(&self, shlib: &Self::SharedLibrary, address: Avma) -> bool {
|
||||
- let start = self.actual_virtual_memory_address(shlib).0 as usize;
|
||||
+ let start = self.actual_virtual_memory_address(shlib).0;
|
||||
let end = start + self.len();
|
||||
- let address = address.0 as usize;
|
||||
+ let address = address.0;
|
||||
start <= address && address < end
|
||||
}
|
||||
}
|
||||
@@ -312,8 +311,7 @@ pub trait SharedLibrary: Sized + Debug {
|
||||
#[inline]
|
||||
fn avma_to_svma(&self, address: Avma) -> Svma {
|
||||
let bias = self.virtual_memory_bias();
|
||||
- let reverse_bias = -bias.0;
|
||||
- Svma(unsafe { address.0.offset(reverse_bias) })
|
||||
+ Svma(address.0 - bias.0)
|
||||
}
|
||||
|
||||
/// Find all shared libraries in this process and invoke `f` with each one.
|
||||
diff --git a/src/linux/mod.rs b/src/linux/mod.rs
|
||||
index e56d4a8..b0f60db 100644
|
||||
--- a/src/linux/mod.rs
|
||||
+++ b/src/linux/mod.rs
|
||||
@@ -9,7 +9,7 @@ use std::borrow::Cow;
|
||||
use std::env::current_exe;
|
||||
use std::ffi::{CStr, CString, OsStr};
|
||||
use std::fmt;
|
||||
-use std::isize;
|
||||
+use std::usize;
|
||||
use std::marker::PhantomData;
|
||||
use std::mem;
|
||||
use std::os::unix::ffi::OsStrExt;
|
||||
@@ -260,8 +260,7 @@ impl<'a> SharedLibraryTrait for SharedLi
|
||||
|
||||
#[inline]
|
||||
fn virtual_memory_bias(&self) -> Bias {
|
||||
- assert!((self.addr as usize) < (isize::MAX as usize));
|
||||
- Bias(self.addr as usize as isize)
|
||||
+ Bias(self.addr as usize)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
diff --git a/src/macos/mod.rs b/src/macos/mod.rs
|
||||
index d3919a0..cb16516 100644
|
||||
--- a/src/macos/mod.rs
|
||||
+++ b/src/macos/mod.rs
|
||||
@@ -72,10 +72,10 @@ impl<'a> SegmentTrait for Segment<'a> {
|
||||
#[inline]
|
||||
fn stated_virtual_memory_address(&self) -> Svma {
|
||||
match *self {
|
||||
- Segment::Segment32(seg) => Svma(seg.vmaddr as usize as *const u8),
|
||||
+ Segment::Segment32(seg) => Svma(seg.vmaddr as usize),
|
||||
Segment::Segment64(seg) => {
|
||||
assert!(seg.vmaddr <= (usize::MAX as u64));
|
||||
- Svma(seg.vmaddr as usize as *const u8)
|
||||
+ Svma(seg.vmaddr as usize)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -198,7 +198,7 @@ impl<'a> MachHeader<'a> {
|
||||
/// `<mach-o/dyld.h>` header.
|
||||
pub struct SharedLibrary<'a> {
|
||||
header: MachHeader<'a>,
|
||||
- slide: isize,
|
||||
+ slide: usize,
|
||||
name: &'a CStr,
|
||||
}
|
||||
|
||||
@@ -212,7 +212,7 @@ impl<'a> fmt::Debug for SharedLibrary<'a
|
||||
}
|
||||
|
||||
impl<'a> SharedLibrary<'a> {
|
||||
- fn new(header: MachHeader<'a>, slide: isize, name: &'a CStr) -> Self {
|
||||
+ fn new(header: MachHeader<'a>, slide: usize, name: &'a CStr) -> Self {
|
||||
SharedLibrary {
|
||||
header: header,
|
||||
slide: slide,
|
||||
@@ -295,7 +295,7 @@ impl<'a> SharedLibraryTrait for SharedLi
|
||||
);
|
||||
|
||||
let name = unsafe { CStr::from_ptr(name) };
|
||||
- let shlib = SharedLibrary::new(header, slide, name);
|
||||
+ let shlib = SharedLibrary::new(header, slide as usize, name);
|
||||
|
||||
match f(&shlib).into() {
|
||||
IterationControl::Break => break,
|
@ -0,0 +1,95 @@
|
||||
# Generated by rust2rpm 10
|
||||
%bcond_without check
|
||||
%global debug_package %{nil}
|
||||
|
||||
%global crate findshlibs
|
||||
|
||||
Name: rust-%{crate}
|
||||
Version: 0.5.0
|
||||
Release: 1%{?dist}
|
||||
Summary: Find the set of shared libraries loaded in the current process
|
||||
|
||||
# Upstream license specification: Apache-2.0/MIT
|
||||
License: ASL 2.0 or MIT
|
||||
URL: https://crates.io/crates/findshlibs
|
||||
Source: %{crates_source}
|
||||
# Fix address/bias on 32-bit systems
|
||||
# https://github.com/gimli-rs/findshlibs/commit/760f122b42aca9d41e7f8de533bffca60e715727
|
||||
Patch0: 0001-Fix-address-bias-on-32-bit-systems.patch
|
||||
|
||||
ExclusiveArch: %{rust_arches}
|
||||
%if %{__cargo_skip_build}
|
||||
BuildArch: noarch
|
||||
%endif
|
||||
|
||||
BuildRequires: rust-packaging
|
||||
|
||||
%global _description %{expand:
|
||||
Find the set of shared libraries loaded in the current process with a cross
|
||||
platform API.}
|
||||
|
||||
%description %{_description}
|
||||
|
||||
%package devel
|
||||
Summary: %{summary}
|
||||
BuildArch: noarch
|
||||
|
||||
%description devel %{_description}
|
||||
|
||||
This package contains library source intended for building other packages
|
||||
which use "%{crate}" crate.
|
||||
|
||||
%files devel
|
||||
%license LICENSE-APACHE LICENSE-MIT
|
||||
%doc ./README.md
|
||||
%{cargo_registry}/%{crate}-%{version}/
|
||||
|
||||
%package -n %{name}+default-devel
|
||||
Summary: %{summary}
|
||||
BuildArch: noarch
|
||||
|
||||
%description -n %{name}+default-devel %{_description}
|
||||
|
||||
This package contains library source intended for building other packages
|
||||
which use "default" feature of "%{crate}" crate.
|
||||
|
||||
%files -n %{name}+default-devel
|
||||
%ghost %{cargo_registry}/%{crate}-%{version}/Cargo.toml
|
||||
|
||||
%package -n %{name}+nightly-devel
|
||||
Summary: %{summary}
|
||||
BuildArch: noarch
|
||||
|
||||
%description -n %{name}+nightly-devel %{_description}
|
||||
|
||||
This package contains library source intended for building other packages
|
||||
which use "nightly" feature of "%{crate}" crate.
|
||||
|
||||
%files -n %{name}+nightly-devel
|
||||
%ghost %{cargo_registry}/%{crate}-%{version}/Cargo.toml
|
||||
|
||||
%prep
|
||||
%autosetup -n %{crate}-%{version_no_tilde} -p1
|
||||
%cargo_prep
|
||||
|
||||
# Sometimes Rust sources start with #![...] attributes, and "smart" editors think
|
||||
# it's a shebang and make them executable. Then brp-mangle-shebangs gets upset...
|
||||
find -name '*.rs' -type f -perm /111 -exec chmod -v -x '{}' '+'
|
||||
|
||||
%generate_buildrequires
|
||||
%cargo_generate_buildrequires
|
||||
|
||||
%build
|
||||
%cargo_build
|
||||
|
||||
%install
|
||||
%cargo_install
|
||||
|
||||
%if %{with check}
|
||||
%check
|
||||
%cargo_test
|
||||
%endif
|
||||
|
||||
%changelog
|
||||
* Fri Dec 06 18:20:28 CET 2019 Robert-André Mauchin <zebob.m@gmail.com> - 0.5.0-1
|
||||
- Initial package
|
Loading…
Reference in new issue