Enable sanitizers for Aarch64 in spec files: 82/72382/1
authorMaxim Ostapenko <m.ostapenko@samsung.com>
Thu, 24 Mar 2016 12:11:16 +0000 (15:11 +0300)
committerMaxim Ostapenko <m.ostapenko@samsung.com>
Tue, 31 May 2016 16:06:51 +0000 (19:06 +0300)
Deliver {a, l, ub}san-force-options and {a, l}san-build-env packages.

Change-Id: I2b49fabac8068ffa1170fdc4b2b96fe9a42eb25b
Signed-off-by: Maxim Ostapenko <m.ostapenko@samsung.com>
packaging/gcc-aarch64.spec
packaging/gcc-armv7l.spec
packaging/gcc-force-options [new file with mode: 0755]
packaging/gcc-unforce-options [new file with mode: 0755]
packaging/linaro-gcc.spec

index b211b6a..b637910 100644 (file)
 %define gcc_run_tests 1
 %endif
 
-%define tsan_arch x86_64
-%define asan_arch x86_64 %ix86 ppc ppc64 %sparc %arm
+%define tsan_arch x86_64 aarch64
+%define asan_arch x86_64 %ix86 ppc ppc64 %sparc %arm aarch64
 %define itm_arch x86_64 %ix86 %arm ppc ppc64 ppc64le s390 s390x %sparc aarch64
 %define atomic_arch x86_64 %ix86 %arm aarch64 ppc ppc64 ppc64le s390 s390x %sparc m68k
-%define lsan_arch x86_64
-%define ubsan_arch x86_64 %ix86 ppc ppc64 %arm
+%define lsan_arch x86_64 aarch64
+%define ubsan_arch x86_64 %ix86 ppc ppc64 %arm aarch64
 %define cilkrts_arch x86_64 %ix86
 
 %ifarch armv7l
@@ -83,6 +83,8 @@ Source11: mpfr-3.1.2.tar.gz
 Source12: mpc-1.0.tar.gz
 Source13: isl-0.12.2.tar.bz2
 Source14: cloog-0.18.1.tar.gz
+Source15: gcc-force-options
+Source16: gcc-unforce-options
 Group:         Development/Building
 Summary:       The GNU C Compiler and Support Files
 License:       GPL-3.0+
@@ -583,6 +585,101 @@ A foreign function interface is the popular name for the interface that allows c
 %post -n libgo-32bit -p /sbin/ldconfig
 %postun -n libgo-32bit -p /sbin/ldconfig
 
