Что означает "_GLOBAL__sub_I_" в выводе nm?

Пока я пытался решить проблему в статической привязке, я встречаю пару префиксов _GLOBAL__sub_I_ перед именами символов. Он появляется в этой форме, хотя я использовал nm --demangle(-C).

Я наткнулся на этот ответ (Как найти глобальные статические инициализации). Рассматривая исходный код, он действительно выглядит как инициализация глобальной статической переменной.

Что мне интересно, где я могу получить дополнительную информацию о __sub_ и других искаженных именах, например __cxxabiv1?

Ответ 1

Чтобы предотвратить гниение ссылок, я отвечу здесь, хотя именно Крис Бритт должен быть заслужен поиском информации в первую очередь (см. Комментарии к вопросу).

Если мы посмотрим на "Ссылку на файл cxxabi.h" (2013), то увидим, что заголовок определяет два пространства имен: __gnu_cxx и abi. Итак, этот заголовок, который мы ищем, "Ссылка на файл cxxabi.h" (2019) утверждает, что он был создан в 2009 году и практически идентичен, за исключением того, что упоминается только пространство имен abi.

Различие является поверхностным, сам код заголовка определяет пространство имен __cxxabiv1 а затем устанавливает namespace abi = __cxxabiv1; так что мы можем быть уверены, что этот заголовок все еще то, что мы ищем.

В заголовке объявлено следующее:

typedef __cxa_cdtor_return_type (*__cxa_cdtor_type)(void *);

int __cxxabiv1::__cxa_atexit (void(*)(void *), void *, void *) throw ();
void __cxxabiv1::__cxa_bad_cast ();
void __cxxabiv1::__cxa_bad_typeid ();
std::type_info * __cxxabiv1::__cxa_current_exception_type ();
char * __cxxabiv1::__cxa_demangle (const char *__mangled_name, char *__output_buffer, size_t *__length, int *__status);
int __cxxabiv1::__cxa_finalize (void *);
void __cxxabiv1::__cxa_guard_abort (__guard *);
int __cxxabiv1::__cxa_guard_acquire (__guard *);
void __cxxabiv1::__cxa_guard_release (__guard *);
void __cxxabiv1::__cxa_pure_virtual (void);
__cxa_vec_ctor_return_type __cxxabiv1::__cxa_vec_cctor (void *dest_array, void *src_array, size_t element_count, size_t element_size, __cxa_cdtor_return_type(*constructor)(void *, void *), __cxa_cdtor_type destructor);
void __cxxabiv1::__cxa_vec_cleanup (void *__array_address, size_t __element_count, size_t __element_size, __cxa_cdtor_type destructor);
__cxa_vec_ctor_return_type __cxxabiv1::__cxa_vec_ctor (void *__array_address, size_t __element_count, size_t __element_size, __cxa_cdtor_type constructor, __cxa_cdtor_type destructor);
void __cxxabiv1::__cxa_vec_delete (void *__array_address, size_t __element_size, size_t __padding_size, __cxa_cdtor_type destructor);
void __cxxabiv1::__cxa_vec_delete2 (void *__array_address, size_t __element_size, size_t __padding_size, __cxa_cdtor_type destructor, void(*__dealloc)(void *));
void __cxxabiv1::__cxa_vec_delete3 (void *__array_address, size_t __element_size, size_t __padding_size, __cxa_cdtor_type destructor, void(*__dealloc)(void *, size_t));
void __cxxabiv1::__cxa_vec_dtor (void *__array_address, size_t __element_count, size_t __element_size, __cxa_cdtor_type destructor);
void * __cxxabiv1::__cxa_vec_new (size_t __element_count, size_t __element_size, size_t __padding_size, __cxa_cdtor_type constructor, __cxa_cdtor_type destructor);
void * __cxxabiv1::__cxa_vec_new2 (size_t __element_count, size_t __element_size, size_t __padding_size, __cxa_cdtor_type constructor, __cxa_cdtor_type destructor, void *(*__alloc)(size_t), void(*__dealloc)(void *));
void * __cxxabiv1::__cxa_vec_new3 (size_t __element_count, size_t __element_size, size_t __padding_size, __cxa_cdtor_type constructor, __cxa_cdtor_type destructor, void *(*__alloc)(size_t), void(*__dealloc)(void *, size_t));
void * __cxxabiv1::__dynamic_cast (const void *__src_ptr, const __class_type_info *__src_type, const __class_type_info *__dst_type, ptrdiff_t __src2dst);

class __cxxabiv1::__fundamental_type_info : public std::type_info;
class __enum_type_info : public std::type_info;
class __pointer_type_info : public __pbase_type_info;
class __class_type_info : public std::type_info;
class __pointer_to_member_type_info : public __pbase_type_info;
class __base_class_type_info;
class __si_class_type_info : public __class_type_info;
class __vmi_class_type_info : public __class_type_info;

Заголовок также включает в себя:

#include <bits/cxxabi_tweaks.h>
#include <cxxabi-forced.h>

Так что может быть полезно взглянуть на них.