簡體   English   中英

g ++生成的程序集看起來很難看

[英]g++ generated Assembly looks ugly

我對gcc程序集非常熟悉...最近我被迫使用g ++進行代碼清理。 讓我提一下我對匯編非常熟悉,因此出於好奇,我經常看看編譯器生成的asm有多好。

但是使用g ++的命名約定只是奇怪的。 我想知道是否有關於如何讀取其asm輸出的指南?

非常感謝。

雖然我已經和GCC合作了8年多,但我並沒有發現g ++的'丑陋'或者難以理解。

在Linux上,函數標簽通常是_ZN,“_ ZN”前綴是指定C ++名稱修改(而不是C)的標記,后跟函數所屬的命名空間,然后是函數名稱和參數類型,然后是模板(如果有的話)。

例:

// tests::vec4::testEquality()
    _ZN5tests4vec412testEqualityEv

    _ZN - C++ mangling, 'N' for member (_ZZ for const or others)
    5tests - length (5 chars) + name
    4vec4 -length (4 chars) + sub namespace
    12testEquality - length (12 chars) + function name
    Ev - void argument (none)

來自man g++

-fverbose-ASM
在生成的匯編代碼中添加額外的注釋信息,以使其更具可讀性。 此選項通常僅用於那些實際需要讀取生成的匯編代碼的人(可能在調試編譯器本身時)。

如果您正在查看外部符號的命名約定,那么這將遵循您正在使用的平台的名稱修改約定。 它可以通過c++filt程序反轉,它將為您提供C ++函數名的人類可讀版本,盡管它們(很可能)將不再是有效的鏈接器符號。

如果您只是查看本地功能標簽,那么您運氣不好。 g++的匯編程序輸出用於與匯編程序進行通信,而不是為了便於人類理解而設計。 它會產生一組相對無意義的標簽。

如果代碼有調試信息, objdump可以提供更有用的反匯編:

-S, --source             Intermix source code with disassembly
-l, --line-numbers             Include line numbers and filenames in output

對於那些正在解決程序內部名稱的人(比如我),希望這個帖子有所幫助。

def demangle(name):
    import subprocess as sp
    stdout, _ = sp.Popen(['c++filt', name], 
                         stdin=sp.PIPE, stdout=sp.PIPE).communicate()
    return stdout.split("\n")[0]

print demangle('_ZNSt15basic_stringbufIcSt11char_traitsIcESaIcEE17_M_stringbuf_initESt13_Ios_Openmode')

暫無
暫無

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

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