Страницы

Поиск по вопросам

пятница, 31 января 2020 г.

Очень большой размер исполняемого модуля

#linux #rust


Я - полный новичёк. Естественно, собрал и запустил 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. Так и должно быть ?
    


Ответы

Ответ 1



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

Комментариев нет:

Отправить комментарий