cargoでリンカを指定して独自リンカスクリプトを使う方法

Rust × RISC-Vでプログラミングをしているのですが、cargoだけで思い通りのリンクができるようになりました。 地味にやり方が見つからなかったのですが、絶対どこかには書かれていると思うんですよね。ご存知の方がいらっしゃいましたらご連絡下さい。

Rustのエコシステムでは、RISC-Vのリンカが同梱されていないため、riscv-toolchainを別途構築しているのですが、こいつをcargoのビルドプロセスで使いたいです。 今までは仕方なく、下記Makefileを用意してプロジェクトをstaticlibで作成して、cargo xbuildした後に、riscv-toolchainのリンカを呼び出していました。

$(TARGET): $(CARGO_BUILD_DIR)/$(RUST_TARGET) linker.ld Makefile
  $(RISCV-LD) -T linker.ld $(CARGO_BUILD_DIR)/$(RUST_TARGET) -o $(TARGET)

$(CARGO_BUILD_DIR)/$(RUST_TARGET): src/lib.rs src/io/uart.rs Makefile
  cargo xbuild --target riscv32imac-unknown-none-elf

今は、

$ cargo build

で、指定のリンカスクリプトを指定して、リンカが動くようになりました。 やり方は、.cargo/configに次の設定を書くだけです。

[target.riscv32imac-unknown-none-elf]
linker = "/opt/riscv/bin/riscv32-unknown-linux-gnu-ld"
rustflags = [
  "-C", "link-arg=-Tlinker.ld",
]

[build]
target = "riscv32imac-unknown-none-elf"

リンカの指定まではすぐに見つかったのですが、rustflags使うところに至れず、時間を溶かしてしまいましたが、うまくいったので良しとしましょう。