接続のためにオブジェクトファイルをGCCにパイプする方法

接続のためにオブジェクトファイルをGCCにパイプする方法

おもちゃ言語用のカスタムコンパイラはCraneliftを使用してファイルに書き込むことができるオブジェクトコードを生成しますmain.o。このオブジェクトファイルを実行可能にするにはgcc -o main main.o

しかし、一時オブジェクトファイルをディスクに書き込むのを避けるために、コードをGCCに直接パイプしたいので、コンパイラにオブジェクトコードを標準出力に書き込むようにしました。オプションにターゲットファイルの値がないように見えるため、ファイル名としての使用は-機能しません。-x

一種のシェルリダイレクトを使用することも機能しません:error 。gcc -o main <(compiler)with/usr/bin/ld: /proc/self/fd/11: file not recognized: Illegal seekgcc -xc <(echo "int main(){}") -o main-pipe

GCCを使用してパイプで接続されたオブジェクトコードをリンクする方法はありますか?

ベストアンサー1

ld検索可能なファイルが必要なため、パイプは使用できません。 Korn<(...)シェルプロセスは、パイプに拡張されたパスを置き換えます。

通常の検索可能なファイル(背後に作成された)への=(...)パスを取得するには、zshまたはFishが必要です。(...|psub -f)$TMPPREFIX$TMPDIR

gcc -o main =(compiler) # zsh
gcc -o main (compiler|psub -f) # fish

ld必要なファイルのパス.oがで終わる場合にzsh設定しますTMPSUFFIX=.o

他のシェルでは一時ファイルを手動で生成することができ、gccそれを呼び出したりcompiler削除した後に出力をそのファイルにリダイレクトすることもできます。 Korn/POSIXに似たシェルでは:

file=$(mktemp) && {
  rm -f -- "$file" &&
    compiler >&3 3>&- 4<&- &&
    gcc -o main /dev/fd/4 3>&-
} 3> "$file" 4<> "$file"

自己処理のために独自に多くの一時ファイルを生成するので、gccここで追加の一時ファイルの生成を避けようとすることは意味がありません。

おすすめ記事