forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This patch allows to build the whole kernel with GCC plugins. It was ported from grsecurity/PaX. The infrastructure supports building out-of-tree modules and building in a separate directory. Cross-compilation is supported too. Currently the x86, arm, arm64 and uml architectures enable plugins. The directory of the gcc plugins is scripts/gcc-plugins. You can use a file or a directory there. The plugins compile with these options: * -fno-rtti: gcc is compiled with this option so the plugins must use it too * -fno-exceptions: this is inherited from gcc too * -fasynchronous-unwind-tables: this is inherited from gcc too * -ggdb: it is useful for debugging a plugin (better backtrace on internal errors) * -Wno-narrowing: to suppress warnings from gcc headers (ipa-utils.h) * -Wno-unused-variable: to suppress warnings from gcc headers (gcc_version variable, plugin-version.h) The infrastructure introduces a new Makefile target called gcc-plugins. It supports all gcc versions from 4.5 to 6.0. The scripts/gcc-plugin.sh script chooses the proper host compiler (gcc-4.7 can be built by either gcc or g++). This script also checks the availability of the included headers in scripts/gcc-plugins/gcc-common.h. The gcc-common.h header contains frequently included headers for GCC plugins and it has a compatibility layer for the supported gcc versions. The gcc-generate-*-pass.h headers automatically generate the registration structures for GIMPLE, SIMPLE_IPA, IPA and RTL passes. Note that 'make clean' keeps the *.so files (only the distclean or mrproper targets clean all) because they are needed for out-of-tree modules. Based on work created by the PaX Team. Signed-off-by: Emese Revfy <[email protected]> Acked-by: Kees Cook <[email protected]> Signed-off-by: Michal Marek <[email protected]>
- Loading branch information
1 parent
2440387
commit 6b90bd4
Showing
22 changed files
with
1,872 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -37,6 +37,7 @@ modules.builtin | |
Module.symvers | ||
*.dwo | ||
*.su | ||
*.c.[012]*.* | ||
|
||
# | ||
# Top-level generic files | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,6 +3,7 @@ | |
*.bc | ||
*.bin | ||
*.bz2 | ||
*.c.[012]*.* | ||
*.cis | ||
*.cpio | ||
*.csp | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
GCC plugin infrastructure | ||
========================= | ||
|
||
|
||
1. Introduction | ||
=============== | ||
|
||
GCC plugins are loadable modules that provide extra features to the | ||
compiler [1]. They are useful for runtime instrumentation and static analysis. | ||
We can analyse, change and add further code during compilation via | ||
callbacks [2], GIMPLE [3], IPA [4] and RTL passes [5]. | ||
|
||
The GCC plugin infrastructure of the kernel supports all gcc versions from | ||
4.5 to 6.0, building out-of-tree modules, cross-compilation and building in a | ||
separate directory. | ||
Plugin source files have to be compilable by both a C and a C++ compiler as well | ||
because gcc versions 4.5 and 4.6 are compiled by a C compiler, | ||
gcc-4.7 can be compiled by a C or a C++ compiler, | ||
and versions 4.8+ can only be compiled by a C++ compiler. | ||
|
||
Currently the GCC plugin infrastructure supports only the x86, arm and arm64 | ||
architectures. | ||
|
||
This infrastructure was ported from grsecurity [6] and PaX [7]. | ||
|
||
-- | ||
[1] https://gcc.gnu.org/onlinedocs/gccint/Plugins.html | ||
[2] https://gcc.gnu.org/onlinedocs/gccint/Plugin-API.html#Plugin-API | ||
[3] https://gcc.gnu.org/onlinedocs/gccint/GIMPLE.html | ||
[4] https://gcc.gnu.org/onlinedocs/gccint/IPA.html | ||
[5] https://gcc.gnu.org/onlinedocs/gccint/RTL.html | ||
[6] https://grsecurity.net/ | ||
[7] https://pax.grsecurity.net/ | ||
|
||
|
||
2. Files | ||
======== | ||
|
||
$(src)/scripts/gcc-plugins | ||
This is the directory of the GCC plugins. | ||
|
||
$(src)/scripts/gcc-plugins/gcc-common.h | ||
This is a compatibility header for GCC plugins. | ||
It should be always included instead of individual gcc headers. | ||
|
||
$(src)/scripts/gcc-plugin.sh | ||
This script checks the availability of the included headers in | ||
gcc-common.h and chooses the proper host compiler to build the plugins | ||
(gcc-4.7 can be built by either gcc or g++). | ||
|
||
$(src)/scripts/gcc-plugins/gcc-generate-gimple-pass.h | ||
$(src)/scripts/gcc-plugins/gcc-generate-ipa-pass.h | ||
$(src)/scripts/gcc-plugins/gcc-generate-simple_ipa-pass.h | ||
$(src)/scripts/gcc-plugins/gcc-generate-rtl-pass.h | ||
These headers automatically generate the registration structures for | ||
GIMPLE, SIMPLE_IPA, IPA and RTL passes. They support all gcc versions | ||
from 4.5 to 6.0. | ||
They should be preferred to creating the structures by hand. | ||
|
||
|
||
3. Usage | ||
======== | ||
|
||
You must install the gcc plugin headers for your gcc version, | ||
e.g., on Ubuntu for gcc-4.9: | ||
|
||
apt-get install gcc-4.9-plugin-dev | ||
|
||
Enable a GCC plugin based feature in the kernel config: | ||
|
||
CONFIG_GCC_PLUGIN_CYC_COMPLEXITY = y | ||
|
||
To compile only the plugin(s): | ||
|
||
make gcc-plugins | ||
|
||
or just run the kernel make and compile the whole kernel with | ||
the cyclomatic complexity GCC plugin. | ||
|
||
|
||
4. How to add a new GCC plugin | ||
============================== | ||
|
||
The GCC plugins are in $(src)/scripts/gcc-plugins/. You can use a file or a directory | ||
here. It must be added to $(src)/scripts/gcc-plugins/Makefile, | ||
$(src)/scripts/Makefile.gcc-plugins and $(src)/arch/Kconfig. | ||
See the cyc_complexity_plugin.c (CONFIG_GCC_PLUGIN_CYC_COMPLEXITY) GCC plugin. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4979,6 +4979,15 @@ L: [email protected] | |
S: Odd Fixes (e.g., new signatures) | ||
F: drivers/scsi/fdomain.* | ||
|
||
GCC PLUGINS | ||
M: Kees Cook <[email protected]> | ||
R: Emese Revfy <[email protected]> | ||
L: [email protected] | ||
S: Maintained | ||
F: scripts/gcc-plugins/ | ||
F: scripts/gcc-plugin.sh | ||
F: Documentation/gcc-plugins.txt | ||
|
||
GCOV BASED KERNEL PROFILING | ||
M: Peter Oberparleiter <[email protected]> | ||
S: Maintained | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
ifdef CONFIG_GCC_PLUGINS | ||
__PLUGINCC := $(call cc-ifversion, -ge, 0408, $(HOSTCXX), $(HOSTCC)) | ||
PLUGINCC := $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-plugin.sh "$(__PLUGINCC)" "$(HOSTCXX)" "$(CC)") | ||
|
||
GCC_PLUGINS_CFLAGS := $(addprefix -fplugin=$(objtree)/scripts/gcc-plugins/, $(gcc-plugin-y)) | ||
|
||
export PLUGINCC GCC_PLUGINS_CFLAGS GCC_PLUGIN | ||
|
||
ifeq ($(PLUGINCC),) | ||
ifneq ($(GCC_PLUGINS_CFLAGS),) | ||
ifeq ($(call cc-ifversion, -ge, 0405, y), y) | ||
PLUGINCC := $(shell $(CONFIG_SHELL) -x $(srctree)/scripts/gcc-plugin.sh "$(__PLUGINCC)" "$(HOSTCXX)" "$(CC)") | ||
$(warning warning: your gcc installation does not support plugins, perhaps the necessary headers are missing?) | ||
else | ||
$(warning warning: your gcc version does not support plugins, you should upgrade it to gcc 4.5 at least) | ||
endif | ||
endif | ||
endif | ||
|
||
KBUILD_CFLAGS += $(GCC_PLUGINS_CFLAGS) | ||
GCC_PLUGIN := $(gcc-plugin-y) | ||
|
||
endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
#!/bin/sh | ||
srctree=$(dirname "$0") | ||
gccplugins_dir=$($3 -print-file-name=plugin) | ||
plugincc=$($1 -E -x c++ - -o /dev/null -I"${srctree}"/gcc-plugins -I"${gccplugins_dir}"/include 2>&1 <<EOF | ||
#include "gcc-common.h" | ||
#if BUILDING_GCC_VERSION >= 4008 || defined(ENABLE_BUILD_WITH_CXX) | ||
#warning $2 CXX | ||
#else | ||
#warning $1 CC | ||
#endif | ||
EOF | ||
) | ||
|
||
if [ $? -ne 0 ] | ||
then | ||
exit 1 | ||
fi | ||
|
||
case "$plugincc" in | ||
*"$1 CC"*) | ||
echo "$1" | ||
exit 0 | ||
;; | ||
|
||
*"$2 CXX"*) | ||
# the c++ compiler needs another test, see below | ||
;; | ||
|
||
*) | ||
exit 1 | ||
;; | ||
esac | ||
|
||
# we need a c++ compiler that supports the designated initializer GNU extension | ||
plugincc=$($2 -c -x c++ -std=gnu++98 - -fsyntax-only -I"${srctree}"/gcc-plugins -I"${gccplugins_dir}"/include 2>&1 <<EOF | ||
#include "gcc-common.h" | ||
class test { | ||
public: | ||
int test; | ||
} test = { | ||
.test = 1 | ||
}; | ||
EOF | ||
) | ||
|
||
if [ $? -eq 0 ] | ||
then | ||
echo "$2" | ||
exit 0 | ||
fi | ||
exit 1 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
GCC_PLUGINS_DIR := $(shell $(CC) -print-file-name=plugin) | ||
|
||
ifeq ($(PLUGINCC),$(HOSTCC)) | ||
HOSTLIBS := hostlibs | ||
HOST_EXTRACFLAGS += -I$(GCC_PLUGINS_DIR)/include -I$(src) -std=gnu99 -ggdb | ||
export HOST_EXTRACFLAGS | ||
else | ||
HOSTLIBS := hostcxxlibs | ||
HOST_EXTRACXXFLAGS += -I$(GCC_PLUGINS_DIR)/include -I$(src) -std=gnu++98 -fno-rtti | ||
HOST_EXTRACXXFLAGS += -fno-exceptions -fasynchronous-unwind-tables -ggdb | ||
HOST_EXTRACXXFLAGS += -Wno-narrowing -Wno-unused-variable | ||
export HOST_EXTRACXXFLAGS | ||
endif | ||
|
||
export GCCPLUGINS_DIR HOSTLIBS | ||
|
||
$(HOSTLIBS)-y := $(GCC_PLUGIN) | ||
always := $($(HOSTLIBS)-y) | ||
|
||
clean-files += *.so |
Oops, something went wrong.