2

私は(おもちゃの言語用に)適度に優れた最適化コンパイラーを実装しましたが、かなり不可解なシナリオに出くわしました。入力ファイルを取得してそこからアセンブリを作成できるので、その点で「コンパイラ」は完成です。そのアセンブリファイルをNASMでアセンブルし、G ++を使用してランタイムサポートライブラリにリンクすると(ランタイムにはlibstdc ++が必要です)、エラーなしで実行可能ファイルが機能します。ただし、1つのコマンドで実行可能ファイルにコンパイルできるようにしたいのでsystem、bashで使用していたのとまったく同じコマンドを渡して、コンパイラーにいくつかの呼び出しを追加しました。コンパイラを実行すると、正しくアセンブリされているように見えますが、リンク手順(ここでも、g ++を使用)は。で失敗しますundefined reference to main。混乱して、手動でリンクしようとしました(再組み立てせずに、system、および同じエラーを受け取りました。新しいコンパイラのアセンブリ出力を使用して再アセンブルする場合、問題はありません。そのため、NASMが問題であると考えられています。私が言ったように、コマンドはまったく同じです(最初の後で確認するために、文字通りコピーして貼り付けました)。この環境変数か何かですか?どうしたの?

編集:コンパイラのコマンドと同じコマンドを使用して、オブジェクトファイルを手動でアセンブルし、2つの間でvim差分を実行しました。コンパイラによって生成されたものには、ELFヘッダーのみが含まれているようです。

編集2:差分のスクリーンショットスクリーンショット

編集3:私はsystemPerlスクリプトを呼び出してみましたが、それはNASMとG ++を呼び出しますが、それでも運がありません。

4

1 に答える 1

1

修正しました!競合状態のためにファイルがフラッシュされなかった。すべての助けをありがとう、大いに感謝します。

于 2012-10-06T17:53:09.407 に答える