libsgx_capable.so:无法打开共享库文件:没有这样的文件或目录

时间:2019-02-14 17:19:30

标签: c shared-libraries sgx

我正在尝试运行以下代码,以便在我的计算机中启用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 :(得分:3)

  

奇怪的是,编译时找不到该库。

在编译时(实际上是在链接时)会找到 。否则 app的链接将失败,并且将不存在。 ldd app输出:

libsgx_capable.so => not found

表明链接器找到了libsgx_capable.so,并适当地写了NEEDED .dynamic的{​​{1}}部分中的相应条目,其中app-调用 运行时加载程序-尝试解析为实际文件,但无法解析,因为 loader 现在无法在其始终显示的任何目录中找到ldd

  1. libsgx_capable.so目录
  2. LD_LIBRARY_PATH中列出的ldconfig缓存目录
  3. 受信任的目录/etc/ld.so.conf/lib

这是因为/usr/lib不是目录 2 之一,或者 3 ,并且在您运行/usr/local/lib/intel/sgxsdk/lib64/时不是目录 1 之一。

您说ldd app需要root特权,并使用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

要通过$ 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
在您的makefile中。这将使链接器将App_Link_Flags := -L$(SGX_LIBRARY_PATH) -lsgx_capable -Wl,-rpath=$(SGX_LIBRARY_PATH) 项添加到RUNPATH .dynamic中的部分提示加载程序搜索app 目录 1 之后,目录 2 3 之前所需的库。