Как заставить компоновщик создать файл карты с помощью Cargo

Я пишу программу на Rust, предназначенную для процессора STM32F407, используя цинк. Я хотел бы иметь возможность создать файл карты компоновщика. Я обнаружил, что могу поместить в свой main.rs следующее, и это даст мне желаемый результат:

#![feature(link_args)]
#[link_args = "-Wl,-Map=blink_stm32f4.map"]
extern {}

Однако документация для link_args предлагает не использовать это метод.

Какие еще существуют способы заставить компоновщик создать файл карты?


person Dave Hylands    schedule 03.09.2016    source источник


Ответы (2)


link-args можно перейти на rustc через rustc -C link-args="-Wl,-Map=blink_stm32f4.map" test.rs.

И есть вариант cargo rustflags в разделе build. См. конфигурацию груза. Это работает следующим образом:

$ cargo new --bin testbin
$ cd testbin
$ cat .cargo/config 
[build]
rustflags = ["-Clink-args=-Wl,-Map=/tmp/blink_f7.map"]
$ cargo build

Также есть опция linker в конфигурации cargo. Я не пытаюсь пройти через эту опцию gcc плюс flags, только gcc, но вы можете написать gcc скрипт-оболочку, например:

$ cat my-linker.sh
#!/bin/sh

arm-...-gcc -Wl,-Map=blink_stm32f4.map $@
person fghj    schedule 04.09.2016
comment
Я попытался добавить: [build] rustflags = [-Wl,-Map=blink_f7.map] в свой файл Cargo.toml и получил следующее предупреждение: неиспользуемый ключ манифеста: build.rustflags Я использую nightly-2016- 05-24 строить. Кажется, что многие из советов, которые я нашел с помощью поиска в Google, работают только со старыми версиями rust/cargo. - person Dave Hylands; 04.09.2016
comment
У меня заработал скрипт my-linker.sh - спасибо. Это должно работать под Linux и OSX. Я создаю что-то гораздо большее, чем один файл, поэтому я не уверен, как прямой вызов rustc поможет. Мне нужно включить цинк и его зависимости во время компоновки. 1 из 3 все еще в процессе. - person Dave Hylands; 04.09.2016
comment
@DaveHylands Я обновил свой ответ описанием того, как использовать конфигурацию cargo, кстати, компоновщик также можно установить в .cargo/config, и вы можете установить для него разные значения для разных архитектур. - person fghj; 04.09.2016
comment
Сладкий. Я заставил ваш пример работать. Использование rustflags = [-C, linkargs=...] также работает. использование rustflags = [ -C linkargs=...] (т. е. пробел между -C и linkargs) — нет. Я думаю, что перепутал Cargo.toml и .cargo/config, поэтому некоторые из моих попыток не сработали. - person Dave Hylands; 04.09.2016

Я попытался добавить что-то вроде этого в .cargo/config:

[build]
rustflags = ["-Clink-args=-Wl,-Map=/tmp/app.map"]

Но я получил ошибку:

rust-lld: ошибка: неизвестный аргумент '-Wl,-Map=/tmp/app.map'

Согласно этому блогу , это сработало после того, как я изменил его на:

[build]
rustflags = ["-Clink-args=-Map=/tmp/app.map"]
person fengqi    schedule 13.05.2021
comment
Такие аргументы, как -Wl,-Map, предназначены для компиляторов GCC или совместимых с C, которые иногда используются в качестве компоновщиков. Аргументы после каждого аргумента -Wl передаются компилятору C компилятором. Если rustc используется компоновщик напрямую, что используется по умолчанию для большинства целей, вам не нужно -Wl, так как вы не общаетесь с посредником компилятора C. - person Mastax; 11.06.2021
comment
Спасибо Mastax за информацию. Я знаю, что -Wl,option — это параметр командной строки gcc для передачи параметров компоновщику. Я не уверен, в какой ситуации rustc выберет компилятор C или rust-lld в качестве компоновщика. Возможно, значение по умолчанию изменилось после определенной версии. Или просто потому, что я использую #![no_std]. - person fengqi; 15.06.2021