libsgx_capable.so: невозможно открыть общий объектный файл: нет такого файла или каталога - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь запустить следующий код для включения 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 Ответ

0 голосов
/ 14 февраля 2019

Странно то, что эта библиотека не найдена при компиляции.

Она найдена при компиляции (фактически, при компоновке).В противном случае связь app потерпит неудачу и не будет существовать.Вывод ldd app:

libsgx_capable.so => not found

показывает, что компоновщик нашел libsgx_capable.so и должным образом записал для него запись NEEDED в секции .dynamic app, который ldd - вызывает загрузчик времени выполнения - пытается разрешить фактический файл и не может разрешить, потому что загрузчик теперь не может найти libsgx_capable.so ни в одном из каталогов, где он всегда выглядит:

  1. Каталоги LD_LIBRARY_PATH
  2. Каталоги кэша ldconfig, перечисленные в /etc/ld.so.conf
  3. Доверенные каталоги /lib и /usr/lib

Это потому, что /usr/local/lib/intel/sgxsdk/lib64/ не является одним из каталогов 2 или 3 и не является одним из каталогов 1 на данный моменткогда вы запускаете ldd app.

Вы говорите, что для app требуется привилегия root, и вы запускаете его с 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 .

...