loader: fix userboot's ability to detect a guest's interpreter
Some time after r338418, I believe with -Os/-Oz -ffunction-sections -fdata-sections, the bootprog_interp variable that held our "$Interpreter:" marker started getting strip from all loaders, with exception to userboot since it used bootprog_interp to determine what flavor of userboot it was. At some point, it had been brought to my attention that this was no longer working and I had worked up some potential solutions to use the variable that involved printing it out. My vague recollection is that this was rejected, and I forgot to explore the alternatives; I cannot find records of this discussion anymore. Fast forward to present day, Andrew reported that it was non-functional and offered (effectively) this patch (sans comment) to stop the compiler from optimizing it out by assigning it to a volatile variable. This removes concerns about user-facing change while retaining the interpreter marker. Furthermore, it could certainly be uglier. Reported and tested by: Andrew Gierth <andrew_tao173.riddles.org.uk> MFC after: 3 days
This commit is contained in:
parent
de6fa6b43b
commit
2583c3374d
@ -46,7 +46,16 @@ void
|
|||||||
interact(void)
|
interact(void)
|
||||||
{
|
{
|
||||||
static char input[256]; /* big enough? */
|
static char input[256]; /* big enough? */
|
||||||
|
const char * volatile interp_identifier;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Because interp_identifier is volatile, it cannot be optimized out by
|
||||||
|
* the compiler as it's considered an externally observable event. This
|
||||||
|
* prevents the compiler from optimizing out our carefully placed
|
||||||
|
* $Interpreter:4th string that userboot may use to determine that
|
||||||
|
* we need to switch interpreters.
|
||||||
|
*/
|
||||||
|
interp_identifier = bootprog_interp;
|
||||||
interp_init();
|
interp_init();
|
||||||
|
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
Loading…
Reference in New Issue
Block a user