Skip to main content

Patchable

Struct Patchable 

Source
pub struct Patchable {
    pub total: u32,
    pub before: u32,
}
Expand description

How much room at the top of every function is reserved for somebody to write over later, which -fpatchable-function-entry= asks for.

Room rather than instructions. What goes there is a run of the shortest instruction the machine has that does nothing, and the point of them is that they are never executed for long: a tracer or a live patcher overwrites them with a jump or a call once the program is running, and what it needs from the compiler is a known address, a known number of bytes, and a promise that nothing in the function jumps into the middle of them.

Two numbers because the room can be on either side of the function’s own label, and the two sides are not the same thing. Room after the label is room inside the function, which is what a patcher that redirects a call into the function wants. Room in front of the label is outside it, so what goes there is reached only by something that already knows the address, and a patcher that wants somewhere to put a whole instruction it can reach from the first one needs it.

The address recorded for the function is the start of the room, which is the front of the part before the label when there is one and the front of the part after it when there is not.

Fields§

§total: u32

How many bytes in total, which is the first number and the one a command line must give.

§before: u32

How many of them go in front of the function’s own label, which is the second number and is zero on a command line that gave one number.

Implementations§

Source§

impl Patchable

Source

pub const fn any(self) -> bool

Whether any room at all was asked for, which is what decides whether a function gets a record.

=0 is a command line that asked for none, and gcc accepts it and writes nothing, so the question is about the number rather than about whether the flag was written.

Source

pub const fn after(self) -> u32

How many bytes go after the function’s own label, which is the rest of them.

Trait Implementations§

Source§

impl Clone for Patchable

Source§

fn clone(&self) -> Patchable

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for Patchable

Source§

impl Debug for Patchable

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for Patchable

Source§

fn default() -> Patchable

Returns the “default value” for a type. Read more
Source§

impl Display for Patchable

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Written the way it was asked for, which is one number when the second is zero.

Not because the two forms mean different things, they do not, but because that is the form a command line reaching for this feature writes and reading back what was written is what --print-config is for.

Source§

impl Eq for Patchable

Source§

impl FromStr for Patchable

Source§

fn from_str(s: &str) -> Result<Self, ()>

Parses the part after -fpatchable-function-entry=, which is a number or two of them.

A second number larger than the first is refused rather than clamped, because it asks for more room in front of the label than there is room at all and there is no reading of that a caller meant. So is a third, and so is anything that is not a number, which is what gcc does with each of them.

Source§

type Err = ()

The associated error which can be returned from parsing.
Source§

impl Hash for Patchable

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl Ord for Patchable

Source§

fn cmp(&self, other: &Patchable) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 (const: unstable) · Source§

fn max(self, other: Self) -> Self
where Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 (const: unstable) · Source§

fn min(self, other: Self) -> Self
where Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 (const: unstable) · Source§

fn clamp(self, min: Self, max: Self) -> Self
where Self: Sized,

Restrict a value to a certain interval. Read more
Source§

fn clamp_to<R>(self, range: R) -> Self
where Self: Sized, R: ClampBounds<Self>,

🔬This is a nightly-only experimental API. (clamp_to)
Restrict a value to a certain range. Read more
Source§

impl PartialEq for Patchable

Source§

fn eq(&self, other: &Patchable) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl PartialOrd for Patchable

Source§

fn partial_cmp(&self, other: &Patchable) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 (const: unstable) · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 (const: unstable) · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 (const: unstable) · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 (const: unstable) · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by the >= operator. Read more
Source§

impl StructuralPartialEq for Patchable

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.