From 961f7019293e8ee0ba14809717d4154e1e892a9f Mon Sep 17 00:00:00 2001 From: ChenGH Date: Sun, 23 Oct 2022 07:21:15 +0800 Subject: [PATCH] Sanitizer: Support address sanitizer for x86_64 platform (#3212) * Sanitizer: Support address sanitizer for x86_64 platform * Sanitizer: Not mac os need -static-libasan * Sanitizer: Add script for docker test. * Sanitizer: Refine build script. * Santizer: Fix ossrs/srs:dev-gcc7-cache cannot find libasan bug * Sanitizer: Support sanitizer when use ossrs/srs:dev-cache and ubuntuxx-cache * Sanitizer: Add sanitizer-static config Co-authored-by: winlin --- trunk/Dockerfile | 4 ++-- trunk/Dockerfile.builds | 4 ++-- trunk/Dockerfile.cov | 2 +- trunk/Dockerfile.test | 4 +--- trunk/auto/depends.sh | 3 ++- trunk/auto/options.sh | 8 +++++++ trunk/configure | 19 +++++++++++++++++ trunk/scripts/docker_test.sh | 41 ++++++++++++++++++++++++++++++++++++ 8 files changed, 76 insertions(+), 9 deletions(-) create mode 100755 trunk/scripts/docker_test.sh diff --git a/trunk/Dockerfile b/trunk/Dockerfile index 3c86c2681..84f7aa267 100644 --- a/trunk/Dockerfile +++ b/trunk/Dockerfile @@ -16,7 +16,7 @@ ENV DEBIAN_FRONTEND noninteractive SHELL ["/bin/bash", "-c"] # Install depends tools. -RUN apt-get update && apt-get install -y gcc make g++ patch unzip perl git +RUN apt-get update && apt-get install -y gcc make g++ patch unzip perl git libasan5 # Copy source code to docker. COPY . /srs @@ -24,7 +24,7 @@ WORKDIR /srs/trunk # Build and install SRS. # Note that SRT is enabled by default, so we configure without --srt=on. -RUN ./configure --jobs=${JOBS} --gb28181=on && make -j${JOBS} && make install +RUN ./configure --jobs=${JOBS} --gb28181=on --sanitizer-static=on && make -j${JOBS} && make install # All config files for SRS. RUN cp -R conf /usr/local/srs/conf && \ diff --git a/trunk/Dockerfile.builds b/trunk/Dockerfile.builds index baac52736..71d4c803b 100644 --- a/trunk/Dockerfile.builds +++ b/trunk/Dockerfile.builds @@ -22,11 +22,11 @@ RUN cd /srs/trunk && ./configure --jobs=2 --srt=off --gb28181=off --cxx11=off -- ######################################################## FROM ossrs/srs:dev6-cache AS centos6-baseline COPY . /srs -RUN cd /srs/trunk && ./configure --jobs=2 --srt=off --gb28181=off --cxx11=off --cxx14=off && make -j2 +RUN cd /srs/trunk && ./configure --jobs=2 --srt=off --gb28181=off --cxx11=off --cxx14=off --sanitizer=off && make -j2 FROM ossrs/srs:dev6-cache AS centos6-all COPY . /srs -RUN cd /srs/trunk && ./configure --jobs=2 --srt=on --gb28181=on --cxx11=off --cxx14=off && make -j2 +RUN cd /srs/trunk && ./configure --jobs=2 --srt=on --gb28181=on --cxx11=off --cxx14=off --sanitizer=off && make -j2 ######################################################## FROM ossrs/srs:ubuntu16-cache AS ubuntu16-baseline diff --git a/trunk/Dockerfile.cov b/trunk/Dockerfile.cov index 9793c3f89..c26a946db 100644 --- a/trunk/Dockerfile.cov +++ b/trunk/Dockerfile.cov @@ -8,5 +8,5 @@ COPY . /srs WORKDIR /srs/trunk # Note that we must enable the gcc7 or link failed. -RUN scl enable devtoolset-7 -- ./configure --srt=on --gb28181=on --utest=on --gcov=on --jobs=2 +RUN scl enable devtoolset-7 -- ./configure --srt=on --gb28181=on --utest=on --gcov=on --sanitizer=off --jobs=2 RUN scl enable devtoolset-7 -- make -j2 utest diff --git a/trunk/Dockerfile.test b/trunk/Dockerfile.test index ce833028e..1cecb3dbb 100644 --- a/trunk/Dockerfile.test +++ b/trunk/Dockerfile.test @@ -1,6 +1,4 @@ FROM ossrs/srs:dev-gcc7-cache - -# Install depends tools. RUN yum install -y gcc make gcc-c++ patch unzip perl git # Build and install SRS. @@ -8,7 +6,7 @@ COPY . /srs WORKDIR /srs/trunk # Note that we must enable the gcc7 or link failed. -RUN scl enable devtoolset-7 -- ./configure --srt=on --gb28181=on --utest=on --jobs=2 +RUN scl enable devtoolset-7 -- ./configure --srt=on --gb28181=on --utest=on --sanitizer=off --jobs=2 RUN scl enable devtoolset-7 -- make -j2 utest # Build benchmark tool. diff --git a/trunk/auto/depends.sh b/trunk/auto/depends.sh index fd18e7d3a..b1d0857ea 100755 --- a/trunk/auto/depends.sh +++ b/trunk/auto/depends.sh @@ -317,7 +317,8 @@ OSX_prepare; ret=$?; if [[ 0 -ne $ret ]]; then echo "OSX prepare failed, ret=$re OS_IS_LOONGARCH64=$(g++ -dM -E - > ${SRS_OBJS}/${SRS_MAKEFILE} GCC = ${SRS_TOOL_CC} @@ -198,6 +208,15 @@ if [[ $SRS_BACKTRACE == YES ]]; then SrsLinkOptions="${SrsLinkOptions} -rdynamic"; fi +# For address sanitizer +# @doc: https://github.com/google/sanitizers/wiki/AddressSanitizer +if [[ $SRS_SANITIZER == YES && $OS_IS_X86_64 == YES ]]; then + SrsLinkOptions="${SrsLinkOptions} -fsanitize=address -fno-omit-frame-pointer"; + if [[ $SRS_SANITIZER_STATIC == YES ]]; then + SrsLinkOptions="${SrsLinkOptions} -static-libasan"; + fi +fi + ##################################################################################### # Modules, compile each module, then link to binary # diff --git a/trunk/scripts/docker_test.sh b/trunk/scripts/docker_test.sh new file mode 100755 index 000000000..065d39bb9 --- /dev/null +++ b/trunk/scripts/docker_test.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +# cd ~/git/srs +work_dir=$(cd -P $(dirname $0) && cd ../.. && pwd) && cd $work_dir && echo "Run script in ${work_dir}" +if [[ ! -d trunk ]]; then echo "no ./trunk found"; exit 1; fi + +echo "For trunk/Dockerfile.test" +docker build --tag srs:test -f trunk/Dockerfile.test . && +docker build --tag srs:cov -f trunk/Dockerfile.cov . +if [[ $? -ne 0 ]]; then echo "Docker for test failed"; exit 1; fi + +echo "For trunk/Dockerfile" +docker buildx build --platform linux/arm/v7 --output "type=image,push=false" --build-arg IMAGE=ossrs/srs:ubuntu20-cache -f trunk/Dockerfile . && +docker buildx build --platform linux/arm64/v8 --output "type=image,push=false" --build-arg IMAGE=ossrs/srs:ubuntu20-cache -f trunk/Dockerfile . && +docker buildx build --platform linux/amd64 --output "type=image,push=false" --build-arg IMAGE=ossrs/srs:ubuntu20-cache -f trunk/Dockerfile . +if [[ $? -ne 0 ]]; then echo "Docker for release failed"; exit 1; fi + +echo "For trunk/Dockerfile.pkg" +docker build --tag srs:pkg --build-arg version=1.2.3 -f trunk/Dockerfile.pkg . +if [[ $? -ne 0 ]]; then echo "Docker for pkg failed"; exit 1; fi + +echo "For trunk/Dockerfile.builds" +DOCKER_BUILDKIT=1 docker build -f trunk/Dockerfile.builds --target centos7-baseline . && +DOCKER_BUILDKIT=1 docker build -f trunk/Dockerfile.builds --target centos7-all . && +DOCKER_BUILDKIT=1 docker build -f trunk/Dockerfile.builds --target centos7-no-webrtc . && +DOCKER_BUILDKIT=1 docker build -f trunk/Dockerfile.builds --target centos7-no-asm . && +DOCKER_BUILDKIT=1 docker build -f trunk/Dockerfile.builds --target centos7-ansi-no-ffmpeg . && +DOCKER_BUILDKIT=1 docker build -f trunk/Dockerfile.builds --target centos6-baseline . && +DOCKER_BUILDKIT=1 docker build -f trunk/Dockerfile.builds --target centos6-all . && +DOCKER_BUILDKIT=1 docker build -f trunk/Dockerfile.builds --target ubuntu16-baseline . && +DOCKER_BUILDKIT=1 docker build -f trunk/Dockerfile.builds --target ubuntu16-all . && +DOCKER_BUILDKIT=1 docker build -f trunk/Dockerfile.builds --target ubuntu18-baseline . && +DOCKER_BUILDKIT=1 docker build -f trunk/Dockerfile.builds --target ubuntu18-all . && +DOCKER_BUILDKIT=1 docker build -f trunk/Dockerfile.builds --target ubuntu20-baseline . && +DOCKER_BUILDKIT=1 docker build -f trunk/Dockerfile.builds --target ubuntu20-all . && +DOCKER_BUILDKIT=1 docker build -f trunk/Dockerfile.builds --target ubuntu16-cross-armv7 . && +DOCKER_BUILDKIT=1 docker build -f trunk/Dockerfile.builds --target ubuntu20-cross-armv7 . && +DOCKER_BUILDKIT=1 docker build -f trunk/Dockerfile.builds --target ubuntu16-cross-aarch64 . && +DOCKER_BUILDKIT=1 docker build -f trunk/Dockerfile.builds --target ubuntu20-cross-aarch64 . +if [[ $? -ne 0 ]]; then echo "Docker for build failed"; exit 1; fi +