Ubugeeei / vaughan

Operating system scratch implements in C lang
1 stars 0 forks source link

Rustで実装したコードをこのPJの環境で動かしたい #15

Open Ubugeeei opened 1 year ago

Ubugeeei commented 1 year ago

このリポジトリの概要

このリポジトリは著書「30日でできる! OS自作入門」をもとにやった自作OSのリポジトリです。

想定される環境

言語: C言語

コンパイラ: i386-elf-gcc

コンパイラオプション:

動作環境: qemu-system-i386 format=raw,if=floppy (PCはmacOS 10.x, intelです)

やりたいこと ならびに問題点

上記の環境で実装したkernelの一部をRustで書いたコードで置き換えていきたいです。(理由は得にない。愛情?)
がしかし、全くわからないです。そもそもリンカにもクロスコンパイルにもFFIにもなれておらず、いくつかのシンプルなクロスコンパイルやFFIをRustで行ったことがありますが、このPJでは一筋縄で行かず。
rustが提供してくれているtargetにはi386-elf-gccがそもそもなく(i386-apple-iosみたいなやつしかない?)、色々調べてみると、cargo-xbuildを使ってjsonでたくさん設定書けばクロスコンパイル自体はできるようでした。参考 (しかしよくわからず)

今回やりたいことは、このようなクロスコンパイルかつ、既存のC言語の実装からいい感じに呼び出したいという感じです。

以下のPRに実現したいコードをおいてありますのでもしよければ見ていただきたいです。

こういうことがしたい(ビルドの設定も何もまだやっていないので全く動きません。) https://github.com/Ubugeeei/vaughan/pull/14

[1/9 17時追記] ある程度もがいていたらRustのi386 32bit elfへのビルドは多分できるようになりました。 スクリーンショット 2023-01-09 17 09 33 スクリーンショット 2023-01-09 17 09 05 ここまでの差分PRはこちら https://github.com/Ubugeeei/vaughan/pull/16 あとはこれをうまい感じにリンクしたい (Rust関係ないかも。。。。。。。。。)

環境構築

実装中に右往左往してよくわかっていないまま進めた部分もあるのであまり正確ではないかもしれません。

必要そうなもの

Cコンパイラはi386-elf-gccをもともと使っていて、Rustのi386 32bit elfへのビルドの対応でx86_64-elf-gccを使用します。
が、ここでも問題があって、i386-elf-gccはx86_64-elf-gccに統合されてしまったようで、x86_64-elf-gccをインストールすると消えてしまいます。これだけなら何も問題ないかのように思いますが、なぜかx86_64-elf-gcc内包のi386-elf-gccではカーネルをビルドすることができません。 この問題については今自分で取り組んでいて、それが解消されるまではx86_64-elf-gccでRust側の成果物を作ったあとにx86_64-elf-gccはアンインストールしてカーネルはi386-elf-gccでビルドするとかいう死ぬほど面倒くさい感じになってしまっています。

ビルド・起動

$ make run_full

総合してお伝えしたいこと

もし、Rustのビルドの方針があっているとするなら、課題はRustではなくリンクにあることになってしまうので、 この配信で相談させていただくのは不適切かなと思っています(可能ならしたいが)
それと、上記の環境構築・ビルド周りの課題が発生しているので、配信では時間の都合上コードを動かしながらビルドしながら試す(or 試してもらう)のが結構厳しいかもしれません。 なので、全体を通して思うに、あまり実際のコード見ながらではなく本当に相談という形のほうが良いかもしれません。

Ubugeeei commented 1 year ago

問題点追記
Rustのコードをクロスビルドしてrlibは作れた。 が、クロスビルドをするためにx86_64-elf-gccをインストールするとi386-elf-gccが使えなくなる.
i386-elf-gccで自作OSをビルドしているのでビルドできなくて困っている

Ubugeeei commented 1 year ago

とりあえず、x86_64-elf-gccはRustの成果物が作れればOKなので、x86_64-elf-gccはアンストしてi386-elf-gccを使うようにした。

相変わらずRustの成果物と自作OSのリンクはうまくできない

Ubugeeei commented 1 year ago

現時点で起きているリンクエラー

/usr/local/Cellar/i386-elf-gcc/11.2.0_1/lib/gcc/i386-elf/11.2.0/../../../../i386-elf/bin/ld: ../../target/kernel/rust/rustlib.a: error adding symbols: archive has no index; run ranlib to add one
collect2: error: ld returned 1 exit status
Ubugeeei commented 1 year ago

※ このissueはKOBA789さんの配信での相談投稿用 https://youtu.be/C_qKda3WO_8?t=5469