首先明確一點,如果真的只有一個原始檔,那麼是可能可以不用連結器的。
之所以即使只有一個原始檔仍然需要連結器,一方面通常是因為在你的host環境下生成一個可執行程式需要的不僅僅是你輸入的原始檔。
有沒有想過argc argv誰傳給main的?main的返回值又給了誰?程式初始的棧底誰設定的?等。
所以絕大多數環境下,程式的真正起始並不是main,而是被包裹在host相關的start和end(名字不一定)中的,所以需要連結器。
關於這點,你可以把你的可執行檔案dump一下,看看有哪些你沒見過的符號,section,等。
另一方面,即使是同一原始檔內部的引用,很多時候也是不在編譯期算的,而是留下relocation交給連結器來解決。雖然local符號可以在編譯期算出來,但是考慮到relax,連結最佳化等問題,交給連結器更好。
再有,如果你調了庫,那就更需要連結器來連結庫了。
最後,回到第一句,如果以上提到的問題你的原始檔都解決了,你是可以由編譯器直接生成一個可執行檔案而無需連結器的。
首先明確一點,如果真的只有一個原始檔,那麼是可能可以不用連結器的。
之所以即使只有一個原始檔仍然需要連結器,一方面通常是因為在你的host環境下生成一個可執行程式需要的不僅僅是你輸入的原始檔。
有沒有想過argc argv誰傳給main的?main的返回值又給了誰?程式初始的棧底誰設定的?等。
所以絕大多數環境下,程式的真正起始並不是main,而是被包裹在host相關的start和end(名字不一定)中的,所以需要連結器。
關於這點,你可以把你的可執行檔案dump一下,看看有哪些你沒見過的符號,section,等。
另一方面,即使是同一原始檔內部的引用,很多時候也是不在編譯期算的,而是留下relocation交給連結器來解決。雖然local符號可以在編譯期算出來,但是考慮到relax,連結最佳化等問題,交給連結器更好。
再有,如果你調了庫,那就更需要連結器來連結庫了。
最後,回到第一句,如果以上提到的問題你的原始檔都解決了,你是可以由編譯器直接生成一個可執行檔案而無需連結器的。