2018-08-23 05:16:46 +08:00
|
|
|
#!/bin/bash
|
2019-02-11 23:14:09 +08:00
|
|
|
# SPDX-License-Identifier: GPL-2.0+
|
2018-08-23 05:16:46 +08:00
|
|
|
#
|
|
|
|
# Create an initrd directory if one does not already exist.
|
|
|
|
#
|
|
|
|
# Copyright (C) IBM Corporation, 2013
|
|
|
|
#
|
|
|
|
# Author: Connor Shu <Connor.Shu@ibm.com>
|
|
|
|
|
|
|
|
D=tools/testing/selftests/rcutorture
|
|
|
|
|
|
|
|
# Prerequisite checks
|
|
|
|
[ -z "$D" ] && echo >&2 "No argument supplied" && exit 1
|
|
|
|
if [ ! -d "$D" ]; then
|
|
|
|
echo >&2 "$D does not exist: Malformed kernel source tree?"
|
|
|
|
exit 1
|
|
|
|
fi
|
2018-09-09 17:46:48 +08:00
|
|
|
if [ -s "$D/initrd/init" ]; then
|
|
|
|
echo "$D/initrd/init already exists, no need to create it"
|
2018-08-23 05:16:46 +08:00
|
|
|
exit 0
|
|
|
|
fi
|
|
|
|
|
2019-10-13 06:29:02 +08:00
|
|
|
# Create a C-language initrd/init infinite-loop program and statically
|
|
|
|
# link it. This results in a very small initrd.
|
|
|
|
echo "Creating a statically linked C-language initrd"
|
2018-08-23 05:16:46 +08:00
|
|
|
cd $D
|
2018-09-09 17:46:48 +08:00
|
|
|
mkdir -p initrd
|
2018-08-23 05:16:46 +08:00
|
|
|
cd initrd
|
rcutorture: Add initrd support for systems lacking dracut
The support for creating initrd directories using dracut is a great
improvement over having to always hand-create them, it is a bit annoying
to have to install some otherwise irrelevant package just to be able to
run rcutorture. This commit therefore adds support for creating initrd
directories on systems innocent of dracut. You do need gcc, but then
again you need that to build the kernel (or to build llvm) in any case.
The idea is to create an initrd directory containing nothing but a
statically linked binary having a for-loop over a long-term sleep().
The result is a Linux kernel with almost no userspace: even the
time-honored /dev, /lib, /tmp, and /usr directories are gone. In fact,
the only directory present is "/", but only because I don't know how to
get rid of it, at least short of not having an initrd in the first place.
Although statically linked binaries are much maligned, and rightly so,
their disadvantages seem to be irrelevant for this particular use case.
From https://www.akkadia.org/drepper/no_static_linking.html:
1. Fixes are difficult to apply to hordes of widely scattered
statically linked binaries. But in this case, there is only one
binary, but there would otherwise be no fewer than four libraries.
2. Security measures like local address randomization cannot be used.
Prudence prevents me from asserting that it is impossible to
base a remote attack on a networking-free rcutorture instance.
Nevertheless, bonus points to the first person who comes up with
such an attack!
3. More efficient use of physical memory. Not in this case, given
that libc is 1.8MB and the statically linked binary "only" 800K.
4. Features such as locales, name service switch (NSS),
internationalized domain names (IDN) tool, and so on require
dynamic linking. Bonus points to the first person coming up
with a valid rcutorture use case requiring these features in
its initrd.
5. Accidental violations of (L)GPL. Actually, this change actually
helps -avoid- such violations by reducing the temptation to
pass around tarballs of rcutorture-ready initrd directories.
After all, the rcutorture scripts automatically create an initrd
directory for you, so why bother with the tarballs?
6. Tools and hacks like ltrace, LD_PRELOAD, LD_PROFILE, and LD_AUDIT
don't work. Again, bonus points to the first person coming up
with a valid rcutorture use case requiring these features in
its initrd.
Nevertheless, the script will use dracut if available, and will create the
statically linked binary only when dracut are missing. Those preferring
the smaller initrd directory resulting from the statically linked binary
(like me) are free to hand-edit mkinitrd.sh to remove the code using
dracut. ;-)
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
2018-08-24 01:48:18 +08:00
|
|
|
cat > init.c << '___EOF___'
|
2018-09-09 19:33:02 +08:00
|
|
|
#ifndef NOLIBC
|
rcutorture: Add initrd support for systems lacking dracut
The support for creating initrd directories using dracut is a great
improvement over having to always hand-create them, it is a bit annoying
to have to install some otherwise irrelevant package just to be able to
run rcutorture. This commit therefore adds support for creating initrd
directories on systems innocent of dracut. You do need gcc, but then
again you need that to build the kernel (or to build llvm) in any case.
The idea is to create an initrd directory containing nothing but a
statically linked binary having a for-loop over a long-term sleep().
The result is a Linux kernel with almost no userspace: even the
time-honored /dev, /lib, /tmp, and /usr directories are gone. In fact,
the only directory present is "/", but only because I don't know how to
get rid of it, at least short of not having an initrd in the first place.
Although statically linked binaries are much maligned, and rightly so,
their disadvantages seem to be irrelevant for this particular use case.
From https://www.akkadia.org/drepper/no_static_linking.html:
1. Fixes are difficult to apply to hordes of widely scattered
statically linked binaries. But in this case, there is only one
binary, but there would otherwise be no fewer than four libraries.
2. Security measures like local address randomization cannot be used.
Prudence prevents me from asserting that it is impossible to
base a remote attack on a networking-free rcutorture instance.
Nevertheless, bonus points to the first person who comes up with
such an attack!
3. More efficient use of physical memory. Not in this case, given
that libc is 1.8MB and the statically linked binary "only" 800K.
4. Features such as locales, name service switch (NSS),
internationalized domain names (IDN) tool, and so on require
dynamic linking. Bonus points to the first person coming up
with a valid rcutorture use case requiring these features in
its initrd.
5. Accidental violations of (L)GPL. Actually, this change actually
helps -avoid- such violations by reducing the temptation to
pass around tarballs of rcutorture-ready initrd directories.
After all, the rcutorture scripts automatically create an initrd
directory for you, so why bother with the tarballs?
6. Tools and hacks like ltrace, LD_PRELOAD, LD_PROFILE, and LD_AUDIT
don't work. Again, bonus points to the first person coming up
with a valid rcutorture use case requiring these features in
its initrd.
Nevertheless, the script will use dracut if available, and will create the
statically linked binary only when dracut are missing. Those preferring
the smaller initrd directory resulting from the statically linked binary
(like me) are free to hand-edit mkinitrd.sh to remove the code using
dracut. ;-)
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
2018-08-24 01:48:18 +08:00
|
|
|
#include <unistd.h>
|
2018-08-24 06:23:23 +08:00
|
|
|
#include <sys/time.h>
|
2018-09-09 19:33:02 +08:00
|
|
|
#endif
|
2018-08-24 06:23:23 +08:00
|
|
|
|
|
|
|
volatile unsigned long delaycount;
|
rcutorture: Add initrd support for systems lacking dracut
The support for creating initrd directories using dracut is a great
improvement over having to always hand-create them, it is a bit annoying
to have to install some otherwise irrelevant package just to be able to
run rcutorture. This commit therefore adds support for creating initrd
directories on systems innocent of dracut. You do need gcc, but then
again you need that to build the kernel (or to build llvm) in any case.
The idea is to create an initrd directory containing nothing but a
statically linked binary having a for-loop over a long-term sleep().
The result is a Linux kernel with almost no userspace: even the
time-honored /dev, /lib, /tmp, and /usr directories are gone. In fact,
the only directory present is "/", but only because I don't know how to
get rid of it, at least short of not having an initrd in the first place.
Although statically linked binaries are much maligned, and rightly so,
their disadvantages seem to be irrelevant for this particular use case.
From https://www.akkadia.org/drepper/no_static_linking.html:
1. Fixes are difficult to apply to hordes of widely scattered
statically linked binaries. But in this case, there is only one
binary, but there would otherwise be no fewer than four libraries.
2. Security measures like local address randomization cannot be used.
Prudence prevents me from asserting that it is impossible to
base a remote attack on a networking-free rcutorture instance.
Nevertheless, bonus points to the first person who comes up with
such an attack!
3. More efficient use of physical memory. Not in this case, given
that libc is 1.8MB and the statically linked binary "only" 800K.
4. Features such as locales, name service switch (NSS),
internationalized domain names (IDN) tool, and so on require
dynamic linking. Bonus points to the first person coming up
with a valid rcutorture use case requiring these features in
its initrd.
5. Accidental violations of (L)GPL. Actually, this change actually
helps -avoid- such violations by reducing the temptation to
pass around tarballs of rcutorture-ready initrd directories.
After all, the rcutorture scripts automatically create an initrd
directory for you, so why bother with the tarballs?
6. Tools and hacks like ltrace, LD_PRELOAD, LD_PROFILE, and LD_AUDIT
don't work. Again, bonus points to the first person coming up
with a valid rcutorture use case requiring these features in
its initrd.
Nevertheless, the script will use dracut if available, and will create the
statically linked binary only when dracut are missing. Those preferring
the smaller initrd directory resulting from the statically linked binary
(like me) are free to hand-edit mkinitrd.sh to remove the code using
dracut. ;-)
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
2018-08-24 01:48:18 +08:00
|
|
|
|
|
|
|
int main(int argc, int argv[])
|
|
|
|
{
|
2018-08-24 06:23:23 +08:00
|
|
|
int i;
|
|
|
|
struct timeval tv;
|
|
|
|
struct timeval tvb;
|
|
|
|
|
|
|
|
for (;;) {
|
|
|
|
sleep(1);
|
|
|
|
/* Need some userspace time. */
|
|
|
|
if (gettimeofday(&tvb, NULL))
|
|
|
|
continue;
|
|
|
|
do {
|
|
|
|
for (i = 0; i < 1000 * 100; i++)
|
|
|
|
delaycount = i * i;
|
|
|
|
if (gettimeofday(&tv, NULL))
|
|
|
|
break;
|
|
|
|
tv.tv_sec -= tvb.tv_sec;
|
|
|
|
if (tv.tv_sec > 1)
|
|
|
|
break;
|
|
|
|
tv.tv_usec += tv.tv_sec * 1000 * 1000;
|
|
|
|
tv.tv_usec -= tvb.tv_usec;
|
|
|
|
} while (tv.tv_usec < 1000);
|
|
|
|
}
|
rcutorture: Add initrd support for systems lacking dracut
The support for creating initrd directories using dracut is a great
improvement over having to always hand-create them, it is a bit annoying
to have to install some otherwise irrelevant package just to be able to
run rcutorture. This commit therefore adds support for creating initrd
directories on systems innocent of dracut. You do need gcc, but then
again you need that to build the kernel (or to build llvm) in any case.
The idea is to create an initrd directory containing nothing but a
statically linked binary having a for-loop over a long-term sleep().
The result is a Linux kernel with almost no userspace: even the
time-honored /dev, /lib, /tmp, and /usr directories are gone. In fact,
the only directory present is "/", but only because I don't know how to
get rid of it, at least short of not having an initrd in the first place.
Although statically linked binaries are much maligned, and rightly so,
their disadvantages seem to be irrelevant for this particular use case.
From https://www.akkadia.org/drepper/no_static_linking.html:
1. Fixes are difficult to apply to hordes of widely scattered
statically linked binaries. But in this case, there is only one
binary, but there would otherwise be no fewer than four libraries.
2. Security measures like local address randomization cannot be used.
Prudence prevents me from asserting that it is impossible to
base a remote attack on a networking-free rcutorture instance.
Nevertheless, bonus points to the first person who comes up with
such an attack!
3. More efficient use of physical memory. Not in this case, given
that libc is 1.8MB and the statically linked binary "only" 800K.
4. Features such as locales, name service switch (NSS),
internationalized domain names (IDN) tool, and so on require
dynamic linking. Bonus points to the first person coming up
with a valid rcutorture use case requiring these features in
its initrd.
5. Accidental violations of (L)GPL. Actually, this change actually
helps -avoid- such violations by reducing the temptation to
pass around tarballs of rcutorture-ready initrd directories.
After all, the rcutorture scripts automatically create an initrd
directory for you, so why bother with the tarballs?
6. Tools and hacks like ltrace, LD_PRELOAD, LD_PROFILE, and LD_AUDIT
don't work. Again, bonus points to the first person coming up
with a valid rcutorture use case requiring these features in
its initrd.
Nevertheless, the script will use dracut if available, and will create the
statically linked binary only when dracut are missing. Those preferring
the smaller initrd directory resulting from the statically linked binary
(like me) are free to hand-edit mkinitrd.sh to remove the code using
dracut. ;-)
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
2018-08-24 01:48:18 +08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
___EOF___
|
2018-09-09 19:33:02 +08:00
|
|
|
|
|
|
|
# build using nolibc on supported archs (smaller executable) and fall
|
|
|
|
# back to regular glibc on other ones.
|
|
|
|
if echo -e "#if __x86_64__||__i386__||__i486__||__i586__||__i686__" \
|
|
|
|
"||__ARM_EABI__||__aarch64__\nyes\n#endif" \
|
|
|
|
| ${CROSS_COMPILE}gcc -E -nostdlib -xc - \
|
|
|
|
| grep -q '^yes'; then
|
|
|
|
# architecture supported by nolibc
|
|
|
|
${CROSS_COMPILE}gcc -fno-asynchronous-unwind-tables -fno-ident \
|
2018-12-30 02:04:53 +08:00
|
|
|
-nostdlib -include ../../../../include/nolibc/nolibc.h \
|
2021-01-21 15:48:08 +08:00
|
|
|
-s -static -Os -o init init.c -lgcc
|
2018-09-09 19:33:02 +08:00
|
|
|
else
|
|
|
|
${CROSS_COMPILE}gcc -s -static -Os -o init init.c
|
|
|
|
fi
|
|
|
|
|
rcutorture: Add initrd support for systems lacking dracut
The support for creating initrd directories using dracut is a great
improvement over having to always hand-create them, it is a bit annoying
to have to install some otherwise irrelevant package just to be able to
run rcutorture. This commit therefore adds support for creating initrd
directories on systems innocent of dracut. You do need gcc, but then
again you need that to build the kernel (or to build llvm) in any case.
The idea is to create an initrd directory containing nothing but a
statically linked binary having a for-loop over a long-term sleep().
The result is a Linux kernel with almost no userspace: even the
time-honored /dev, /lib, /tmp, and /usr directories are gone. In fact,
the only directory present is "/", but only because I don't know how to
get rid of it, at least short of not having an initrd in the first place.
Although statically linked binaries are much maligned, and rightly so,
their disadvantages seem to be irrelevant for this particular use case.
From https://www.akkadia.org/drepper/no_static_linking.html:
1. Fixes are difficult to apply to hordes of widely scattered
statically linked binaries. But in this case, there is only one
binary, but there would otherwise be no fewer than four libraries.
2. Security measures like local address randomization cannot be used.
Prudence prevents me from asserting that it is impossible to
base a remote attack on a networking-free rcutorture instance.
Nevertheless, bonus points to the first person who comes up with
such an attack!
3. More efficient use of physical memory. Not in this case, given
that libc is 1.8MB and the statically linked binary "only" 800K.
4. Features such as locales, name service switch (NSS),
internationalized domain names (IDN) tool, and so on require
dynamic linking. Bonus points to the first person coming up
with a valid rcutorture use case requiring these features in
its initrd.
5. Accidental violations of (L)GPL. Actually, this change actually
helps -avoid- such violations by reducing the temptation to
pass around tarballs of rcutorture-ready initrd directories.
After all, the rcutorture scripts automatically create an initrd
directory for you, so why bother with the tarballs?
6. Tools and hacks like ltrace, LD_PRELOAD, LD_PROFILE, and LD_AUDIT
don't work. Again, bonus points to the first person coming up
with a valid rcutorture use case requiring these features in
its initrd.
Nevertheless, the script will use dracut if available, and will create the
statically linked binary only when dracut are missing. Those preferring
the smaller initrd directory resulting from the statically linked binary
(like me) are free to hand-edit mkinitrd.sh to remove the code using
dracut. ;-)
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
2018-08-24 01:48:18 +08:00
|
|
|
rm init.c
|
|
|
|
echo "Done creating a statically linked C-language initrd"
|
|
|
|
|
2018-08-23 05:16:46 +08:00
|
|
|
exit 0
|