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: u32How many bytes in total, which is the first number and the one a command line must give.
before: u32How 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
impl Patchable
Trait Implementations§
impl Copy for Patchable
Source§impl Display for Patchable
impl Display for Patchable
Source§fn fmt(&self, f: &mut Formatter<'_>) -> Result
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.
impl Eq for Patchable
Source§impl FromStr for Patchable
impl FromStr for Patchable
Source§fn from_str(s: &str) -> Result<Self, ()>
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.