首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用CMake来造成SGX_ERROR_UNEXPECTED?

用CMake来造成SGX_ERROR_UNEXPECTED?
EN

Stack Overflow用户
提问于 2019-02-17 16:26:44
回答 2查看 235关注 0票数 0

我正在努力学习英特尔sgx sdk最近。

今天,我在代码中发现了一个问题,在英特尔、DOC或WEB中找不到任何解释。

在某些情况下,当我调用SGX_ERROR_UNEXPECTED时,代码将返回sgx_create_enclave。我认为我的CMakeLists.txt有问题(我使用cmake编译项目中不受信任的部分),因为当我使用sdk中的模板Makefile来编译时,代码会正确运行。更多细节吹响:

在以下情况下,代码将成功运行:

代码语言:javascript
复制
  * compile with Makefile

  * compile with cmake and comment out app.cpp:21

在这种情况下,代码将返回错误:

代码语言:javascript
复制
  * compile with cmake and do not comment out app.cpp:21

可用的代码(我已经删除了所有不必要的代码): https://github.com/chilogen/workspace/tree/master/error/SimpleEnclave

app.cpp

代码语言:javascript
复制
#include "enclave_u.h"
#include <sgx_urts.h>
#include <sgx_uae_service.h>
#include <sgx_ukey_exchange.h>
#include <iostream>
using  namespace std;

class testClass {
public:
      sgx_launch_token_t _token = {0};
      sgx_enclave_id_t _eid;
      sgx_ra_context_t _ctx;
      void init_enclave();
      bool request(uint8_t *src, uint32_t srcLen, uint8_t *cmac);
      //will set _ctx here
      //void do_attestation();
}x;

bool testClass::request(uint8_t *src, uint32_t srcLen, uint8_t *cmac) {
    sgx_status_t retval,status;
    status = ecall_calcmac(_eid, &retval,&_ctx, SGX_RA_KEY_SK, src, srcLen, cmac);
    return true;
}

void testClass::init_enclave(){
    sgx_enclave_id_t global_eid;
    sgx_launch_token_t token={0};
    sgx_status_t ret;
    int updated=0;
    ret=sgx_create_enclave("enclave.signed.so",SGX_DEBUG_FLAG, \
                        &token,&updated,&global_eid,NULL);

    if(ret!=SGX_SUCCESS){
        std::cout<<"error init enclavedsfdsf\n";
        printf("%08x\n",ret);
        exit(1);
    }
}

int main(){
    x.init_enclave();
    return 0;
}

CMakeLists.txt

代码语言:javascript
复制
include_directories (/opt/intel/sgxsdk/include)
link_directories (/opt/intel/sgxsdk/lib64)
add_library (enclave_untrusted enclave_u.c)
add_executable (app app.cpp)
target_link_libraries (app enclave_untrusted sgx_ukey_exchange sgx_urts sgx_uae_service pthread)

Makefile (我认为这是重要的部分,如果您对英特尔sgx不太了解,那么您仍然可以检查CMakeLists.txt和Makefile之间的区别)

SDK设置

代码语言:javascript
复制
SGX_SDK ?= /opt/intel/sgxsdk

SGX_LIBRARY_PATH := $(SGX_SDK)/lib64
SGX_ENCLAVE_SIGNER := $(SGX_SDK)/bin/x64/sgx_sign
SGX_EDGER8R := $(SGX_SDK)/bin/x64/sgx_edger8r

######## App Settings ########

App_Include_Paths := -I$(SGX_SDK)/include 

App_Link_Flags := -L /opt/intel/sgxsdk/lib64 -lsgx_urts -lsgx_ukey_exchange -lsgx_uae_service  -pthread 


.PHONY: all
all: app

######## App Objects ########

enclave_u.c: $(SGX_EDGER8R) enclave.edl
    @$(SGX_EDGER8R) --untrusted enclave.edl --search-path $(SGX_SDK)/include
    @echo "GEN  =>  $@"

enclave_u.o: enclave_u.c
    @$(CC) $(App_Include_Paths) -c $< -o $@
    @echo "CC   <=  $<"

app.o: app.cpp
    @$(CXX) $(App_Include_Paths) -c $< -o $@ 
    @echo "CXX  <=  $<"

app: app.o enclave_u.o
    @$(CXX) $^ -o $@ $(App_Link_Flags)
    @echo "LINK =>  $@"

.PHONY: clean

clean:
    @rm -f *.o app

更新: compile.sh

代码语言:javascript
复制
gcc -c -I /opt/intel/sgxsdk/include/ -o enclave_u.o enclave_u.c

g++ -c  app.cpp -o app.o -I /opt/intel/sgxsdk/include/

g++ -o app app.o enclave_u.o -L /opt/intel/sgxsdk/lib64 -lsgx_urts -lsgx_ukey_exchange -lsgx_uae_service  -pthread

那么,我的代码(或CMakeLists.txt)有什么问题,我应该如何做呢?

如果你能给我一些想法,我会很感激的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-18 14:30:17

尝试使用基于目标的API而不是基于目录的:

代码语言:javascript
复制
add_library (enclave_untrusted enclave_u.c)
add_executable (app app.cpp)

target_include_directories (enclave_untrusted PUBLIC /opt/intel/sgxsdk/include)

target_link_libraries (enclave_untrusted PUBLIC
    "/opt/intel/sgxsdk/lib64/libsgx_urts.a"
    "/opt/intel/sgxsdk/lib64/libsgx_ukey_exchange.a"
    "/opt/intel/sgxsdk/lib64/libsgx_uae_service.a"
)
target_link_libraries (app PRIVATE enclave_untrusted pthread)

但是我建议使用一个适当的CMake库,比如SGX-CMake

票数 0
EN

Stack Overflow用户

发布于 2019-02-19 14:08:06

这个问题似乎仍然很奇怪。我可以通过使用SGX来修复这里的示例,但在今天上午,它似乎对我的项目不起作用。然而,经过多次尝试(我不知道哪个是关键),它现在对我的项目起作用了。我会继续搜索所有这些背后的钥匙,如果我找到一个,我会在这里更新。

现在,如果有人需要的话,我将上传上述示例的CMakeLists.txt。

代码语言:javascript
复制
list(APPEND CMAKE_MODULE_PATH ${PATH_TO_FindSGX.cmake_FILE})
find_package(SGX REQUIRED)
set(CMAKE_C_FLAGS "-fpie -fPIC -fstack-protector -g -O2")
set(CMAKE_CXX_FLAGS "-fpie -fPIC -fstack-protector -g -std=c++11 -O2 -DDEBUG -UNDEBUG -UEDEBUG")


set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(EDL_SEARCH_PATHS .)

set(E_SRCS enclave.c)
set(LDS Enclave_debug.lds)


add_enclave_library(enclave SRCS ${E_SRCS} EDL enclave.edl EDL_SEARCH_PATHS            
                    ${EDL_SEARCH_PATHS} LDSCRIPT ${LDS})
enclave_sign(enclave KEY Enclave_private.pem CONFIG Enclave.config.xml)

set(SRCS app.cpp)
add_untrusted_executable(app SRCS ${SRCS} EDL enclave.edl EDL_SEARCH_PATHS   
                         ${EDL_SEARCH_PATHS})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54735200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档