簡體   English   中英

使用system()從C程序調用NASM會產生不同的目標代碼,然后使用Bash進行調用

[英]Calling NASM from a C program using system() produces different object code then calling using Bash

我已經實現了一個相當好的優化編譯器(針對玩具語言),並且遇到了一個令人費解的場景。 我可以獲取一個輸入文件並從中生成程序集,因此在這方面,“編譯器”已完成。 如果我使用該程序集文件與NASM進行組裝,並使用G ++將其鏈接到我的運行時支持庫(運行時需要libstdc ++),我將獲得一個正常運行的可執行文件,並且沒有任何錯誤。 但是,我希望能夠用一個命令將其編譯為可執行文件,因此我在編譯器中添加了一些對system調用,傳遞了我在bash中使用的EXACT SAME COMMANDS。 當我運行編譯器時,似乎可以正確地進行組裝,但是鏈接步驟(再次使用g ++)失敗,並且undefined reference to main 感到困惑,我嘗試手動鏈接(不進行重新組裝,因此我使用了NASM與system運行的目標文件,並收到了相同的錯誤。如果我使用新編譯器的匯編輸出進行重新組裝,則沒有問題,這導致了可以相信NASM是問題。就像我說的,這些命令是完全相同的(我確實是在第一次復制后才將它們粘貼並粘貼的),這是環境變量還是什么原因?

編輯:我手動組裝了一個目標文件,再次使用與編譯器中相同的命令,並且在兩者之間做了vim diff。 編譯器生成的似乎只包含ELF標頭。

編輯2:差異的屏幕截圖 截圖

編輯3:我嘗試使用system調用Perl腳本,而該腳本又將調用NASM和G ++,仍然沒有運氣。

修復! 這是由於競爭狀況導致文件未刷新。 感謝您的所有幫助,不勝感激。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM