'_GLOBAL__sub_I_'在nm输出中的含义是什么?

Cre*_*gle 13 c++ name-mangling nm

当我试图解决静态链接中的问题时,我_GLOBAL__sub_I_在符号名称前面遇到了几个前缀.尽管我使用过,它仍然以那种形式出现nm --demangle(-C).

我偶然发现了这个答案(如何找到全局静态初始化).看看我的源代码,它确实看起来像一个全局静态变量的初始化.

我想知道的是,我在哪里可以获得有关__sub_和其他受损名称的更多信息__cxxabiv1

v01*_*dya 0

为了防止链接失效,我将在这里回答,尽管克里斯·布里特应该首先找到这些信息(请参阅对该问题的评论)。

如果我们查看“cxxabi.h 文件参考”(2013),我们会看到标头定义了两个命名空间:__gnu_cxxabi。因此,这就是我们正在寻找的标头“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;
Run Code Online (Sandbox Code Playgroud)

标头还包括:

#include <bits/cxxabi_tweaks.h>
#include <cxxabi-forced.h>
Run Code Online (Sandbox Code Playgroud)

因此,了解一下它们可能会有用。