Add MinSFI loader

This patch implements a memory initialization routine as part of MinSFI's
trusted runtime. The code reads the manifest of the sandbox it was compiled
against, mmaps a sufficiently large memory region and jumps into the
sandbox's entry function. There is no support for multiple simultaneously 
active sandboxes or multithreading.

BUG= https://code.google.com/p/chromium/issues/detail?id=397177
TEST= ./scons bitcode=1 minsfi=1 minsfi_tests
NOTRY=true

Review URL: https://codereview.chromium.org/539683002

git-svn-id: svn://svn.chromium.org/native_client/trunk/src/native_client/site_scons@13722 fcba33aa-ac0c-11dd-b9e7-8d5594d729c2
diff --git a/site_tools/naclsdk.py b/site_tools/naclsdk.py
index 2208d6d..b5f7f58 100755
--- a/site_tools/naclsdk.py
+++ b/site_tools/naclsdk.py
@@ -176,6 +176,19 @@
   else:
     ld_arch_flag = arch_flag
 
+  llc_mtriple_flag = ''
+  if env.Bit('minsfi'):
+    llc_cpu = ''
+    if env.Bit('build_x86_32'):
+      llc_cpu = 'i686'
+    elif env.Bit('build_x86_64'):
+      llc_cpu = 'x86_64'
+
+    if env.Bit('host_linux'):
+      llc_mtriple_flag = ' -mtriple=%s-linux-gnu' % llc_cpu
+    elif env.Bit('host_mac'):
+      llc_mtriple_flag = ' -mtriple=%s-apple-darwin' % llc_cpu
+
   translator_root = os.path.join(os.path.dirname(root), 'pnacl_translator')
 
   binprefix = os.path.join(root, 'bin', 'pnacl-')
@@ -202,6 +215,7 @@
   pnacl_finalize = binprefix + 'finalize' + binext
   pnacl_opt = binprefix + 'opt' + binext
   pnacl_strip = binprefix + 'strip' + binext
+  pnacl_llc = binprefix + 'llc' + binext
 
   # NOTE: XXX_flags start with space for easy concatenation
   # The flags generated here get baked into the commands (CC, CXX, LINK)
@@ -211,6 +225,7 @@
   pnacl_cc_flags = ' -std=gnu99'
   pnacl_ld_flags = ' ' + ' '.join(env['PNACL_BCLDFLAGS'])
   pnacl_translate_flags = ''
+  pnacl_llc_flags = ''
 
   if env.Bit('nacl_pic'):
     pnacl_cc_flags += ' -fPIC'
@@ -220,6 +235,10 @@
     pnacl_ld_flags += ' -fPIC'
     pnacl_translate_flags += ' -fPIC'
 
+  if env.Bit('minsfi'):
+    pnacl_llc_flags += ' -relocation-model=pic -filetype=obj'
+    pnacl_ld_flags += ' -nostdlib -Wl,-r'
+
   if env.Bit('use_sandboxed_translator'):
     sb_flags = ' --pnacl-sb'
     pnacl_ld_flags += sb_flags
@@ -261,6 +280,7 @@
               TRANSLATE=pnacl_translate + arch_flag + pnacl_translate_flags,
               PNACLFINALIZE=pnacl_finalize,
               PNACLOPT=pnacl_opt,
+              LLC=pnacl_llc + llc_mtriple_flag + pnacl_llc_flags,
               )
 
   if env.Bit('built_elsewhere'):