Я - полный новичёк. Естественно, собрал и запустил hello_world. Потом посмотрел размер исполняемого модуля:
$ ls -l
итого 664
drwxrwxr-x 2 lary lary 4096 мар 1 2017 build
drwxrwxr-x 2 lary lary 4096 мар 1 2017 deps
drwxrwxr-x 2 lary lary 4096 мар 1 2017 examples
-rwxrwxr-x 1 lary lary 657056 мар 1 2017 hello_world
drwxrwxr-x 2 lary lary 4096 мар 1 2017 native
Цифра 657056 меня как-то огорчила. Я решил, что раз это дебажная сборка, то просто понапихали туда всякой отладочной информации, вот он и здоровенный такой. Решил собрать релиз. Посмотрел:
$ ls -l
итого 5152
drwxrwxr-x 2 lary lary 4096 май 22 17:57 build
drwxrwxr-x 2 lary lary 4096 май 22 17:57 deps
drwxrwxr-x 2 lary lary 4096 май 22 17:57 examples
-rwxrwxr-x 2 lary lary 5236496 май 22 17:57 hello_world
-rw-rw-r-- 1 lary lary 102 май 22 17:57 hello_world.d
drwxrwxr-x 2 lary lary 4096 май 22 17:57 incremental
drwxrwxr-x 2 lary lary 4096 май 22 17:57 native
И стало мне совсем грустно. Я что-то делаю не так? Или это - нормально? По всей видимости, собран модуль, в который статически прилинкован весь run-time. Так и должно быть ?
Ответ
En SO: Why are Rust executables so huge?
Если кратко, то rust по умолчанию влинковывает статически всю свою libstd. Дабы воздержать его от этого можно скормить ему -C prefer-dynamic в аргументы:
$ cat hw.rs
pub fn main() {
println!("Hello world!");
}
$ rustc hw.rs -o hw-rust.static
$ rustc hw.rs -C prefer-dynamic -o hw-rust.dynamic
$ ls -lh hw*
-rw-r--r-- 1 alexander users 48 май 24 08:06 hw.rs
-rwxr-xr-x 1 alexander users 14K май 24 08:17 hw-rust.dynamic
-rwxr-xr-x 1 alexander users 3,0M май 24 08:16 hw-rust.static
Update*
Стоит иметь в виду, что стабильного ABI у Rust пока нет, и как soname, так и символы динамической линковки меняются от версии к версии. Единственный практически поддерживаемый вид динамических крейтов — cdylib, но это используется для создания плагинов с C-совместимым внешним интерфейсом, а не для «родных» динамических библиотек.
* За замечание спасибо @mzabaluev
Комментариев нет:
Отправить комментарий