+%package -n asan-force-options
+Summary:    Scripts to enable automatic package sanitization
+Group:      System Environment
+Requires:   gcc
+Requires:   libasan
+
+%description -n asan-force-options
+Scripts for ASan instrumentation
+
+%post -n asan-force-options
+# Change mode to allow all users to run gcc-force/unforce-options
+chmod a+w /usr/bin
+/usr/bin/gcc-force-options -fsanitize-recover=address -fsanitize=address -fno-common -fno-omit-frame-pointer -U_FORTIFY_SOURCE
+
+%preun -n asan-force-options
+# Restore read-only mode
+chmod a-w /usr/bin
+/usr/bin/gcc-unforce-options
+
+%package -n ubsan-force-options
+Summary:    Scripts to enable automatic package sanitization
+Group:      System Environment
+Requires:   gcc
+Requires:   libubsan
+
+%description -n ubsan-force-options
+Scripts for UBSan instrumentation
+
+%post -n ubsan-force-options
+# Change mode to allow all users to run gcc-force/unforce-options
+chmod a+w /usr/bin
+/usr/bin/gcc-force-options -fsanitize=undefined,bounds-strict,float-divide-by-zero,float-cast-overflow
+
+%preun -n ubsan-force-options
+# Restore read-only mode
+chmod a-w /usr/bin
+/usr/bin/gcc-unforce-options
+
+%package -n lsan-force-options
+Summary:    Scripts to enable automatic package sanitization
+Group:      System Environment
+Requires:   gcc
+Requires:   liblsan
+
+%description -n lsan-force-options
+Scripts for LSan instrumentation
+
+%post -n lsan-force-options
+# Change mode to allow all users to run gcc-force/unforce-options
+chmod a+w /usr/bin
+/usr/bin/gcc-force-options -fsanitize=leak
+
+%preun -n lsan-force-options
+# Restore read-only mode
+chmod a-w /usr/bin
+/usr/bin/gcc-unforce-options
+
+%package -n asan-build-env
+Summary:    Asan build environment
+Group:      Development/Libraries
+Requires:   libasan
+
+%description -n asan-build-env
+Asan build environment
+
+%post -n asan-build-env
+# Add /usr/lib/libasan.so to /etc/ld.so.preload
+mv -v /etc/ld.so.preload /etc/ld.so.preload.orig
+echo "/usr/lib/libasan.so" > /etc/ld.so.preload
+cat /etc/ld.so.preload.orig >> /etc/ld.so.preload
+rm -f /etc/ld.so.preload.orig
+echo "halt_on_error=false:start_deactivated=true:print_cmdline=true:quarantine_size_mb=1" > /ASAN_OPTIONS
+
+%preun -n asan-build-env
+# Restore /etc/ld.so.preload
+mv -v /etc/ld.so.preload.orig /etc/ld.so.preload
+
+%package -n lsan-build-env
+Summary:    Lsan build environment
+Group:      Development/Libraries
+Requires:   liblsan
+
+%description -n lsan-build-env
+Lsan build environment
+
+%post -n lsan-build-env
+# Add /usr/lib/liblsan.so to /etc/ld.so.preload
+mv -v /etc/ld.so.preload /etc/ld.so.preload.orig
+echo "/usr/lib/liblsan.so" > /etc/ld.so.preload
+cat /etc/ld.so.preload.orig >> /etc/ld.so.preload
+rm -f /etc/ld.so.preload.orig
+
+%preun -n lsan-build-env
+# Restore /etc/ld.so.preload
+mv -v /etc/ld.so.preload.orig /etc/ld.so.preload
 
 %prep
 %setup -q -n gcc-%{version}
@@ -746,6 +843,10 @@ rm -rf %{buildroot}/%{libsubdir}/include-fixed
 rm -rf %{buildroot}/%{libsubdir}/include
 }
 
