stdoutでコンパイルするときのg ++​​のリンカエラー

stdoutでコンパイルするときのg ++​​のリンカエラー

dummy.cppというC ++ファイルがあり、stdinから出るようにg ++を使用してコンパイルする必要があり、g ++がコンパイルされたバイナリをstdoutにエクスポートするとします。

stdin部分のみが必要な場合は、次のコマンドを使用できます。

$ g++ -x c++ -o dummy - < dummy.cpp

/dev/stdoutここで出力部分を追加します。私が知っている限り(または)を出力パラメータとして使用する必要があります/proc/self/fd/1が、リンカエラーで終了するため、機能しません。

$ g++ -x c++ -o /dev/stdout - < dummy.cpp
/usr/bin/ld: final link failed: Illegal seek
collect2: error: ld returned 1 exit status

これにより、端末からファイルにリダイレクトするとg++ -x c++ -o /dev/stdout - < dummy.cpp > dummy正常に動作します。問題は、stdoutが検索可能ではなくファイルにパイプされたときに「なる」ことです。しかし、なぜldファイルを検索し、何とかバイパスすることができますか?

ベストアンサー1

コメントで述べたように、リンカはファイルを段階的に作成し、ヘッダ領域のエントリをサイズとオフセットで埋めるためです。 ELF形式は、ファイルの初期部分にこれらの値を含め、適切な部分を簡単かつ効率的に見つけることができるため、リンカーは自然に機能します。 Zipファイルなどのストリーミング用に設計されたフォーマットは、マニフェストデータを最後に配置することでより複雑な傾向があります。

ストリーミング出力のサポートは理論的に可能ですが、これには大量のデータバッファリング、データの2回の計算、または他のさまざまな非効率的な慣行が必要になる場合があります。これは非常にまれであるため、コードの複雑さとリンカーの潜在的な非効率性を考慮する価値がない可能性があります。 。一時ファイルを使用して適切なクリーンアップを実行して、小さなシェルスクリプトまたはシェルの1行スクリプトでこれを達成できます。

おすすめ記事