diff --git a/.travis.yml b/.travis.yml index 966e0ac..733fbcf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,9 @@ language: c matrix: include: - - name: Linux x86_64 and i686 with and without valgrind + - name: Linux x86_64 and i686 (valgrind and uclibc also) os: linux + sudo: required addons: apt: sources: @@ -18,10 +19,14 @@ matrix: - make relro_pie_tests CC=gcc-8 - make relro_pie_m32_tests CC=gcc-8 - make relro_pie_tests_on_valgrind CC=gcc-8 + - ./uclibc-test.sh x86_64 + - ./uclibc-test.sh i686 - export OPT_CFLAGS=-O3 - make relro_pie_tests CC=gcc-8 - make relro_pie_m32_tests CC=gcc-8 - make relro_pie_tests_on_valgrind CC=gcc-8 + - ./uclibc-test.sh x86_64 + - ./uclibc-test.sh i686 - name: arm, armhf, arm64, ppc and ppc64le on QEMU 2.8 os: linux dist: xenial diff --git a/test/Makefile b/test/Makefile index 22d0468..98c0f6a 100644 --- a/test/Makefile +++ b/test/Makefile @@ -12,14 +12,14 @@ SOEXT = so LIBS = -ldl -lm PLTHOOK_C = plthook_elf.c TESTS = run_tests -QEMU_CMD = +KICK_CMD = ifeq ($(UNAME_S),Linux) # Linux TESTS = relro_pie_tests ifneq ($(TARGET_PLATFORM),) CC = $(TARGET_PLATFORM)-gcc - QEMU_CMD = qemu-$(or $(QEMU_ARCH),$(shell echo $(TARGET_PLATFORM) | sed -e 's/-.*//')) -L /usr/$(TARGET_PLATFORM) + KICK_CMD = qemu-$(or $(QEMU_ARCH),$(shell echo $(TARGET_PLATFORM) | sed -e 's/-.*//')) -L /usr/$(TARGET_PLATFORM) endif endif @@ -64,9 +64,9 @@ testprog$(EXEEXT): testprog.c ../$(PLTHOOK_C) libtest.h $(CC) $(CFLAGS_EXE) $(CFLAGS) -o testprog$(EXEEXT) -I.. testprog.c ../$(PLTHOOK_C) -L. -ltest $(LIBS) run_tests: clean libtest.$(SOEXT) testprog$(EXEEXT) - LD_LIBRARY_PATH=. $(QEMU_CMD) ./testprog$(EXEEXT) open - LD_LIBRARY_PATH=. $(QEMU_CMD) ./testprog$(EXEEXT) open_by_handle - test "$(SKIP_OPEN_BY_ADDRESS_TEST)" || env LD_LIBRARY_PATH=. $(QEMU_CMD) ./testprog$(EXEEXT) open_by_address + LD_LIBRARY_PATH=. $(KICK_CMD) ./testprog$(EXEEXT) open + LD_LIBRARY_PATH=. $(KICK_CMD) ./testprog$(EXEEXT) open_by_handle + test "$(SKIP_OPEN_BY_ADDRESS_TEST)" || env LD_LIBRARY_PATH=. $(KICK_CMD) ./testprog$(EXEEXT) open_by_address check: $(TESTS) @@ -103,13 +103,13 @@ relro_pie_m32_tests: relro_pie_tests_on_valgrind: @echo ------------ check on valgrind ------------ - $(MAKE) run_tests "EXTRA_CFLAGS=" QEMU_CMD=valgrind + $(MAKE) run_tests "EXTRA_CFLAGS=" KICK_CMD=valgrind @echo ------------ check Full RELRO on valgrind ------------ - $(MAKE) run_tests "EXTRA_CFLAGS=-Wl,-z,relro,-z,now" QEMU_CMD=valgrind + $(MAKE) run_tests "EXTRA_CFLAGS=-Wl,-z,relro,-z,now" KICK_CMD=valgrind @echo ------------ check 32-bit on valgrind ------------ - $(MAKE) run_tests "EXTRA_CFLAGS=-m32" QEMU_CMD=valgrind + $(MAKE) run_tests "EXTRA_CFLAGS=-m32" KICK_CMD=valgrind @echo ------------ check 32-bit Full RELRO on valgrind ------------ - $(MAKE) run_tests "EXTRA_CFLAGS=-m32 -Wl,-z,relro,-z,now" QEMU_CMD=valgrind + $(MAKE) run_tests "EXTRA_CFLAGS=-m32 -Wl,-z,relro,-z,now" KICK_CMD=valgrind clean: $(RM) libtest.$(SOEXT) testprog$(EXEEXT) diff --git a/test/uclibc-test.sh b/test/uclibc-test.sh new file mode 100755 index 0000000..11c2f4b --- /dev/null +++ b/test/uclibc-test.sh @@ -0,0 +1,60 @@ +#!/bin/bash + +case "$1" in + x86_64) + ARCH=x86-64-core-i7 + LIBC=uclibc + TOOLCHAIN_VER=stable-2018.11-1 + TARGET_PLATFORM=x86_64-buildroot-linux-uclibc + ;; + i686) + ARCH=x86-core2 + LIBC=uclibc + TOOLCHAIN_VER=stable-2018.11-1 + TARGET_PLATFORM=i686-buildroot-linux-uclibc + ;; +esac + +set -e + +THIS_COMMAND=$0 + +run_make() { + BASE_NAME=$ARCH--$LIBC--$TOOLCHAIN_VER + export SYSROOT=$BASE_NAME/$TARGET_PLATFORM/sysroot + if test -f $BASE_NAME.tar.bz2; then + echo Found $BASE_NAME.tar.bz2 + else + echo Download $BASE_NAME.tar.bz2 + wget https://toolchains.bootlin.com/downloads/releases/toolchains/$ARCH/tarballs/$BASE_NAME.tar.bz2 + fi + if test -d $BASE_NAME; then + echo Found $BASE_NAME + else + echo Extract $BASE_NAME.tar.bz2 + tar xfj $BASE_NAME.tar.bz2 + fi + if test -h $SYSROOT/proc/self; then + echo Found $SYSROOT/proc/self + else + echo Mount $SYSROOT/proc + sudo mount -t proc none $SYSROOT/proc + fi + export RUN_AS_KICK_CMD=1 + export PATH="$BASE_NAME/bin:$PATH" + make relro_pie_tests TARGET_PLATFORM=$TARGET_PLATFORM KICK_CMD=$THIS_COMMAND +} + +kick_cmd() { + cp testprog $SYSROOT/usr/bin + cp libtest.so $SYSROOT/usr/lib + cd $SYSROOT + shift + sudo chroot . ./usr/bin/testprog "$@" +} + +if test "$RUN_AS_KICK_CMD"; then + kick_cmd "$@" +else + run_make "$@" +fi