libsgx_capable.so: невозможно открыть общий объектный файл: нет такого файла или каталога
Я пытаюсь запустить следующий код, чтобы включить SGX на моем компьютере (BIOS: программно управляемый):
//enable_device.c
#include "stdio.h"
#include "sgx_capable.h"
#include "sgx_eid.h"
#include "sgx_urts.h"
#include "sgx_error.h"
int main(void) {
sgx_device_status_t sgx_device_status;
sgx_status_t ret;
ret = sgx_cap_enable_device(&sgx_device_status);
if(ret == SGX_SUCCESS) {
switch(sgx_device_status) {
case SGX_ENABLED:
printf("The platform is enabled for Intel SGX.\n$
break;
case SGX_DISABLED_REBOOT_REQUIRED:
printf("This platform is disabled for Intel SGX.$
break;
case SGX_DISABLED_MANUAL_ENABLE:
printf("The platform is disabled for Intel SGX b$
break;
// case SGX_DISABLED_HYPERV_ENABLED:
// printf("The detected version of Windows* 10 is i$
// break;
case SGX_DISABLED_LEGACY_OS:
printf("The operating system does not support UE$
break;
case SGX_DISABLED_UNSUPPORTED_CPU:
printf("Intel SGX is not supported by this proce$
break;
case SGX_DISABLED:
printf("This platform is disabled for Intel SGX.$
break;
default:
printf("UNKNOWN RESPONSE\n");
}
} else {
switch(ret) {
case SGX_ERROR_INVALID_PARAMETER:
printf("The sgx_device_status pointer is invalid$
break;
case SGX_ERROR_NO_PRIVILEGE:
printf("The application does not have the requir$
break;
// case SGX_ERROR_HYPERV_ENABLED:
// printf("The detected version of Windows* 10 is i$
// break;
default:
printf("An unexpected error is detected.\n");
}
}
return 0;
}
Вот Makefile, который я использую:
######### SGX TOOLS ######################
SGX_SDK := /usr/local/lib/intel/sgxsdk
SGX_LIBRARY_PATH := $(SGX_SDK)/lib64
######## App Settings ########
App_C_Files := enable_device.c
App_C_Flags := -fPIC -Wno-attributes -IInclude -IApp -I$(SGX_SDK)/include
App_Cpp_Flags := $(App_C_Flags) -std=c++11
App_Link_Flags := -L$(SGX_LIBRARY_PATH) -lsgx_capable
App_C_Objects := $(App_C_Files:.c=.o)
App_Name := app
.PHONY: all run
all: $(App_Name)
run: all
######## App Objects ########
enable_device.o: enable_device.c
@$(CC) $(App_C_Flags) -c $< -o $@
$(App_Name): enable_device.o
@$(CC) $^ -o $@ $(App_Link_Flags)
.PHONY: clean
clean:
@rm -f $(App_Name) $(App_C_Objects)
Когда я запускаю приложение, я получаю это сообщение:
Приложение не имеет необходимых прав для чтения переменной EFI. Запустите приложение с правами администратора, чтобы включить состояние устройства Intel SGX.
Затем я бегу sudo ./app
и получите следующую ошибку:
./app: ошибка при загрузке общих библиотек: libsgx_capable.so: не удается открыть файл общего объекта: нет такого файла или каталога
Странно то, что эта библиотека не найдена при компиляции:
$ldd app
linux-vdso.so.1 (0x00007ffe065bc000)
libsgx_capable.so => not found
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f15a060d000)
/lib64/ld-linux-x86-64.so.2 (0x00007f15a0c01000)
Затем я использую:
export LD_LIBRARY_PATH=/usr/local/lib/intel/sgxsdk/lib64/
Я снова запускаюсь, и возвращается то же сообщение об ошибке. Кто-нибудь может сказать, что мне не хватает?
1 ответ
Странно то, что эта библиотека не найдена при компиляции.
Он обнаруживается при компиляции (собственно, при компоновке). В противном случае связь app
потерпит неудачу и не будет существовать. ldd app
выход:
libsgx_capable.so => not found
показывает, что найден компоновщик libsgx_capable.so
и должным образом написал NEEDED
запись для него в .dynamic
раздел app
, который ldd
- вызывая загрузчик времени выполнения - пытается разрешить фактический файл и не может разрешить, потому что загрузчик теперь не может найти libsgx_capable.so
в любом из каталогов, где он всегда выглядит:
-
LD_LIBRARY_PATH
каталоги -
ldconfig
каталоги кеша перечислены в/etc/ld.so.conf
- Доверенные каталоги
/lib
а также/usr/lib
Это потому /usr/local/lib/intel/sgxsdk/lib64/
не является одним из каталогов 2 или 3 и не является одним из каталогов 1 в тот момент, когда вы запускаете ldd app
,
Вы говорите, что app
требует прав суперпользователя, и вы запускаете его с sudo ./app
, но даже когда вы выполняете:
$ export LD_LIBRARY_PATH=/usr/local/lib/intel/sgxsdk/lib64/
$ sudo ./app
вы все еще сталкиваетесь с:
./app: error while loading shared libraries: libsgx_capable.so: cannot open shared object file: No such file or directory
Это происходит потому, что sudo
По умолчанию команда не передает среду, в которой она вызывается, командам, которые она выполняет от имени пользователя root. Увидеть:
$ cat main.c
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char const *foobar = getenv("FOOBAR");
printf("FOOBAR=[%s]\n",foobar ? foobar : "<null>");
return 0;
}
$ gcc -Wall -o prog main.c
$ export FOOBAR=foobar
$ ./prog
FOOBAR=[foobar]
$ sudo ./prog
FOOBAR=[<null>]
Для передачи настроек среды через sudo
вы можете передать их в качестве параметров sudo
:
$ sudo FOOBAR=barfoo ./prog
FOOBAR=[barfoo]
$ echo $FOOBAR
foobar
или вы можете дать вариант -E
в sudo
:
$ sudo -E ./prog
FOOBAR=[foobar]
Так что либо:
$ sudo LD_LIBRARY_PATH=/usr/local/lib/intel/sgxsdk/lib64/ ./app
или же:
$ export LD_LIBRARY_PATH=/usr/local/lib/intel/sgxsdk/lib64/
$ sudo -E ./app
буду работать. Однако вы можете предпочесть не зависеть от LD_LIBRARY_PATH
позволить app
нагрузка libsgx_capable.so
во время выполнения. В этом случае вы можете получить его в ldconfig
кеш, запустив:
$ sudo ldconfig /usr/local/lib/intel/sgxsdk/lib64/
который будет кэшировать любые общие библиотеки в /usr/local/lib/intel/sgxsdk/lib64/
для погрузчика.
Или, если вы предпочитаете ldconfig
кеш, как определил ваш дистрибутив, вы можете просто изменить:
App_Link_Flags := -L$(SGX_LIBRARY_PATH) -lsgx_capable
чтобы:
App_Link_Flags := -L$(SGX_LIBRARY_PATH) -lsgx_capable -Wl,-rpath=$(SGX_LIBRARY_PATH)
в вашем make-файле. Это заставит компоновщик добавить RUNPATH
вход в .dynamic
раздел в app
подсказывает загрузчику поиск /usr/local/lib/intel/sgxsdk/lib64/
для необходимых библиотек после каталогов 1 и до каталогов 2 и 3.