mirror of
https://github.com/yann64/haikuports.git
synced 2026-04-23 12:10:06 +02:00
gcc: enable libasan and libubsan
This allows to use GCC address and undefined behavior sanitizers. ASLR must be disabled for the address sanitizer to work (otherwise there is an mmap failure during initialization). The implementation is based on the existing ones for other POSIX-ish operating systems (mainly Linux, FreeBSD, NetBSD, as seemed appropriate). The main difficulty is that the sanitizer intercepts various C library calls but also needs the original functions. This is implemented either by direct syscalls (when simple enough), or with dlopen to locate the original symbol in libroot. Only lightly tested, but it already allowed me to find a bug in one of my projects.
This commit is contained in:
@@ -5,7 +5,7 @@ HOMEPAGE="https://gcc.gnu.org/"
|
||||
COPYRIGHT="1988-2023 Free Software Foundation, Inc."
|
||||
LICENSE="GNU GPL v3
|
||||
GNU LGPL v3"
|
||||
REVISION="3"
|
||||
REVISION="4"
|
||||
gccVersion="${portVersion%%_*}"
|
||||
SOURCE_URI="https://ftpmirror.gnu.org/gcc/gcc-$gccVersion/gcc-$gccVersion.tar.xz
|
||||
https://ftp.gnu.org/gnu/gcc/gcc-$gccVersion/gcc-$gccVersion.tar.xz"
|
||||
@@ -17,6 +17,9 @@ PATCHES="gcc-$portVersion.patchset
|
||||
ARCHITECTURES="all !x86_gcc2"
|
||||
SECONDARY_ARCHITECTURES="x86"
|
||||
|
||||
libasanSoVersion="8"
|
||||
libasanLibVersion="8.0.0"
|
||||
|
||||
libatomicSoVersion="1"
|
||||
libatomicLibVersion="1.2.0"
|
||||
|
||||
@@ -41,6 +44,9 @@ libsspLibVersion="0.0.0"
|
||||
libstdcxxSoVersion="6"
|
||||
libstdcxxLibVersion="6.0.32"
|
||||
|
||||
libubsanSoVersion="1"
|
||||
libubsanLibVersion="1.0.0"
|
||||
|
||||
PROVIDES="
|
||||
gcc$secondaryArchSuffix = $portVersion compat >= 7
|
||||
cmd:c++$secondaryArchSuffix = $portVersion compat >= 7
|
||||
@@ -115,6 +121,7 @@ distribution. This package contains the shared libraries for the runtime \
|
||||
loader, so it is required for executing most c/c++ programs."
|
||||
PROVIDES_syslibs="
|
||||
gcc${secondaryArchSuffix}_syslibs = $portVersion compat >= 7
|
||||
lib:libasan$secondaryArchSuffix = $libasanLibVersion compat >= $libasanSoVersion
|
||||
lib:libatomic$secondaryArchSuffix = $libatomicLibVersion compat >= $libatomicSoVersion
|
||||
lib:libgcc_s$secondaryArchSuffix = $libgccLibVersion compat >= $libgccSoVersion
|
||||
lib:libgfortran$secondaryArchSuffix = $libgfortranLibVersion compat >= $libgfortranSoVersion
|
||||
@@ -123,6 +130,7 @@ PROVIDES_syslibs="
|
||||
lib:libssp$secondaryArchSuffix = $libsspLibVersion compat >= $libsspSoVersion
|
||||
lib:libstdc++$secondaryArchSuffix = $libstdcxxLibVersion compat >= $libstdcxxSoVersion
|
||||
lib:libsupc++$secondaryArchSuffix = $portVersion compat >= 7
|
||||
lib:libubsan$secondaryArchSuffix = $libubsanLibVersion compat >= $libubsanSoVersion
|
||||
"
|
||||
REQUIRES_syslibs="
|
||||
haiku$secondaryArchSuffix
|
||||
@@ -135,6 +143,7 @@ contains the set of gcc's C/C++-runtime libraries and headers that is \
|
||||
required by Haiku's build system when building Haiku."
|
||||
PROVIDES_syslibs_devel="
|
||||
gcc${secondaryArchSuffix}_syslibs_devel = $portVersion compat >= 7
|
||||
devel:libasan$secondaryArchSuffix = $libasanLibVersion compat >= $libasanSoVersion
|
||||
devel:libatomic$secondaryArchSuffix = $libatomicLibVersion compat >= $libatomicSoVersion
|
||||
devel:libgcc$secondaryArchSuffix = $libgccLibVersion compat >= $libgccSoVersion
|
||||
devel:libgcc_boot$secondaryArchSuffix = $libgccLibVersion compat >= $libgccSoVersion
|
||||
@@ -153,6 +162,7 @@ PROVIDES_syslibs_devel="
|
||||
devel:libsupc++$secondaryArchSuffix = $portVersion compat >= 7
|
||||
devel:libsupc++_boot$secondaryArchSuffix = $portVersion compat >= 7
|
||||
devel:libsupc++_kernel$secondaryArchSuffix = $portVersion compat >= 7
|
||||
devel:libubsan$secondaryArchSuffix = $libubsanLibVersion compat >= $libubsanSoVersion
|
||||
"
|
||||
REQUIRES_syslibs_devel="
|
||||
gcc${secondaryArchSuffix}_syslibs == $portVersion base
|
||||
@@ -206,13 +216,15 @@ defineDebugInfoPackage gcc$secondaryArchSuffix \
|
||||
"$(getPackagePrefix fortran)/$relativeInstallDir"/bin/gfortran \
|
||||
"$(getPackagePrefix fortran)/$relativeInstallDir/$gccLibDir"/f951 \
|
||||
"$(getPackagePrefix jit)/$relativeLibDir"/libgccjit.so.$libgccjitLibVersion \
|
||||
"$(getPackagePrefix syslibs)/$relativeLibDir"/libasan.so.$libasanLibVersion \
|
||||
"$(getPackagePrefix syslibs)/$relativeLibDir"/libatomic.so.$libatomicLibVersion \
|
||||
"$(getPackagePrefix syslibs)/$relativeLibDir"/libgcc_s.so.$libgccSoVersion \
|
||||
"$(getPackagePrefix syslibs)/$relativeLibDir"/libgfortran.so.$libgfortranLibVersion \
|
||||
"$(getPackagePrefix syslibs)/$relativeLibDir"/libgomp.so.$libgompLibVersion \
|
||||
"$(getPackagePrefix syslibs)/$relativeLibDir"/libquadmath.so.$libquadmathLibVersion \
|
||||
"$(getPackagePrefix syslibs)/$relativeLibDir"/libssp.so.$libsspLibVersion \
|
||||
"$(getPackagePrefix syslibs)/$relativeLibDir"/libstdc++.so.$libstdcxxLibVersion
|
||||
"$(getPackagePrefix syslibs)/$relativeLibDir"/libstdc++.so.$libstdcxxLibVersion \
|
||||
"$(getPackagePrefix syslibs)/$relativeLibDir"/libubsan.so.$libubsanLibVersion
|
||||
|
||||
BUILD()
|
||||
{
|
||||
@@ -236,8 +248,8 @@ BUILD()
|
||||
kernelCcFlags="$kernelCcFlags -mno-red-zone"
|
||||
fi
|
||||
|
||||
"$sourceDir/configure" \
|
||||
--build=$effectiveTargetMachineTriple \
|
||||
"$sourceDir/configure" \
|
||||
--build=$effectiveTargetMachineTriple \
|
||||
--prefix=$installDir --libexecdir=$installDir/lib --mandir=$manDir \
|
||||
--docdir=$docDir --enable-threads=posix \
|
||||
--disable-nls --enable-shared --with-gnu-ld --with-gnu-as \
|
||||
@@ -248,7 +260,7 @@ BUILD()
|
||||
--enable-__cxa-atexit --with-system-zlib --enable-checking=release \
|
||||
--with-bug-url=http://dev.haiku-os.org/ \
|
||||
--with-default-libstdcxx-abi=gcc4-compatible \
|
||||
--enable-libssp --enable-host-shared \
|
||||
--enable-libssp --enable-libsanitizer --enable-host-shared \
|
||||
$additionalConfigureFlags
|
||||
|
||||
make $jobArgs
|
||||
@@ -370,6 +382,17 @@ INSTALL()
|
||||
mkdir -p $developLibDir
|
||||
cd $installDir
|
||||
|
||||
# libasan
|
||||
mv $gccLibDir/libasan.so \
|
||||
$gccLibDir/libasan.so.$libasanSoVersion \
|
||||
$gccLibDir/libasan.so.$libasanLibVersion \
|
||||
$libDir/
|
||||
ln -s $libDir/libasan.so \
|
||||
$libDir/libasan.so.$libasanSoVersion \
|
||||
$libDir/libasan.so.$libasanLibVersion \
|
||||
$gccLibDir
|
||||
rm $gccLibDir/libasan.a
|
||||
|
||||
# libatomic
|
||||
mv $gccLibDir/libatomic.so \
|
||||
$gccLibDir/libatomic.so.$libatomicSoVersion \
|
||||
@@ -453,6 +476,17 @@ INSTALL()
|
||||
ln -s $libDir/libstdc++.so $libDir/libsupc++.so
|
||||
mv $gccLibDir/libsupc++*.a $developLibDir/
|
||||
|
||||
# libubsan
|
||||
mv $gccLibDir/libubsan.so \
|
||||
$gccLibDir/libubsan.so.$libubsanSoVersion \
|
||||
$gccLibDir/libubsan.so.$libubsanLibVersion \
|
||||
$libDir/
|
||||
ln -s $libDir/libubsan.so \
|
||||
$libDir/libubsan.so.$libubsanSoVersion \
|
||||
$libDir/libubsan.so.$libubsanLibVersion \
|
||||
$gccLibDir
|
||||
rm $gccLibDir/libubsan.a
|
||||
|
||||
# libgcc
|
||||
cp $objectsDir/$effectiveTargetMachineTriple/libgcc/libgcc-kernel.a \
|
||||
$objectsDir/$effectiveTargetMachineTriple/libgcc/libgcc_eh-kernel.a \
|
||||
@@ -529,7 +563,7 @@ INSTALL()
|
||||
|
||||
# symlink all libraries from libDir -> developLibDir
|
||||
mkdir -p $developLibDir
|
||||
for l in libatomic libgccjit libgomp libquadmath libssp libgcc_s libstdc++ \
|
||||
for l in libasan libatomic libgccjit libgcc_s libgomp libquadmath libssp libubsan libstdc++ \
|
||||
libsupc++; do
|
||||
for f in $libDir/$l*; do
|
||||
symlinkRelative -sfn $f $developLibDir/
|
||||
@@ -570,6 +604,9 @@ INSTALL()
|
||||
$relativeIncludeDir/libgccjit++.h
|
||||
|
||||
packageEntries "syslibs" \
|
||||
$relativeLibDir/libasan.so \
|
||||
$relativeLibDir/libasan.so.$libasanSoVersion \
|
||||
$relativeLibDir/libasan.so.$libasanLibVersion \
|
||||
$relativeLibDir/libatomic.so \
|
||||
$relativeLibDir/libatomic.so.$libatomicSoVersion \
|
||||
$relativeLibDir/libatomic.so.$libatomicLibVersion \
|
||||
@@ -590,7 +627,10 @@ INSTALL()
|
||||
$relativeLibDir/libstdc++.so \
|
||||
$relativeLibDir/libstdc++.so.$libstdcxxSoVersion \
|
||||
$relativeLibDir/libstdc++.so.$libstdcxxLibVersion \
|
||||
$relativeLibDir/libsupc++.so
|
||||
$relativeLibDir/libsupc++.so \
|
||||
$relativeLibDir/libubsan.so \
|
||||
$relativeLibDir/libubsan.so.$libubsanSoVersion \
|
||||
$relativeLibDir/libubsan.so.$libubsanLibVersion
|
||||
|
||||
packageEntries "syslibs_devel" \
|
||||
$developLibDir/*.so* \
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user