233 lines
5.9 KiB
Bash
Executable file
233 lines
5.9 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
set -e
|
|
cd "$(dirname "$0")"
|
|
|
|
print_test() {
|
|
echo "Testing: $1 (CC=$CC LD=$LD CFLAGS=$CFLAGS)"
|
|
}
|
|
|
|
exe_def_static_user() {
|
|
print_test "TLS var defined in executable, used in same object"
|
|
|
|
rm -f main
|
|
|
|
$CC $CFLAGS -ggdb3 -o tls.o -c $TLSC
|
|
$CC $CFLAGS -ggdb3 -o user.o -c user.c
|
|
$CC $CFLAGS -ggdb3 -o def.o -c def.c
|
|
$CC $CFLAGS $LDFLAGS -ggdb3 -o main main.c def.o user.o tls.o
|
|
|
|
./main
|
|
}
|
|
|
|
exe_def_shared_user() {
|
|
print_test "TLS var defined in executable, used in shared library"
|
|
|
|
rm -f main
|
|
|
|
$CC $CFLAGS -ggdb3 -fPIC -o tls.o -c $TLSC
|
|
$CC $CFLAGS -ggdb3 -fPIC -o user.o -c user.c
|
|
$CC $CFLAGS $LDFLAGS -shared -o libuser.so user.o tls.o
|
|
|
|
$CC $CFLAGS -ggdb3 -fPIC -o def.o -c def.c
|
|
$CC $CFLAGS $LDFLAGS -ggdb3 -fPIC -o main main.c def.o -Wl,-rpath,$(pwd) -L. -luser
|
|
|
|
./main
|
|
}
|
|
|
|
shared_def_static_user() {
|
|
print_test "TLS var defined in shared library, used in same object"
|
|
|
|
rm -f main
|
|
|
|
$CC $CFLAGS -ggdb3 -fPIC -o tls.o -c $TLSC
|
|
$CC $CFLAGS -ggdb3 -fPIC -o user.o -c user.c
|
|
$CC $CFLAGS -ggdb3 -fPIC -o def.o -c def.c
|
|
$CC $CFLAGS $LDFLAGS -shared -o libdef.so def.o user.o tls.o
|
|
|
|
$CC $CFLAGS $LDFLAGS -ggdb3 -fPIC -o main main.c -Wl,-rpath,$(pwd) -L. -ldef
|
|
|
|
./main
|
|
}
|
|
|
|
shared_def_shared_user() {
|
|
print_test "TLS var defined in shared object, used in other shared object"
|
|
|
|
rm -f main
|
|
|
|
$CC $CFLAGS -ggdb3 -fPIC -o tls.o -c $TLSC
|
|
$CC $CFLAGS -ggdb3 -fPIC -o user.o -c user.c
|
|
$CC $CFLAGS $LDFLAGS -shared -o libuser.so user.o tls.o
|
|
|
|
$CC $CFLAGS -ggdb3 -fPIC -o def.o -c def.c
|
|
$CC $CFLAGS $LDFLAGS -shared -o libdef.so def.o -Wl,-rpath,$(pwd) -L. -luser
|
|
|
|
$CC $CFLAGS $LDFLAGS -ggdb3 -fPIC -o main main.c -Wl,-rpath,$(pwd) -L. -ldef
|
|
|
|
./main
|
|
}
|
|
|
|
shared_def_static_user_no_surplus() {
|
|
print_test "TLS var defined in shared library, used in same object. Likely no static TLS surplus."
|
|
|
|
rm -f main
|
|
|
|
$CC $CFLAGS -ggdb3 -fPIC -o tls.o -c $TLSC
|
|
$CC $CFLAGS -ggdb3 -fPIC -o user.o -c user.c
|
|
$CC $CFLAGS -DNO_SURPLUS -ggdb3 -fPIC -o def.o -c def.c
|
|
$CC $CFLAGS $LDFLAGS -shared -o libdef.so def.o tls.o user.o
|
|
|
|
$CC $CFLAGS -DNO_SURPLUS $LDFLAGS -ggdb3 -fPIC -o main main.c -Wl,-rpath,$(pwd) -L. -ldef
|
|
|
|
./main
|
|
}
|
|
|
|
shared_def_shared_user_no_surplus() {
|
|
print_test "TLS var defined in shared object, used in other shared object. Likely no static TLS surplus."
|
|
|
|
rm -f main
|
|
|
|
$CC $CFLAGS -ggdb3 -fPIC -o tls.o -c $TLSC
|
|
$CC $CFLAGS -ggdb3 -fPIC -o user.o -c user.c
|
|
$CC $CFLAGS $LDFLAGS -shared -o libuser.so user.o tls.o
|
|
|
|
$CC $CFLAGS -DNO_SURPLUS -ggdb3 -fPIC -o def.o -c def.c
|
|
$CC $CFLAGS $LDFLAGS -shared -o libdef.so def.o -Wl,-rpath,$(pwd) -L. -luser
|
|
|
|
$CC $CFLAGS -DNO_SURPLUS $LDFLAGS -ggdb3 -fPIC -o main main.c -Wl,-rpath,$(pwd) -L. -ldef
|
|
|
|
./main
|
|
}
|
|
|
|
dl_def_static_user() {
|
|
print_test "TLS var defined in dl()'ed object, used in same object"
|
|
|
|
rm -f main
|
|
|
|
$CC $CFLAGS -ggdb3 -fPIC -o tls.o -c $TLSC
|
|
$CC $CFLAGS -ggdb3 -fPIC -o user.o -c user.c
|
|
$CC $CFLAGS -ggdb3 -fPIC -o def.o -c def.c
|
|
$CC $CFLAGS $LDFLAGS -shared -o libdef.so def.o user.o tls.o
|
|
|
|
$CC $CFLAGS $LDFLAGS -DDL_DECL -ggdb3 -fPIC -o main main.c
|
|
|
|
./main
|
|
}
|
|
|
|
dl_def_shared_user() {
|
|
print_test "TLS var defined in dl()'ed object, used in other shared object"
|
|
|
|
rm -f main
|
|
|
|
$CC $CFLAGS -ggdb3 -fPIC -o tls.o -c $TLSC
|
|
$CC $CFLAGS -ggdb3 -fPIC -o user.o -c user.c
|
|
$CC $CFLAGS $LDFLAGS -shared -o libuser.so user.o tls.o
|
|
|
|
$CC $CFLAGS -ggdb3 -fPIC -o def.o -c def.c
|
|
$CC $CFLAGS $LDFLAGS -shared -o libdef.so def.o -Wl,-rpath,$(pwd) -L. -luser
|
|
|
|
$CC $CFLAGS $LDFLAGS -DDL_DECL -ggdb3 -fPIC -o main main.c
|
|
|
|
./main
|
|
}
|
|
|
|
dl_def_static_user_no_surplus() {
|
|
print_test "TLS var defined in dl()'ed object, used in same object. Likely no surplus TLS"
|
|
|
|
rm -f main
|
|
|
|
$CC $CFLAGS -ggdb3 -fPIC -o tls.o -c $TLSC
|
|
$CC $CFLAGS -ggdb3 -fPIC -o user.o -c user.c
|
|
$CC $CFLAGS -DNO_SURPLUS -ggdb3 -fPIC -o def.o -c def.c
|
|
$CC $CFLAGS $LDFLAGS -shared -o libdef.so def.o user.o tls.o
|
|
|
|
$CC $CFLAGS -DNO_SURPLUS $LDFLAGS -DDL_DECL -ggdb3 -fPIC -o main main.c
|
|
|
|
./main
|
|
}
|
|
|
|
dl_def_shared_user_no_surplus() {
|
|
print_test "TLS var defined in dl()'ed object, used in other shared object. Likely no surplus TLS"
|
|
|
|
rm -f main
|
|
|
|
$CC $CFLAGS -ggdb3 -fPIC -o tls.o -c $TLSC
|
|
$CC $CFLAGS -ggdb3 -fPIC -o user.o -c user.c
|
|
$CC $CFLAGS $LDFLAGS -shared -o libuser.so user.o tls.o
|
|
|
|
$CC $CFLAGS -DNO_SURPLUS -ggdb3 -fPIC -o def.o -c def.c
|
|
$CC $CFLAGS $LDFLAGS -shared -o libdef.so def.o -Wl,-rpath,$(pwd) -L. -luser
|
|
|
|
$CC $CFLAGS -DNO_SURPLUS $LDFLAGS -DDL_DECL -ggdb3 -fPIC -o main main.c
|
|
|
|
./main
|
|
}
|
|
|
|
if [ -z "$TLSC" ]; then
|
|
echo "Variable TLSC is not set" >&2
|
|
exit 1
|
|
fi
|
|
|
|
root=$(pwd)/../../../../..
|
|
|
|
# Cheap musl detection
|
|
if test -f /etc/alpine-release; then
|
|
MUSL="$CFLAGS -D__MUSL__"
|
|
else
|
|
MUSL=
|
|
fi
|
|
|
|
if [ "${STATIC_SUPPORT:-yes}" = "yes" ]; then
|
|
STATIC=-static
|
|
fi
|
|
|
|
for CC in clang gcc; do
|
|
if [ $CC = gcc ] && [ -f /etc/freebsd-update.conf ]; then
|
|
RPATH=-Wl,-rpath,/usr/local/lib/gcc13
|
|
else
|
|
RPATH=
|
|
fi
|
|
case $CC in
|
|
gcc)
|
|
LDs=""
|
|
for l in bdf gold; do
|
|
if command -v ld.$l >/dev/null 2>&1; then
|
|
LDs="$LDs $l"
|
|
fi
|
|
done
|
|
if [ -z "$LDs" ]; then
|
|
LDs=ld
|
|
fi
|
|
;;
|
|
clang)
|
|
LDs="ld"
|
|
if command -v ld.lld >/dev/null 2>&1; then
|
|
LDs="$LDs lld"
|
|
fi
|
|
;;
|
|
esac
|
|
for LD in $LDs; do
|
|
for opt in -O0 -O3; do
|
|
CFLAGS="$MACHINE $MUSL $opt -Werror -I$root/ext/opcache -I$root/Zend -I$root"
|
|
LDFLAGS="$MACHINE -fuse-ld=$LD $RPATH"
|
|
|
|
for pic in "-fPIC" "-fno-PIC $STATIC"; do
|
|
CFLAGS="$CFLAGS $pic" exe_def_static_user
|
|
done
|
|
shared_def_static_user
|
|
shared_def_static_user_no_surplus
|
|
dl_def_static_user
|
|
dl_def_static_user_no_surplus
|
|
if [ "$EXTERN_TLS_SUPPORT" = yes ]; then
|
|
exe_def_shared_user
|
|
shared_def_shared_user
|
|
shared_def_shared_user_no_surplus
|
|
dl_def_shared_user
|
|
dl_def_shared_user_no_surplus
|
|
fi
|
|
done
|
|
done
|
|
done
|
|
|
|
echo "All OK" >&2
|