簡體   English   中英

為什么我的C++程序的匯編output全是.ascii,沒有匯編代碼?

[英]Why is my C++ program's assembly output full of .ascii with no assembly code?

I am compiling a C++ file into a static library with CMake and I am modifying the Makefile that CMake generates by adding the -S -fverbose-asm flags to the gcc command to get the assembly output, however the resulting.cpp.s file is用看起來像十六進制數據的 .ascii 行填充,並且不包含匯編指令,如下所示:

.ascii  "\346+\274\004@\226\032!n\247<)\212\264\205\377*\204\275\364e"
.ascii  "\314\026\270vi\263\373\327\n\367$\332\035\364N\212\316\254\324"

有誰知道可能是什么原因造成的,以及如何獲得清晰的組裝說明?

gcc 版本:5.4.0

您可能在啟用鏈接時間優化 ( gcc -flto ) 的情況下進行編譯,這使得“胖” object 文件還包含 GCC 的程序邏輯中間表示以及常規 asm。 (因此整個程序優化可以在鏈接時進行,允許跨源文件內聯以及在只有原型可見時不可能進行的進一步優化。)或者,如果您與不知道 LTO 的 linker 鏈接,它將忽略 LTO 部分,只使用常規的機器代碼部分。

https://gcc.gnu.org/onlinedocs/gccint/LTO-Overview.html

GCC 使用帶有八進制轉義的.ascii作為一種稍微緊湊的(在 asm 源中)以匯編程序不知道的格式(GIMPLE 字節碼)發出原始二進制文件的方式。

另一種方法是.byte 12,34,...即每個 output 字節 2 到 4 個源字節,類似於帶有八進制的 ASCII,它給出 1 到 4。(1 表示可打印 ASCII 范圍內的任何字節)。

.long 0xabcd220c, 0x....quad將接近每個 output 字節的 2 個 asm 源字節。

這種效率考慮僅適用於 GCC 將提供給as.s臨時文件; .o中,數據將是二進制的(在具有特殊名稱的目標文件部分中)。 GCC 想要一種在 GCC 中可以快速序列化的格式,並且可以讓匯編器快速解析並轉換回字節。 大概.ascii的雙引號字符串使解析變得簡單。

暫無
暫無

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

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