Skip to content

Commit 81618d9

Browse files
author
Jason Mobarak
authored
Translate cpp_wrapper.py to C to try to improve build speed (#5)
1 parent 3255bf7 commit 81618d9

File tree

6 files changed

+115
-39
lines changed

6 files changed

+115
-39
lines changed

Dockerfile

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ RUN apt-get update \
4141
python \
4242
&& mkdir -p cmake-build && cd cmake-build \
4343
&& wget https://cmake.org/files/v3.10/cmake-3.10.1.tar.gz \
44-
&& tar -xvzf cmake-3.10.1.tar.gz \
44+
&& tar -xzf cmake-3.10.1.tar.gz \
4545
&& cd cmake-3.10.1 \
4646
&& ./configure \
4747
&& make -j4 \
@@ -51,7 +51,4 @@ RUN apt-get update \
5151
&& apt-get clean \
5252
&& rm -rf /var/lib/apt/lists/*
5353

54-
COPY cpp_wrapper.py /bin
55-
RUN chmod +x /bin/cpp_wrapper.py
56-
5754
# EOF

Makefile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ SCRIPTS := .travis.sh \
66
run_build_shell.bash \
77
stage_sysroot.bash \
88

9+
cpp_wrapper: cpp_wrapper.c
10+
gcc -O3 -std=c99 -Wall cpp_wrapper.c -o cpp_wrapper
11+
912
check:
1013
docker run -v $(CURDIR):/mnt koalaman/shellcheck -x $(SCRIPTS)
1114

build.bash

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ CMAKE_COMMAND="\
4949
-DLLVM_TARGETS_TO_BUILD=$ARCH \
5050
-DCMAKE_CXX_FLAGS='-DENDIAN_LITTLE=1' \
5151
-DCMAKE_C_COMPILER=/usr/bin/gcc \
52-
-DCMAKE_CXX_COMPILER=/bin/cpp_wrapper.py \
52+
-DCMAKE_CXX_COMPILER=/bin/cpp_wrapper \
5353
-DCMAKE_BUILD_TYPE=Release \
5454
-DLLVM_BINUTILS_INCDIR=/usr/include \
5555
-DLLVM_INCLUDE_TESTS=OFF"
@@ -66,6 +66,7 @@ fi
6666
docker run ${INTERACTIVE[@]:-} --rm \
6767
-v "$PWD/output/opt:/opt" \
6868
-v "$PWD/patches:/patches" \
69+
-v "$PWD:/this_dir" \
6970
-v obfuscator-llvm:/work/obfuscator-llvm \
7071
-v obfuscator-llvm-build:/work/build \
7172
"$DOCKER_NAMETAG" \
@@ -76,6 +77,8 @@ docker run ${INTERACTIVE[@]:-} --rm \
7677
else \
7778
(cd /work/obfuscator-llvm && git pull); \
7879
fi \
80+
&& cp -v /this_dir/cpp_wrapper.c /work/cpp_wrapper.c \
81+
&& gcc -std=c99 -O3 -Wall /work/cpp_wrapper.c -o /bin/cpp_wrapper \
7982
&& cd /work/obfuscator-llvm \
8083
&& $PATCH_COMMAND \
8184
&& cd /work/build \

cpp_wrapper.c

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
/* Copyright (C) 2017 Swift Navigation Inc.
2+
* Contact: Swift Navigation <[email protected]>
3+
*
4+
* This source is subject to the license found in the file 'LICENSE' which must
5+
* be be distributed together with this source. All other rights reserved.
6+
*
7+
* THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
8+
* EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
9+
* WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
10+
*/
11+
12+
#include <string.h>
13+
#include <stdio.h>
14+
#include <stdlib.h>
15+
#include <stdbool.h>
16+
#include <unistd.h>
17+
18+
//#define DEBUG
19+
20+
const char* real_cpp_path = "/usr/bin/g++";
21+
const char* new_argv_entry = "lib/libLLVMTransformUtils.a";
22+
23+
int main(int argc, const char* argv[]) {
24+
25+
size_t args_str_size = 0;
26+
size_t* lengths = (size_t*) malloc(argc*sizeof(size_t));
27+
28+
for (int x = 0; x < argc; x++) {
29+
lengths[x] = strlen(argv[x]);
30+
args_str_size += lengths[x];
31+
}
32+
33+
#ifdef DEBUG
34+
printf("%zu\n", args_str_size);
35+
#endif
36+
37+
// Make space for spaces in between argument values + null terminator
38+
args_str_size += (argc - 1) + 1;
39+
40+
char* all_args_buf = (char*) malloc(args_str_size);
41+
char* p = all_args_buf;
42+
43+
for (int x = 0; x < argc; x++) {
44+
memcpy(p, argv[x], lengths[x]);
45+
p += lengths[x];
46+
*p++ = ' ';
47+
}
48+
49+
// Null terminate the string
50+
*p = '\0';
51+
52+
#ifdef DEBUG
53+
printf("All args: %s\n", all_args_buf);
54+
#endif
55+
56+
bool append_new_arg = false;
57+
58+
if ( (strstr(all_args_buf, "-o lib/libLTO.so.4.0.1") != NULL &&
59+
strstr(all_args_buf, "lib/libLLVMObfuscation.a") != NULL )
60+
||
61+
(strstr(all_args_buf, "-o bin/llvm-lto") != NULL &&
62+
strstr(all_args_buf, "lib/libLLVMObfuscation.a") != NULL ) )
63+
{
64+
fprintf(stderr, "********************** HACK IMMINENT **************************\n");
65+
fprintf(stderr, "********************** HACK IMMINENT **************************\n");
66+
fprintf(stderr, "********************** HACK IMMINENT **************************\n");
67+
68+
append_new_arg = true;
69+
}
70+
71+
argv[0] = real_cpp_path;
72+
73+
if (append_new_arg) {
74+
75+
int new_argc = argc + 1;
76+
const char** new_argv = malloc( (new_argc+1) * sizeof(char*) );
77+
78+
for (int x = 0; x < argc; x++) {
79+
80+
size_t length = (lengths[x] + 1);
81+
82+
new_argv[x] = (char*) malloc(length * sizeof(char));
83+
memcpy((void*) new_argv[x], argv[x], length * sizeof(char));
84+
}
85+
86+
size_t new_argv_len = strlen(new_argv_entry) + 1;
87+
new_argv[new_argc - 1] = malloc(new_argv_len * sizeof(char));
88+
89+
memcpy((void*) new_argv[new_argc - 1], new_argv_entry, new_argv_len);
90+
91+
new_argv[new_argc] = NULL;
92+
93+
argc = new_argc;
94+
argv = new_argv;
95+
}
96+
97+
#if 0 // This causes a heap corruption error trigger?
98+
free(lengths);
99+
free(all_args_buf);
100+
#endif
101+
102+
int execv_ret = execv(real_cpp_path, (char*const*)argv);
103+
104+
fprintf(stderr, "execv() failure: %d\n", execv_ret);
105+
return -42;
106+
}

cpp_wrapper.py

Lines changed: 0 additions & 33 deletions
This file was deleted.

docker_nametag

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
swiftnav/arm-llvm-obf:4.0-ubuntu1404
1+
swiftnav/arm-llvm-obf:4.0-ubuntu1404-2017.12.22

0 commit comments

Comments
 (0)