Когда создается двоичный файл Rust (исполняемый файл или dylib), информация о версии, настроенная в Cargo.toml, не влияет на построенный двоичный файл, то есть настроенная версия не сохраняется внутри двоичного файла.

В Linux, когда я использую readelf -V для файла .so, вы можете видеть, что поддерживаемый интерфейс (имя SO) хранится в разделе определения версии '.gnu.version_d' файла ELF. файл. Например, вывод readelf -V /lib/libnss_files-2.12.so:

Version definition section '.gnu.version_d' contains 2 entries:
   Addr: 0x0000000000001540  Offset: 0x001540  Link: 5 (.dynstr)
   000000: Rev: 1  Flags: BASE   Index: 1  Cnt: 1  Name: libnss_files.so.2
   0x001c: Rev: 1  Flags: none  Index: 2  Cnt: 1  Name: GLIBC_PRIVATE

Файл /lib/libnss_files-2.12.so реализует версию интерфейса libnss_files.so.2

Выходные данные readelf -V для dylib или исполняемого файла, сгенерированного Rust или Cargo, не содержат такой информации о версии. Конфигурация версии в Cargo.toml используется только crates.io.

Более того , библиотеки DLL Windows поддерживают хранение информации о версии, а не имени версии интерфейса SONAME, как Linux. Кросс-скомпилированная DLL Windows также не имеет информации о версии. Возможно, это другой вопрос, но я подумал, что сначала подниму его здесь.

14
palazzo train 5 Янв 2016 в 06:18
Это было в Reddit
 – 
palazzo train
5 Янв 2016 в 06:21

3 ответа

Лучший ответ

Хотя я не думаю, что есть непосредственный способ использовать средства ELF для управления версиями (в любом случае, они не являются кроссплатформенными), можно использовать информацию о версии из Cargo:

const VERSION: &'static str = env!("CARGO_PKG_VERSION");

VERSION теперь будет соответствовать версии, указанной в манифесте при запуске cargo build. В качестве альтернативы вы можете использовать env_opt!(), если хотите построить свою программу без Cargo:

const VERSION: Option<&'static str> = env_opt!("CARGO_PKG_VERSION");
11
Vladimir Matveev 5 Янв 2016 в 15:59
Тогда как я могу прочитать информацию о версии после того, как получу окончательный собранный двоичный файл?
 – 
palazzo train
6 Янв 2016 в 04:09
Что ж, VERSION - это просто обычная константа, поэтому заставьте вашу программу печатать ее, когда вы запускаете ее определенным образом, например, передав аргумент командной строки -v (как это делают многие инструменты CLI): your-program -v. Опять же, как я уже сказал, это не связано с информацией о версии, специфичной для двоичного формата (заголовки ELF, заголовки PE или что-то еще).
 – 
Vladimir Matveev
6 Янв 2016 в 13:46
Хорошо, это означает, что я не могу просмотреть версию, не запустив код в библиотеке. Но знать об этом факте - это нормально. Знаете ли вы, что Cargo / Rust планирует использовать собственные средства ОС для управления версиями?
 – 
palazzo train
11 Янв 2016 в 10:59
@palazzotrain, нет, я не слышал о таких планах. Но вы всегда можете отправить запрос функции в Cargo и средства отслеживания проблем Rust. Я думаю, что для такого изменения не потребуется RFC, хотя, конечно, я могу ошибаться.
 – 
Vladimir Matveev
11 Янв 2016 в 11:56
1
Отправляю запрос в систему отслеживания проблем Cargo. github.com/rust-lang/cargo/issues/2273.
 – 
palazzo train
12 Янв 2016 в 10:31

Использовать winres (https://github.com/mxre/winres) можно установить для CARGO_PKG_VERSION версию файла dll , может быть, поможет другим

1
allenchou13 13 Янв 2021 в 10:29

Чтобы дать обновленную информацию о принятом ответе. В Rust 2021 второй макрос, упомянутый в ответе (env_opt), теперь доступен через std::option_env

const CARGO_PKG_VERSION: Option<&'static str> = option_env!("CARGO_PKG_VERSION");

А потом вы можете использовать его как

info!("Booting up... VERSION={}", CARGO_PKG_VERSION.unwrap_or("NOT_FOUND"));

Кроме того, в качестве примечания, если вы хотите включить, например, конфигурацию по умолчанию в двоичный файл, макрос std::include_str может представлять интерес.

2
ndrsllwngr 20 Дек 2021 в 17:09