+cp %{SOURCE15} %{SOURCE16} %{buildroot}%{_prefix}/bin
+chmod a+x %{buildroot}%{_prefix}/bin/gcc-force-options
+chmod a+x %{buildroot}%{_prefix}/bin/gcc-unforce-options
+
 %files
 %defattr(-,root,root)
 %{?cross:
@@ -780,9 +881,7 @@ rm -rf %{buildroot}/%{libsubdir}/include
 %ifarch %cilkrts_arch
 %{libsubdir}/include/cilk/*
 %endif
-%ifnarch aarch64
 %{libsubdir}/include/sanitizer/*
-%endif
 
 %files c++
 %defattr(-,root,root)
@@ -936,6 +1035,32 @@ rm -rf %{buildroot}/%{libsubdir}/include
 %defattr(-,root,root)
 %{libsubdir}/32/libstdc++.so.*-gdb.py
 %endif
+
+%files -n asan-force-options
+%defattr(-,root,root,-)
+%{_prefix}/bin/gcc-force-options
+%{_prefix}/bin/gcc-unforce-options
+
+%files -n ubsan-force-options
+%defattr(-,root,root,-)
+%{_prefix}/bin/gcc-force-options
+%{_prefix}/bin/gcc-unforce-options
+
+%ifarch %lsan_arch
+%files -n lsan-force-options
+%defattr(-,root,root,-)
+%{_prefix}/bin/gcc-force-options
+%{_prefix}/bin/gcc-unforce-options
+%endif
+
+%files -n asan-build-env
+%defattr(-,root,root,-)
+
+%ifarch %lsan_arch
+%files -n lsan-build-env
+%defattr(-,root,root,-)
+%endif
+
 }
 
 %changelog
index efd7e27..1b98e89 100644 (file)
 %define gcc_run_tests 1
 %endif
 
-%define tsan_arch x86_64
-%define asan_arch x86_64 %ix86 ppc ppc64 %sparc %arm
+%define tsan_arch x86_64 aarch64
+%define asan_arch x86_64 %ix86 ppc ppc64 %sparc %arm aarch64
 %define itm_arch x86_64 %ix86 %arm ppc ppc64 ppc64le s390 s390x %sparc aarch64
 %define atomic_arch x86_64 %ix86 %arm aarch64 ppc ppc64 ppc64le s390 s390x %sparc m68k
-%define lsan_arch x86_64
-%define ubsan_arch x86_64 %ix86 ppc ppc64 %arm
+%define lsan_arch x86_64 aarch64
+%define ubsan_arch x86_64 %ix86 ppc ppc64 %arm aarch64
 %define cilkrts_arch x86_64 %ix86
 
 %ifarch armv7l
@@ -83,6 +83,8 @@ Source11: mpfr-3.1.2.tar.gz
 Source12: mpc-1.0.tar.gz
 Source13: isl-0.12.2.tar.bz2
 Source14: cloog-0.18.1.tar.gz
+Source15: gcc-force-options
+Source16: gcc-unforce-options
 Group:         Development/Building
 Summary:       The GNU C Compiler and Support Files
 License:       GPL-3.0+
@@ -583,6 +585,101 @@ A foreign function interface is the popular name for the interface that allows c
 %post -n libgo-32bit -p /sbin/ldconfig
 %postun -n libgo-32bit -p /sbin/ldconfig
 
+%package -n asan-force-options
+Summary:    Scripts to enable automatic package sanitization
+Group:      System Environment
+Requires:   gcc
+Requires:   libasan
+
+%description -n asan-force-options
+Scripts for ASan instrumentation
+
+%post -n asan-force-options
+# Change mode to allow all users to run gcc-force/unforce-options
+chmod a+w /usr/bin
+/usr/bin/gcc-force-options -fsanitize-recover=address -fsanitize=address -fno-common -fno-omit-frame-pointer -U_FORTIFY_SOURCE
+
+%preun -n asan-force-options
+# Restore read-only mode
+chmod a-w /usr/bin
+/usr/bin/gcc-unforce-options
+
+%package -n ubsan-force-options
+Summary:    Scripts to enable automatic package sanitization
+Group:      System Environment
+Requires:   gcc
+Requires:   libubsan
+
+%description -n ubsan-force-options
+Scripts for UBSan instrumentation
+
+%post -n ubsan-force-options
+# Change mode to allow all users to run gcc-force/unforce-options
+chmod a+w /usr/bin
+/usr/bin/gcc-force-options -fsanitize=undefined,bounds-strict,float-divide-by-zero,float-cast-overflow
+
+%preun -n ubsan-force-options
+# Restore read-only mode
+chmod a-w /usr/bin
+/usr/bin/gcc-unforce-options
+
+%package -n lsan-force-options
+Summary:    Scripts to enable automatic package sanitization
+Group:      System Environment
+Requires:   gcc
+Requires:   liblsan
+
+%description -n lsan-force-options
+Scripts for LSan instrumentation
+
+%post -n lsan-force-options
+# Change mode to allow all users to run gcc-force/unforce-options
+chmod a+w /usr/bin
+/usr/bin/gcc-force-options -fsanitize=leak
+
+%preun -n lsan-force-options
+# Restore read-only mode
+chmod a-w /usr/bin
+/usr/bin/gcc-unforce-options
+
+%package -n asan-build-env
+Summary:    Asan build environment
+Group:      Development/Libraries
+Requires:   libasan
+
+%description -n asan-build-env
+Asan build environment
+
+%post -n asan-build-env
+# Add /usr/lib/libasan.so to /etc/ld.so.preload
+mv -v /etc/ld.so.preload /etc/ld.so.preload.orig
+echo "/usr/lib/libasan.so" > /etc/ld.so.preload
+cat /etc/ld.so.preload.orig >> /etc/ld.so.preload
+rm -f /etc/ld.so.preload.orig
+echo "halt_on_error=false:start_deactivated=true:print_cmdline=true:quarantine_size_mb=1" > /ASAN_OPTIONS
+
+%preun -n asan-build-env
+# Restore /etc/ld.so.preload
+mv -v /etc/ld.so.preload.orig /etc/ld.so.preload
+
+%package -n lsan-build-env
+Summary:    Lsan build environment
+Group:      Development/Libraries
+Requires:   liblsan
+
+%description -n lsan-build-env
+Lsan build environment
+
+%post -n lsan-build-env
+# Add /usr/lib/liblsan.so to /etc/ld.so.preload
+mv -v /etc/ld.so.preload /etc/ld.so.preload.orig
+echo "/usr/lib/liblsan.so" > /etc/ld.so.preload
+cat /etc/ld.so.preload.orig >> /etc/ld.so.preload
+rm -f /etc/ld.so.preload.orig
+
+%preun -n lsan-build-env
+# Restore /etc/ld.so.preload
+mv -v /etc/ld.so.preload.orig /etc/ld.so.preload
 
 %prep
 %setup -q -n gcc-%{version}
@@ -746,6 +843,10 @@ rm -rf %{buildroot}/%{libsubdir}/include-fixed
 rm -rf %{buildroot}/%{libsubdir}/include
 }
 
+cp %{SOURCE15} %{SOURCE16} %{buildroot}%{_prefix}/bin
+chmod a+x %{buildroot}%{_prefix}/bin/gcc-force-options
+chmod a+x %{buildroot}%{_prefix}/bin/gcc-unforce-options
+
 %files
 %defattr(-,root,root)
 %{?cross:
@@ -780,9 +881,7 @@ rm -rf %{buildroot}/%{libsubdir}/include
 %ifarch %cilkrts_arch
 %{libsubdir}/include/cilk/*
 %endif
-%ifnarch aarch64
 %{libsubdir}/include/sanitizer/*
-%endif
 
 %files c++
 %defattr(-,root,root)
@@ -936,6 +1035,32 @@ rm -rf %{buildroot}/%{libsubdir}/include
 %defattr(-,root,root)
 %{libsubdir}/32/libstdc++.so.*-gdb.py
 %endif
+
+%files -n asan-force-options
+%defattr(-,root,root,-)
+%{_prefix}/bin/gcc-force-options
+%{_prefix}/bin/gcc-unforce-options
+
+%files -n ubsan-force-options
+%defattr(-,root,root,-)
+%{_prefix}/bin/gcc-force-options
+%{_prefix}/bin/gcc-unforce-options
+
+%ifarch %lsan_arch
+%files -n lsan-force-options
+%defattr(-,root,root,-)
+%{_prefix}/bin/gcc-force-options
+%{_prefix}/bin/gcc-unforce-options
+%endif
+
+%files -n asan-build-env
+%defattr(-,root,root,-)
+
+%ifarch %lsan_arch
+%files -n lsan-build-env
+%defattr(-,root,root,-)
+%endif
+
 }
 
 %changelog
diff --git a/packaging/gcc-force-options b/packaging/gcc-force-options
new file mode 100755 (executable)
index 0000000..3f48ec7
--- /dev/null
@@ -0,0 +1,64 @@
+#!/bin/sh
+
+set -e
+
+if [ $# -eq 0 ]; then
+       cat << EOF
+Syntax:
+  $(basename $0) OPT1 [OPT2...]"
+
+Example:
+  $(basename $0) [prepend|append] -fsanitize=address -fno-common -U_FORTIFY_SOURCE
+  By default flags are appending.
+EOF
+       exit 1
+fi
+
+FLAGS="$@"
+
+if [ $(find $(dirname $0) -name \*-real | wc -l) -gt 0 ]; then
+       echo >&2 "$(basename $0): directory was already processed, aborting"
+       exit 1
+fi
+
+case "$1" in
+prepend)
+       shift
+       PREFLAGS="$@"
+       POSTFLAGS=
+       ;;
+append)
+       shift
+       PREFLAGS=
+       POSTFLAGS="$@"
+       ;;
+*)
+       PREFLAGS=
+       POSTFLAGS="$@"
+       ;;
+esac
+
+TMP=$(pwd)/tmp.$$
+cat > $TMP << EOF
+#!/bin/sh
+if echo "$PREFLAGS "\$@" $POSTFLAGS" | grep -q -- "-fsanitize=undefined" && echo "\$@" | grep -q "\.gch\>"; then
+       # UBSan doesn't support precompiled headers. See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66343
+       echo "Precompiled headers currently not supported by UBSan" >&2
+       # Don't instrument kernel modules
+       # Don't instrument with "-nostdlib" linking
+elif ! echo "\$@" | grep -q -e __KERNEL__ -e \-nostdlib; then
+       # Use readlink in order to follow symlinks if any
+       \$(readlink -f \$0)-real $PREFLAGS "\$@" $POSTFLAGS
+else
+       \$(readlink -f \$0)-real "\$@"
+fi
+EOF
+chmod +x $TMP
+
+find -L $(dirname $0) -type f -a -perm -a=x | grep -E '(gcc|g\+\+|c\+\+)$' | while read tool; do
+       mv $tool $tool-real
+       cp $TMP $tool
+done
+
+rm $TMP
+
diff --git a/packaging/gcc-unforce-options b/packaging/gcc-unforce-options
new file mode 100755 (executable)
index 0000000..7f57c05
--- /dev/null
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+set -e
+
+if [ $# -gt 0 ]; then
+       echo >&2 "$(basename $0): unexpected arguments"
+       exit 1
+fi
+
+find $(dirname $0) -name \*-real | while read tool_real; do
+       tool=$(echo "$tool_real" | sed -e 's/-real$//')
+       mv $tool_real $tool
+done
+
index 61fe09d..a48180c 100644 (file)
 %define gcc_run_tests 1
 %endif
 
-%define tsan_arch x86_64
-%define asan_arch x86_64 %ix86 ppc ppc64 %sparc %arm
+%define tsan_arch x86_64 aarch64
+%define asan_arch x86_64 %ix86 ppc ppc64 %sparc %arm aarch64
 %define itm_arch x86_64 %ix86 %arm ppc ppc64 ppc64le s390 s390x %sparc aarch64
 %define atomic_arch x86_64 %ix86 %arm aarch64 ppc ppc64 ppc64le s390 s390x %sparc m68k
-%define lsan_arch x86_64
-%define ubsan_arch x86_64 %ix86 ppc ppc64 %arm
+%define lsan_arch x86_64 aarch64
+%define ubsan_arch x86_64 %ix86 ppc ppc64 %arm aarch64
 %define cilkrts_arch x86_64 %ix86
 
 %ifarch armv7l
@@ -80,6 +80,8 @@ Source11: mpfr-3.1.2.tar.gz
 Source12: mpc-1.0.tar.gz
 Source13: isl-0.12.2.tar.bz2
 Source14: cloog-0.18.1.tar.gz
+Source15: gcc-force-options
+Source16: gcc-unforce-options
 Group:         Development/Building
 Summary:       The GNU C Compiler and Support Files
 License:       GPL-3.0+
@@ -580,6 +582,101 @@ A foreign function interface is the popular name for the interface that allows c
 %post -n libgo-32bit -p /sbin/ldconfig
 %postun -n libgo-32bit -p /sbin/ldconfig
 
+%package -n asan-force-options
+Summary:    Scripts to enable automatic package sanitization
+Group:      System Environment
+Requires:   gcc
+Requires:   libasan
+
+%description -n asan-force-options
+Scripts for ASan instrumentation
+
+%post -n asan-force-options
+# Change mode to allow all users to run gcc-force/unforce-options
+chmod a+w /usr/bin
+/usr/bin/gcc-force-options -fsanitize-recover=address -fsanitize=address -fno-common -fno-omit-frame-pointer -U_FORTIFY_SOURCE
+
+%preun -n asan-force-options
+# Restore read-only mode
+chmod a-w /usr/bin
+/usr/bin/gcc-unforce-options
+
+%package -n ubsan-force-options
+Summary:    Scripts to enable automatic package sanitization
+Group:      System Environment
+Requires:   gcc
+Requires:   libubsan
+
+%description -n ubsan-force-options
+Scripts for UBSan instrumentation
+
+%post -n ubsan-force-options
+# Change mode to allow all users to run gcc-force/unforce-options
+chmod a+w /usr/bin
+/usr/bin/gcc-force-options -fsanitize=undefined,bounds-strict,float-divide-by-zero,float-cast-overflow
+
+%preun -n ubsan-force-options
+# Restore read-only mode
+chmod a-w /usr/bin
+/usr/bin/gcc-unforce-options
+
+%package -n lsan-force-options
+Summary:    Scripts to enable automatic package sanitization
+Group:      System Environment
+Requires:   gcc
+Requires:   liblsan
+
+%description -n lsan-force-options
+Scripts for LSan instrumentation
+
+%post -n lsan-force-options
+# Change mode to allow all users to run gcc-force/unforce-options
+chmod a+w /usr/bin
+/usr/bin/gcc-force-options -fsanitize=leak
+
+%preun -n lsan-force-options
+# Restore read-only mode
+chmod a-w /usr/bin
+/usr/bin/gcc-unforce-options
+
+%package -n asan-build-env
+Summary:    Asan build environment
+Group:      Development/Libraries
+Requires:   libasan
+
+%description -n asan-build-env
+Asan build environment
+
+%post -n asan-build-env
+# Add /usr/lib/libasan.so to /etc/ld.so.preload
+mv -v /etc/ld.so.preload /etc/ld.so.preload.orig
+echo "/usr/lib/libasan.so" > /etc/ld.so.preload
+cat /etc/ld.so.preload.orig >> /etc/ld.so.preload
+rm -f /etc/ld.so.preload.orig
+echo "halt_on_error=false:start_deactivated=true:print_cmdline=true:quarantine_size_mb=1" > /ASAN_OPTIONS
+
+%preun -n asan-build-env
+# Restore /etc/ld.so.preload
+mv -v /etc/ld.so.preload.orig /etc/ld.so.preload
+
+%package -n lsan-build-env
+Summary:    Lsan build environment
+Group:      Development/Libraries
+Requires:   liblsan
+
+%description -n lsan-build-env
+Lsan build environment
+
+%post -n lsan-build-env
+# Add /usr/lib/liblsan.so to /etc/ld.so.preload
+mv -v /etc/ld.so.preload /etc/ld.so.preload.orig
+echo "/usr/lib/liblsan.so" > /etc/ld.so.preload
+cat /etc/ld.so.preload.orig >> /etc/ld.so.preload
+rm -f /etc/ld.so.preload.orig
+
+%preun -n lsan-build-env
+# Restore /etc/ld.so.preload
+mv -v /etc/ld.so.preload.orig /etc/ld.so.preload
 
 %prep
 %setup -q -n gcc-%{version}
@@ -743,6 +840,10 @@ rm -rf %{buildroot}/%{libsubdir}/include-fixed
 rm -rf %{buildroot}/%{libsubdir}/include
 }
 
+cp %{SOURCE15} %{SOURCE16} %{buildroot}%{_prefix}/bin
+chmod a+x %{buildroot}%{_prefix}/bin/gcc-force-options
+chmod a+x %{buildroot}%{_prefix}/bin/gcc-unforce-options
+
 %files
 %defattr(-,root,root)
 %{?cross:
@@ -777,9 +878,7 @@ rm -rf %{buildroot}/%{libsubdir}/include
 %ifarch %cilkrts_arch
 %{libsubdir}/include/cilk/*
 %endif
-%ifnarch aarch64
 %{libsubdir}/include/sanitizer/*
-%endif
 
 %files c++
 %defattr(-,root,root)
@@ -933,6 +1032,32 @@ rm -rf %{buildroot}/%{libsubdir}/include
 %defattr(-,root,root)
 %{libsubdir}/32/libstdc++.so.*-gdb.py
 %endif
+
+%files -n asan-force-options
+%defattr(-,root,root,-)
+%{_prefix}/bin/gcc-force-options
+%{_prefix}/bin/gcc-unforce-options
+
+%files -n ubsan-force-options
+%defattr(-,root,root,-)
+%{_prefix}/bin/gcc-force-options
+%{_prefix}/bin/gcc-unforce-options
+
+%ifarch %lsan_arch
+%files -n lsan-force-options
+%defattr(-,root,root,-)
+%{_prefix}/bin/gcc-force-options
+%{_prefix}/bin/gcc-unforce-options
+%endif
+
+%files -n asan-build-env
+%defattr(-,root,root,-)
+
+%ifarch %lsan_arch
+%files -n lsan-build-env
+%defattr(-,root,root,-)
+%endif
+
 }
 
 %changelog