     if both lists contain a same EDL. The function sequence is backwards compatible.*)
    let join (ec1: enclave_content list) (ec2: enclave_content list) =
      let join_one (acc: enclave_content list) (ec: enclave_content) =
-@@ -1743,6 +1840,7 @@
+@@ -1743,6 +1856,7 @@
          include_list = acc.include_list @ ec2.include_list;
          import_exprs = [];
          comp_defs    = acc.comp_defs   @ ec2.comp_defs;

     List.iter (fun s -> output_string out_chan (s ^ "\n")) ubridge_list;
     output_string out_chan (gen_ocall_table ec);
     List.iter (fun s -> output_string out_chan (s ^ "\n")) uproxy_list;
@@ -1537,14 +1629,18 @@
     List.map (fun tfd -> gen_func_tbridge tfd dummy_var) trusted_fds in
   let ecall_table = gen_ecall_table ec.tfunc_decls in
   let entry_table = gen_entry_table ec in

  `psw/enclave_common/sgx_enclave_common.cpp` add a static `pid`, and
  check the pid everytime when checking `s_enclave_init` table. If `pid` has
  changed, clear `s_enclave_int` table.
* Add a utility specifier to edger8r.
  `sdk/edger8r/linux/Ast.ml` add tf_is_utility field to trusted_func.
  `sdk/edger8r/linux/CodeGen.ml` add is_utility_ecall check, add
  tf_list_to_utility_list method, fold it into ecall table in `gen_ecall_table`,
  check the value in `gen_func_uproxy` and add this as a new parameter to
  `sgx_ecall`, add check to `check_priv_funcs` to check for at least one
  non-private and non-utility ecall.
  `sdk/edger8r/linux/Lexer.mll` add Tutility to the parse rule.
  `sdk/edger8r/linux/Parser.mly` add Tutility to token, add utility check
  in trusted_functions parser.
  `common/inc/sgx_edger8r.h`, `common/inc/internal/routine.h`,
  `psw/urts/routine.cpp` add a new bool variable `is_utility` to
  `sgx_ecall`.

--
diff -Nur common/inc/internal/elfheader/elf_common.h common/inc/internal/elfheader/elf_common.h
