Исключает ли скомпилированный исполняемый файл Rust неиспользуемый код из зависимостей? - PullRequest
0 голосов
/ 28 августа 2018

Если я создаю приложение Rust с использованием Cargo с некоторыми зависимостями от ящика, будет ли какой-либо код в этих зависимостях, который не используется моим приложением, исключен из конечного исполняемого файла?

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

TL; DR: Да, каждая неиспользуемая функция будет исключена.

На самом деле это работа LLVM, которая будет по крайней мере отслеживать каждую неиспользуемую функцию. Любой неиспользуемый код (как в кодовых путях в функции, не выполняемой во всем Приложении), может потребовать активации LTO (Link Time Optimization), чтобы превратить ваш ящик в одну единицу компиляции и дать LLVM шанс на сражение.

0 голосов
/ 28 августа 2018

Похоже на это. Я сделал тестовую библиотеку и ящик для мусора рядом:

// hellobin/src/main.rs

extern crate hellolib;

fn main() {
    hellolib::func1();
}

Для библиотеки:

// hellolib/src/main.rs

pub fn func1() {
    println!("Hello, world!");
}

pub fn func2() {
    println!("Hello, other world!");
}

Сборка моего двоичного файла с последующей проверкой символов с помощью nm:

$ nm target/debug/helloworld | grep hello
0000000100001360 t __ZN10helloworld4main17h749f61fb726f0a10E
00000001000014b0 T __ZN8hellolib5func117hec0b5301559d46f6E

Только последняя функция имеет символ в конечном двоичном файле.

Вы можете скомпилировать с помощью cargo rustc -- -C link-dead-code, и вы увидите, что присутствуют оба символа, включая неиспользованный:

$ nm target/debug/helloworld | grep hello
0000000100001270 t __ZN10helloworld4main17h3104b73b00fdd798E
00000001000013d0 T __ZN8hellolib5func117hec0b5301559d46f6E
0000000100001420 T __ZN8hellolib5func217hc9d0886874057b84E

Я полагаю (но я не уверен), что это компоновщик, удаляющий мертвый код, поэтому он все еще мог быть скомпилирован и затем удален во время компоновки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...