From 21d7b9d0b5754b49d353156d4b78ac761fcacb9b Mon Sep 17 00:00:00 2001 From: Jason Mobarak Date: Fri, 22 Dec 2017 15:58:52 -0800 Subject: [PATCH] Translate cpp_wrapper.py to C to try to improve build speed --- Dockerfile | 5 +-- Makefile | 3 ++ build.bash | 5 ++- cpp_wrapper.c | 106 +++++++++++++++++++++++++++++++++++++++++++++++++ cpp_wrapper.py | 33 --------------- docker_nametag | 2 +- 6 files changed, 115 insertions(+), 39 deletions(-) create mode 100644 cpp_wrapper.c delete mode 100755 cpp_wrapper.py diff --git a/Dockerfile b/Dockerfile index 055771f..f80da3b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -41,7 +41,7 @@ RUN apt-get update \ python \ && mkdir -p cmake-build && cd cmake-build \ && wget https://cmake.org/files/v3.10/cmake-3.10.1.tar.gz \ - && tar -xvzf cmake-3.10.1.tar.gz \ + && tar -xzf cmake-3.10.1.tar.gz \ && cd cmake-3.10.1 \ && ./configure \ && make -j4 \ @@ -51,7 +51,4 @@ RUN apt-get update \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* -COPY cpp_wrapper.py /bin -RUN chmod +x /bin/cpp_wrapper.py - # EOF diff --git a/Makefile b/Makefile index 798a259..3720f46 100644 --- a/Makefile +++ b/Makefile @@ -6,6 +6,9 @@ SCRIPTS := .travis.sh \ run_build_shell.bash \ stage_sysroot.bash \ +cpp_wrapper: cpp_wrapper.c + gcc -O3 -std=c99 -Wall cpp_wrapper.c -o cpp_wrapper + check: docker run -v $(CURDIR):/mnt koalaman/shellcheck -x $(SCRIPTS) diff --git a/build.bash b/build.bash index 77eaa04..42546fc 100755 --- a/build.bash +++ b/build.bash @@ -49,7 +49,7 @@ CMAKE_COMMAND="\ -DLLVM_TARGETS_TO_BUILD=$ARCH \ -DCMAKE_CXX_FLAGS='-DENDIAN_LITTLE=1' \ -DCMAKE_C_COMPILER=/usr/bin/gcc \ - -DCMAKE_CXX_COMPILER=/bin/cpp_wrapper.py \ + -DCMAKE_CXX_COMPILER=/bin/cpp_wrapper \ -DCMAKE_BUILD_TYPE=Release \ -DLLVM_BINUTILS_INCDIR=/usr/include \ -DLLVM_INCLUDE_TESTS=OFF" @@ -66,6 +66,7 @@ fi docker run ${INTERACTIVE[@]:-} --rm \ -v "$PWD/output/opt:/opt" \ -v "$PWD/patches:/patches" \ + -v "$PWD:/this_dir" \ -v obfuscator-llvm:/work/obfuscator-llvm \ -v obfuscator-llvm-build:/work/build \ "$DOCKER_NAMETAG" \ @@ -76,6 +77,8 @@ docker run ${INTERACTIVE[@]:-} --rm \ else \ (cd /work/obfuscator-llvm && git pull); \ fi \ + && cp -v /this_dir/cpp_wrapper.c /work/cpp_wrapper.c \ + && gcc -std=c99 -O3 -Wall /work/cpp_wrapper.c -o /bin/cpp_wrapper \ && cd /work/obfuscator-llvm \ && $PATCH_COMMAND \ && cd /work/build \ diff --git a/cpp_wrapper.c b/cpp_wrapper.c new file mode 100644 index 0000000..679ada4 --- /dev/null +++ b/cpp_wrapper.c @@ -0,0 +1,106 @@ +/* Copyright (C) 2017 Swift Navigation Inc. + * Contact: Swift Navigation + * + * This source is subject to the license found in the file 'LICENSE' which must + * be be distributed together with this source. All other rights reserved. + * + * THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, + * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include +#include +#include +#include +#include + +//#define DEBUG + +const char* real_cpp_path = "/usr/bin/g++"; +const char* new_argv_entry = "lib/libLLVMTransformUtils.a"; + +int main(int argc, const char* argv[]) { + + size_t args_str_size = 0; + size_t* lengths = (size_t*) malloc(argc*sizeof(size_t)); + + for (int x = 0; x < argc; x++) { + lengths[x] = strlen(argv[x]); + args_str_size += lengths[x]; + } + +#ifdef DEBUG + printf("%zu\n", args_str_size); +#endif + + // Make space for spaces in between argument values + null terminator + args_str_size += (argc - 1) + 1; + + char* all_args_buf = (char*) malloc(args_str_size); + char* p = all_args_buf; + + for (int x = 0; x < argc; x++) { + memcpy(p, argv[x], lengths[x]); + p += lengths[x]; + *p++ = ' '; + } + + // Null terminate the string + *p = '\0'; + +#ifdef DEBUG + printf("All args: %s\n", all_args_buf); +#endif + + bool append_new_arg = false; + + if ( (strstr(all_args_buf, "-o lib/libLTO.so.4.0.1") != NULL && + strstr(all_args_buf, "lib/libLLVMObfuscation.a") != NULL ) + || + (strstr(all_args_buf, "-o bin/llvm-lto") != NULL && + strstr(all_args_buf, "lib/libLLVMObfuscation.a") != NULL ) ) + { + fprintf(stderr, "********************** HACK IMMINENT **************************\n"); + fprintf(stderr, "********************** HACK IMMINENT **************************\n"); + fprintf(stderr, "********************** HACK IMMINENT **************************\n"); + + append_new_arg = true; + } + + argv[0] = real_cpp_path; + + if (append_new_arg) { + + int new_argc = argc + 1; + const char** new_argv = malloc( (new_argc+1) * sizeof(char*) ); + + for (int x = 0; x < argc; x++) { + + size_t length = (lengths[x] + 1); + + new_argv[x] = (char*) malloc(length * sizeof(char)); + memcpy((void*) new_argv[x], argv[x], length * sizeof(char)); + } + + size_t new_argv_len = strlen(new_argv_entry) + 1; + new_argv[new_argc - 1] = malloc(new_argv_len * sizeof(char)); + + memcpy((void*) new_argv[new_argc - 1], new_argv_entry, new_argv_len); + + new_argv[new_argc] = NULL; + + argc = new_argc; + argv = new_argv; + } + +#if 0 // This causes a heap corruption error trigger? + free(lengths); + free(all_args_buf); +#endif + + int execv_ret = execv(real_cpp_path, (char*const*)argv); + + fprintf(stderr, "execv() failure: %d\n", execv_ret); + return -42; +} diff --git a/cpp_wrapper.py b/cpp_wrapper.py deleted file mode 100755 index 427ad48..0000000 --- a/cpp_wrapper.py +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env python - -# Copyright (C) 2017 Swift Navigation Inc. -# Contact: Swift Navigation -# -# This source is subject to the license found in the file 'LICENSE' which must -# be be distributed together with this source. All other rights reserved. -# -# THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, -# EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. - -import os -import sys - -#cpp_path = "/usr/bin/arm-linux-gnueabihf-g++-4.8" -cpp_path = "/usr/bin/g++" - -new_argv = sys.argv[:] -new_argv[0] = cpp_path - -args = str.join(" ", sys.argv) - -if (("-o lib/libLTO.so.4.0.1" in args and "lib/libLLVMObfuscation.a" in args) or - ("-o bin/llvm-lto" in args and "lib/libLLVMObfuscation.a" in args)): - - sys.stderr.write("********************** HACK IMMINENT **************************\n") - sys.stderr.write("********************** HACK IMMINENT **************************\n") - sys.stderr.write("********************** HACK IMMINENT **************************\n") - - new_argv.append("lib/libLLVMTransformUtils.a") - -os.execv(cpp_path, new_argv) diff --git a/docker_nametag b/docker_nametag index 5ce5b09..773e8e8 100644 --- a/docker_nametag +++ b/docker_nametag @@ -1 +1 @@ -swiftnav/arm-llvm-obf:4.0-ubuntu1404 +swiftnav/arm-llvm-obf:4.0-ubuntu1404-2017.12.22