
請理解我正在使用 Autotools / Automake / Autoconf,並且我無法使用重定向因為它需要在autotools產生的make檔案中逐個命令地應用。
我需要一種方法讓自動工具建立一個 make 文件,其中包含產生和保存與每個相關的編譯器和/或彙編器清單的規定個人原始碼在包包裡。
我的第一次嘗試是將“-Wa,-acdhln -g”添加到 CCFLAGS 中。這確實產生了複合 c/彙編程序列表,但它去了航廈,不進入文件。如果我捕獲 make 輸出(使用重定向),我將得到 47 個不同的列表以及散佈的建置命令。
我希望發生的事情,樂觀地閱讀 GCC 文檔總體選項 - 使用 GNU 編譯器集合,
-o file
將輸出放置在檔案 file 中。這適用於產生的任何類型的輸出,無論是可執行檔案、目標檔案、彙編程式檔案或預處理的 C 程式碼。如果不指定-o,則預設將執行檔放在a.out中,source.suffix的目標檔放在source.o中,其組譯器檔案放在source.s中,預編譯頭檔放在source .suffix.gch中,以及標準輸出上的所有預處理 C 原始碼。
用於顯示檔案 {file}.o 和 {file}.s,基於 GCC 命令列中的「-o {file}.o」。
所發生的情況是,程序集清單顯然已傳送到標準輸出。
編輯新增 2016 年 10 月 23 日。我想要捕獲的彙編器清單檔案也不會。
這也適用於使用 -save-temps 選項;它只會保存彙編器的輸出,也就是連結器輸入文件,而不是彙編器清單檔案。
該文件的另一種解釋可能意味著每個輸出檔案都將放置在 -o 操作數中指定的單一檔案中,或混合在一起,或與最後建立的檔案覆蓋先前建立的檔案。 (例如,編譯器通道的輸出覆蓋了彙編器通道的輸出,再覆蓋了集合通道的輸出。)
由於這似乎適得其反,我假設 GCC(頂級執行程式)可能足夠聰明調整不同通道的檔案名稱。這似乎不是真的。從「-o」省略檔名似乎正是我們想要的,只是目標檔總是命名為「a.out」而不是「{source}.o」。為什麼選擇來源輸出名稱常數對我來說毫無意義,但每次 GCC 呼叫後的重命名步驟可能會將“a.out”更改為“{source}.o”。
諮詢GNU 彙編器文檔關於 -o 的說明更少,並且沒有處理輸出列表的選項。彙編器版本 tigcc 記錄了該清單作為標準輸出發出。
Unix 的 GNU 和 GNU 構建標準修訂版沒有解決這個問題嗎?
(我是瘋了,還是我只是活在一個叫做 Unix 的非現實中???)
所以現在看起來 Make 需要告訴 GCC 當執行彙編步驟時,標準輸出應該放在[電子郵件受保護]文件。考慮到 GCC 選項的行為方式(以及快速查看規範文件的使用方式),我懷疑這是無法完成的。也許 Automake(或 libtools?)可以創建多步驟編譯操作,分離出各個步驟,以便捕獲彙編輸出。
但,由於make檔案是由autotools產生的,我需要一種方法告訴 autotools 建立 make 文件這將建立/捕獲程序集輸出檔案。這項任務似乎需要重寫一些 autoconf/automake 規則和/或巨集。
最後,我正在使用其他人使用自動工具創建的包,打包並下載給我。我沒有進行自動工具打包,也沒有創建巨大的 *.ac 文件,而且我不想破解它們,如果可以避免的話。
我只需要獲取一些程序集和鏈接映射來嘗試調試包的問題。
答案1
我最終崩潰並編寫了一個真實的程式來分析捕獲的終端輸出並提取列表檔案。雖然它適用於我的特定係統/建置配置/包,但我只能將其作為範例提供。它當然不是一個易於使用的工具。
抱歉,這確實不是克服自動工具缺點的一般答案。