Нужна помощь в дизассемировании С++

Я занимаюсь дизассемблированием C++ с помощью IDA Pro. Но я часто вижу такие строки.

call    __ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc ;std::operator<<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,char  const*)

О чем эти глифы? Почему функция C++ выглядит такой сложной? И как мне упростить мой ASM. Заранее спасибо.


person jarCrack    schedule 09.05.2014    source источник
comment
Имя символа содержит информацию о типе возвращаемого значения, количестве параметров и типах функции. Это сделано для того, чтобы разрешить, среди прочего, перегрузку функций.   -  person    schedule 10.05.2014
comment
Options -> Demangled names -> [x] Names Это должно облегчить чтение.   -  person athre0z    schedule 14.05.2014


Ответы (2)


C++ гарантирует, что компоновщик сможет отличить перегруженные функции по искажению их имен. То, что вы видите, — это информация о типе, закодированная в искаженном имени функции.

person thus spake a.k.    schedule 09.05.2014

Это функция вывода для (например)

cout << "something";

std::operator<< — это имя функции. Он принимает аргумент std::basic_ostream<char, std::char_traits<char>>&, другими словами, std::ostream. Второй аргумент - это char const *, другими словами, классическая строка в стиле C, которая не должна изменяться.

Поскольку operator<< также возвращает std::ostream&, это кодируется перед именем

Это «сложно», потому что легче определить один, шаблонный, basic_ostream, поскольку существуют различные типы потоков, такие как owstream, который принимает «широкие символы», полезно иметь шаблонный basic_ostream, экземпляр которого можно создать для формирования std::ostream, чем для приходится реализовывать несколько разных, по сути, одних и тех же потоковых классов.

person Mats Petersson    schedule 09.05.2014