Странно то, что эта библиотека не найдена при компиляции.
Она найдена при компиляции (фактически, при компоновке).В противном случае связь 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
требуется привилегия 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 .