svn commit: r361538 - in stable: 11/stand/common 12/stand/common
Kyle Evans
kevans at FreeBSD.org
Tue May 26 19:34:05 UTC 2020
Author: kevans
Date: Tue May 26 19:34:05 2020
New Revision: 361538
URL: https://svnweb.freebsd.org/changeset/base/361538
Log:
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.
Modified:
stable/11/stand/common/interp.c
Directory Properties:
stable/11/ (props changed)
Changes in other areas also in this revision:
Modified:
stable/12/stand/common/interp.c
Directory Properties:
stable/12/ (props changed)
Modified: stable/11/stand/common/interp.c
==============================================================================
--- stable/11/stand/common/interp.c Tue May 26 19:22:46 2020 (r361537)
+++ stable/11/stand/common/interp.c Tue May 26 19:34:05 2020 (r361538)
@@ -45,8 +45,17 @@ __FBSDID("$FreeBSD$");
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();
printf("\n");
More information about the svn-src-stable-11
mailing list