-
Notifications
You must be signed in to change notification settings - Fork 554
Closed
Description
I would like to use OpenMP in an SGX Enclave. I have built a minimal example based on the SampleEnclave and added -fopenmp as compiler option and -lsgx_pthread and -lsgx_omp as enclave linking options in the Makefile. Unfortunately I get the following error:
/usr/bin/ld: /home/jonas/sgxsdk/lib64/libsgx_pthread.a(pthread.o): in function `_pthread_wakeup(unsigned long) [clone .part.0]':
pthread.cpp:(.text._Z15_pthread_wakeupm.part.0+0x2d): undefined reference to `pthread_wakeup_ocall'
/usr/bin/ld: /home/jonas/sgxsdk/lib64/libsgx_pthread.a(pthread.o): in function `pthread_create':
pthread.cpp:(.text.pthread_create+0x117): undefined reference to `pthread_create_ocall'
/usr/bin/ld: pthread.cpp:(.text.pthread_create+0x155): undefined reference to `pthread_wait_timeout_ocall'
/usr/bin/ld: /home/jonas/sgxsdk/lib64/libsgx_pthread.a(pthread.o): in function `pthread_join':
pthread.cpp:(.text.pthread_join+0xdf): undefined reference to `pthread_wait_timeout_ocall'
collect2: error: ld returned 1 exit status
make[1]: *** [Makefile:255: enclave.so] Error 1
make[1]: Leaving directory '/home/jonas/Repositories/omp_intel_sgx'
make: *** [Makefile:180: all] Error 2
Did I forget a necessary step to use omp in the enclave? Thank you!
What are the steps to reproduce the bug?
Add the code below to the sample enclave.
Can you reproduce the bug using the latest master?
Not tested so far.
What CPU, platform, operating system/distribution, and SGX driver are you running? The more specific, the better.
- 2x Intel(R) Xeon(R) Gold 6342
- Ubuntu 20.04 Server
- In-Kernel Driver (Self-compiled 5.11.0)
Makefile
- line 132:
Enclave_Cpp_Flags := $(Enclave_C_Flags) -nostdinc++ -fopenmp- line 144:
Enclave_Link_Flags := $(MITIGATION_LDFLAGS) $(Enclave_Security_Link_Flags) \
-Wl,--no-undefined -nostdlib -nodefaultlibs -nostartfiles -L$(SGX_TRUSTED_LIBRARY_PATH) \
-Wl,--whole-archive -l$(Trts_Library_Name) -Wl,--no-whole-archive \
-Wl,--start-group -lsgx_tstdc -lsgx_pthread -lsgx_omp -lsgx_tcxx -l$(Crypto_Library_Name) -l$(Service_Library_Name) -Wl,--end-group \
-Wl,-Bstatic -Wl,-Bsymbolic -Wl,--no-undefined \
-Wl,-pie,-eenclave_entry -Wl,--export-dynamic \
-Wl,--defsym,__ImageBase=0 -Wl,--gc-sections \
-Wl,--version-script=Enclave/Enclave.ldsEnclave.cpp:
...
void ecall_do_omp_stuff(int* values, size_t size){
#pragma omp parallel for
for (size_t i = 0; i < size; i++)
values[i] = values[i] * values[i];
}
...App.cpp:
...
int SGX_CDECL main()
{
/* Initialize the enclave */
initialize_enclave();
size_t size = 10;
int* values = (int*)malloc(sizeof(int) * size);
for(size_t i=0; i < size; ++i)
values[i] = i;
ecall_do_omp_stuff(global_eid, values, size);
for (size_t i = 0; i < size; ++i)
printf("%d\n", values[i]);
/* Destroy the enclave */
sgx_destroy_enclave(global_eid);
return 0;
}
...Enclave.edl
...
trusted {
public void ecall_do_omp_stuff([in, out, count=size] int* a, size_t size);
};
...Metadata
Metadata
Assignees
Labels
No labels