#rust #sgx
#Ржавчина #sgx
Вопрос:
Я пытаюсь использовать платформу Fortanix SGX для запуска libdvdcss в анклаве, но у меня проблемы с компоновщиком.
Я создал простую оболочку FFI вокруг libdvdcss, которая отлично работает при ее обычном выполнении в Linux (без SGX и с libdvdcss, установленным глобально). Это не работает, когда я запускаю его с целью x86_64-fortanix-unknown-sgx
, указанной на странице «Начало работы», потому что компоновщик жалуется на множество отсутствующих символов, особенно на malloc
etc .
Насколько я понимаю, проблема в том, что в SGX нет libc, поэтому мне нужно включить rs-libc
вручную, что в основном является libc для использования в SGX. rs-libc
Ящик содержит C, ASM, а также некоторый код Rust (в основном для malloc
). Таким образом, мой Cargo.toml:
[dependencies]
rs-libc = "0.2.3"
Я обнаружил, что этого недостаточно и что я должен предоставить следующее build.rs чтобы вручную указать компоновщику также связать libc.a
данные из rs-libc
ящика.
pub fn main() {
println!("cargo:rustc-link-search=/home/me/dev/libdvdcss/.libs"); // Will be changed later
println!("cargo:rustc-link-lib=static=dvdcss");
println!("cargo:rustc-link-lib=static=c");
}
Это исправляет некоторые ошибки с strlen
etc. не найдено, но не для malloc
и free
. Я думаю, проблема в том, что они не компилируются из исходного файла C, а вместо этого в alloc.rs . Я также видел, что этот исходный файл скомпилирован в библиотеку Rust target/x86_64-fortanix-unknown-sgx/debug/deps/librs_libc-04111db022dd517f.rlib
и содержит символы:
rs_libc-04111db022dd517f.rs_libc.53f0fd72-cgu.5.rcgu.o:
0000000000000000 T calloc
0000000000000000 T free
0000000000000000 W __llvm_lvi_thunk_r11
0000000000000000 T malloc
0000000000000000 T realloc
0000000000000000 V __rustc_debug_gdb_scripts_section__
U _ZN3std3sys3sgx5alloc81_$LT$impl$u20$core..alloc..global..GlobalAlloc$u20$for$u20$std..alloc..System$GT$12alloc_zeroed17ha722ea369ab2dac9E
U _ZN3std3sys3sgx5alloc81_$LT$impl$u20$core..alloc..global..GlobalAlloc$u20$for$u20$std..alloc..System$GT$5alloc17h561d825df0f2dfa8E
U _ZN3std3sys3sgx5alloc81_$LT$impl$u20$core..alloc..global..GlobalAlloc$u20$for$u20$std..alloc..System$GT$7dealloc17hbbda0b3d0a1f9d67E
U _ZN3std3sys3sgx5alloc81_$LT$impl$u20$core..alloc..global..GlobalAlloc$u20$for$u20$std..alloc..System$GT$7realloc17hf76d62802e46847bE
U _ZN4core3ptr4read17hc3470c4a404ff082E
U _ZN4core3ptr5write17ha0bb4d6cbfed535eE
U _ZN4core5alloc6layout6Layout25from_size_align_unchecked17h074422ae6f6459f7E
U _ZN4core9panicking5panic17hde9db97a7382bd28E
К сожалению, этот файл, похоже, не включен в последнюю команду компоновщика. Я думаю, это связано с тем, что в моем приложении Rust не найдено использования этой библиотеки, и поэтому она оптимизирована.
Есть ли способ включить ее, тем не менее?
Ответ №1:
Добавление an extern crate rs_libc;
в корень вашего ящика должно сработать. Обязательно, extern crate
чтобы компоновщику была передана зависимость, объявленная с помощью. В rust 2018 и выше соответствующее объявление неявно добавляется компилятором в ваш ящик тогда и только тогда, когда вы используете один или несколько символов этого ящика (rust 2015 требует extern crate
добавления явно). Смотрите Раздел в справочнике rust для получения дополнительной информации.