сгенерированная g ++ сборка выглядит некрасиво - PullRequest
9 голосов
/ 20 июля 2009

Я хорошо знаком со сборкой gcc ... Недавно я был вынужден использовать g ++ для некоторой очистки кода. Позвольте мне упомянуть, что я очень хорошо знаком со сборкой, поэтому из любопытства я часто смотрю, насколько хорош компилятор, сгенерированный asm.

Но соглашения по именованию в g ++ просто причудливы. Мне было интересно, есть ли какие-либо рекомендации о том, как читать его вывод asm?

Большое спасибо.

Ответы [ 5 ]

24 голосов
/ 20 июля 2009

Я не нахожу g ++ "уродливым" или трудным для понимания, хотя я работаю с GCC уже более 8 лет.

В 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)
18 голосов
/ 20 июля 2009

С man g++:

-fverbose-asm
Поместите дополнительную информацию комментария в сгенерированный код сборки, чтобы сделать его более удобочитаемый. Этот параметр обычно используется только для тех, кому на самом деле нужно прочитать сгенерированный ассемблерный код (возможно, при отладке самого компилятора).

12 голосов
/ 20 июля 2009

Если вы смотрите на соглашение по присвоению имен для внешних символов, то это будет следовать соглашению по присвоению имен используемой вами платформы. Его можно изменить с помощью программы c++filt, которая даст вам удобочитаемую версию имен функций C ++, хотя они (по всей вероятности) больше не будут действительными символами компоновщика.

Если вы просто смотрите на ярлыки локальных функций, то вам не повезло. * Ассемблер g++ предназначен для общения с ассемблером и не предназначен для облегчения понимания человеком. Он будет генерировать набор относительно бессмысленных меток.

5 голосов
/ 20 июля 2009

Если код содержит отладочную информацию, objdump может обеспечить более полезную разборку:

-S, --source             Intermix source code with disassembly
-l, --line-numbers             Include line numbers and filenames in output
0 голосов
/ 21 февраля 2019

Для людей, которые работают над разборкой этих имен внутри программы (как я), надеюсь, эта ветка поможет.

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')
...