Use SHA1 to verify libbcc is consistent with cache
Modify Android.mk to build a host version of sha1sum.
Modify bcc and MCCacheReader/Writer to check for sha1 on runtime.
Change-Id: I0aa32e2efd85e21f67cd46a20a9e55a430c41f30
diff --git a/Android.mk b/Android.mk
index 07f4498..9aad1ce 100644
--- a/Android.mk
+++ b/Android.mk
@@ -70,6 +70,19 @@
helper/sha1.c
endif
+FULL_PATH_libbcc_SRC_FILES := \
+ $(addprefix $(LOCAL_PATH)/, $(libbcc_SRC_FILES)) \
+ $(sort $(shell find $(LOCAL_PATH) -name "*.h"))
+
+# Build Host SHA1 Command Line
+# ========================================================
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := helper/sha1.c
+LOCAL_MODULE := sha1sum
+LOCAL_MODULE_TAGS := optional
+LOCAL_CFLAGS += -DCMDLINE
+include $(BUILD_HOST_EXECUTABLE)
+
#
# Shared library for target
# ========================================================
@@ -77,10 +90,22 @@
LOCAL_MODULE := libbcc
LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
LOCAL_CFLAGS += $(local_cflags_for_libbcc)
LOCAL_SRC_FILES := \
$(libbcc_SRC_FILES)
+intermediates := $(local-intermediates-dir)
+libbcc_CHECKSUM_FILE := $(intermediates)/lib/bcc_checksum.c
+
+LOCAL_GENERATED_SOURCES += $(libbcc_CHECKSUM_FILE)
+
+$(libbcc_CHECKSUM_FILE):$(HOST_OUT_EXECUTABLES)/sha1sum $(FULL_PATH_libbcc_SRC_FILES)
+ @echo Generate SHA1
+ @echo -n "char const libbcc_build_checksum[41] = \"" > $@
+ @cat $(FULL_PATH_libbcc_SRC_FILES) | $(HOST_OUT_EXECUTABLES)/sha1sum >> $@
+ @echo "\";" >> $@
+
ifeq ($(TARGET_ARCH),arm)
LOCAL_SRC_FILES += \
runtime/lib/arm/adddf3vfp.S \
@@ -223,11 +248,24 @@
LOCAL_MODULE := libbcc
LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := SHARED_LIBRARIES
+LOCAL_IS_HOST_MODULE := true
LOCAL_CFLAGS += $(local_cflags_for_libbcc)
LOCAL_SRC_FILES := \
$(libbcc_SRC_FILES) \
helper/DebugHelper.c
+intermediates := $(local-intermediates-dir)
+libbcc_CHECKSUM_FILE := $(intermediates)/lib/bcc_checksum.c
+
+LOCAL_GENERATED_SOURCES += $(libbcc_CHECKSUM_FILE)
+
+$(libbcc_CHECKSUM_FILE):$(HOST_OUT_EXECUTABLES)/sha1sum $(FULL_PATH_libbcc_SRC_FILES)
+ @echo Generate SHA1
+ @echo -n "char const libbcc_build_checksum[41] = \"" > $@
+ @cat $(FULL_PATH_libbcc_SRC_FILES) | $(HOST_OUT_EXECUTABLES)/sha1sum >> $@
+ @echo "\";" >> $@
+
ifeq ($(libbcc_USE_MCJIT),1)
LOCAL_STATIC_LIBRARIES += librsloader
endif
diff --git a/Config.h b/Config.h
index 17554a3..aaccbbd 100644
--- a/Config.h
+++ b/Config.h
@@ -21,7 +21,7 @@
#define USE_DISASSEMBLER_FILE 0
-#define USE_LIBBCC_SHA1SUM 1
+#define USE_LIBBCC_SHA1SUM 0
#define USE_LOGGER 1
diff --git a/helper/sha1.c b/helper/sha1.c
index cef9f77..4141c55 100644
--- a/helper/sha1.c
+++ b/helper/sha1.c
@@ -80,9 +80,9 @@
#define SHA1HANDSOFF /*Copies data before messing with it.*/
/*#define CMDLINE * include main() and file processing */
-#ifdef CMDLINE
-# undef CMDLINE /* Never include main() for libbcc */
-#endif
+//#ifdef CMDLINE
+//# undef CMDLINE /* Never include main() for libbcc */
+//#endif
#include "sha1.h"
@@ -435,6 +435,12 @@
#endif
unsigned char err;
+ // Read from STDIN
+ sha1file(NULL, digest);
+ for (j = 0; j < HASHSIZE; j++)
+ printf("%02x", digest[j]);
+ return 0;
+
for (i = 1; i < argc; i++)
{
if (argv[i][0] == '-')
diff --git a/include/bcc/bcc.h b/include/bcc/bcc.h
index 0d56e68..7f174d2 100644
--- a/include/bcc/bcc.h
+++ b/include/bcc/bcc.h
@@ -20,6 +20,8 @@
#include <stddef.h>
#include <stdint.h>
+#include "bcc/bcc_checksum.h"
+
/*-------------------------------------------------------------------------*/
/* libbcc script opaque type */
@@ -150,14 +152,6 @@
};
#endif
-
-/*-------------------------------------------------------------------------*/
-
-
-/* libbcc library build time */
-extern char const libbcc_build_time[24];
-
-
/*-------------------------------------------------------------------------*/
#endif
diff --git a/include/bcc/bcc_cache.h b/include/bcc/bcc_cache.h
index 38c197d..04a5d2b 100644
--- a/include/bcc/bcc_cache.h
+++ b/include/bcc/bcc_cache.h
@@ -32,8 +32,8 @@
uint8_t magic[4];
uint8_t version[4];
- /* libbcc build time */
- char libbcc_build_time[24];
+ /* libbcc SHA1 checksum */
+ char libbcc_build_checksum[41];
/* machine-dependent integer type size */
uint8_t endianness;
diff --git a/include/bcc/bcc_checksum.h b/include/bcc/bcc_checksum.h
new file mode 100644
index 0000000..bd62d1e
--- /dev/null
+++ b/include/bcc/bcc_checksum.h
@@ -0,0 +1,8 @@
+#ifndef ANDROID_BCC_BCC_CHECKSUM_H
+#define ANDROID_BCC_BCC_CHECKSUM_H
+
+/* libbcc library build time */
+extern char const libbcc_build_checksum[41];
+
+#endif
+
diff --git a/include/bcc/bcc_mccache.h b/include/bcc/bcc_mccache.h
index e519555..d7e719f 100644
--- a/include/bcc/bcc_mccache.h
+++ b/include/bcc/bcc_mccache.h
@@ -34,8 +34,8 @@
uint8_t magic[4];
uint8_t version[4];
- /* libbcc build time */
- char libbcc_build_time[24];
+ /* libbcc SHA1 checksum */
+ char libbcc_build_checksum[41];
/* machine-dependent integer type size */
uint8_t endianness;
diff --git a/lib/ExecutionEngine/CacheReader.cpp b/lib/ExecutionEngine/CacheReader.cpp
index f748452..408b1f7 100644
--- a/lib/ExecutionEngine/CacheReader.cpp
+++ b/lib/ExecutionEngine/CacheReader.cpp
@@ -149,10 +149,10 @@
return false;
}
- if (memcmp(mpHeader->libbcc_build_time, libbcc_build_time, 24) != 0) {
- mpHeader->libbcc_build_time[24 - 1] = '\0'; // ensure terminated
- LOGW("Build time mismatch: lib %s cached %s\n", libbcc_build_time,
- mpHeader->libbcc_build_time);
+ if (memcmp(mpHeader->libbcc_build_checksum, libbcc_build_checksum, 41) != 0) {
+ mpHeader->libbcc_build_checksum[41 - 1] = '\0'; // ensure terminated
+ LOGW("Build checksum mismatch: lib %s cached %s\n", libbcc_build_checksum,
+ mpHeader->libbcc_build_checksum);
return false;
}
diff --git a/lib/ExecutionEngine/CacheWriter.cpp b/lib/ExecutionEngine/CacheWriter.cpp
index 67def9b..ab8dd03 100644
--- a/lib/ExecutionEngine/CacheWriter.cpp
+++ b/lib/ExecutionEngine/CacheWriter.cpp
@@ -93,7 +93,7 @@
// Magic word and version
memcpy(header->magic, OBCC_MAGIC, 4);
memcpy(header->version, OBCC_VERSION, 4);
- memcpy(header->libbcc_build_time, libbcc_build_time, 24);
+ memcpy(header->libbcc_build_checksum, libbcc_build_checksum, 41);
// Machine Integer Type
uint32_t number = 0x00000001;
diff --git a/lib/ExecutionEngine/Compiler.cpp b/lib/ExecutionEngine/Compiler.cpp
index 6f54dbc..4595d41 100644
--- a/lib/ExecutionEngine/Compiler.cpp
+++ b/lib/ExecutionEngine/Compiler.cpp
@@ -153,7 +153,7 @@
if (GlobalInitialized)
return;
- LOGI("LIBBCC BUILD: %s\n", libbcc_build_time);
+ LOGI("LIBBCC BUILD CHECKSUM: %s\n", libbcc_build_checksum);
// if (!llvm::llvm_is_multithreaded())
// llvm::llvm_start_multithreaded();
diff --git a/lib/ExecutionEngine/MCCacheReader.cpp b/lib/ExecutionEngine/MCCacheReader.cpp
index 35a006a..aac7be7 100644
--- a/lib/ExecutionEngine/MCCacheReader.cpp
+++ b/lib/ExecutionEngine/MCCacheReader.cpp
@@ -151,10 +151,10 @@
return false;
}
- if (memcmp(mpHeader->libbcc_build_time, libbcc_build_time, 24) != 0) {
- mpHeader->libbcc_build_time[24 - 1] = '\0'; // ensure terminated
- LOGW("Build time mismatch: lib %s cached %s\n", libbcc_build_time,
- mpHeader->libbcc_build_time);
+ if (memcmp(mpHeader->libbcc_build_checksum, libbcc_build_checksum, 41) != 0) {
+ mpHeader->libbcc_build_checksum[41 - 1] = '\0'; // ensure terminated
+ LOGW("Build checksum mismatch: lib %s cached %s\n", libbcc_build_checksum,
+ mpHeader->libbcc_build_checksum);
return false;
}
diff --git a/lib/ExecutionEngine/MCCacheWriter.cpp b/lib/ExecutionEngine/MCCacheWriter.cpp
index dc42cf0..499a82b 100644
--- a/lib/ExecutionEngine/MCCacheWriter.cpp
+++ b/lib/ExecutionEngine/MCCacheWriter.cpp
@@ -92,7 +92,7 @@
// Magic word and version
memcpy(header->magic, OBCC_MAGIC, 4);
memcpy(header->version, OBCC_VERSION, 4);
- memcpy(header->libbcc_build_time, libbcc_build_time, 24);
+ memcpy(header->libbcc_build_checksum, libbcc_build_checksum, 41);
// Machine Integer Type
uint32_t number = 0x00000001;
diff --git a/lib/ExecutionEngine/ScriptCached.h b/lib/ExecutionEngine/ScriptCached.h
index 147c935..39cf663 100644
--- a/lib/ExecutionEngine/ScriptCached.h
+++ b/lib/ExecutionEngine/ScriptCached.h
@@ -17,6 +17,8 @@
#ifndef BCC_SCRIPTCACHED_H
#define BCC_SCRIPTCACHED_H
+#include "Config.h"
+
#include <bcc/bcc.h>
#include <bcc/bcc_cache.h>
#include <bcc/bcc_mccache.h>
diff --git a/lib/ExecutionEngine/bcc.cpp b/lib/ExecutionEngine/bcc.cpp
index 30415d8..f0501cf 100644
--- a/lib/ExecutionEngine/bcc.cpp
+++ b/lib/ExecutionEngine/bcc.cpp
@@ -30,14 +30,10 @@
using namespace bcc;
-char const libbcc_build_time[24] = __DATE__ " " __TIME__;
-
-
namespace llvm {
class Module;
}
-
extern "C" BCCScriptRef bccCreateScript() {
BCC_FUNC_LOGGER();
return wrap(new bcc::Script());