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:
PulkoMandy
2025-02-04 16:16:01 +01:00
parent 36e997e982
commit 3408c53a62
2 changed files with 1409 additions and 19 deletions

View File

@@ -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