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使うところに至れず、時間を溶かしてしまいましたが、うまくいったので良しとしましょう。