Как мне всегда включать зависимость Rust при компоновке?

#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 для получения дополнительной информации.