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

时间:2015-07-29 04:33:52

标签: c++ name-mangling nm

当我尝试解决静态链接中的问题时,我在符号名称前面遇到了几个_GLOBAL__sub_I_前缀。虽然我使用了nm --demangle(-C),但它仍以该格式显示。

我偶然发现了这个答案(How to find global static initializations)。看看我的源代码,它确实看起来像一个全局静态变量的初始化。

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

2 个答案:

答案 0 :(得分:1)

我的符号中有一个 _GLOBAL__sub_I_ 前缀,我需要去掉它。

然后发现:https://llvm.org/docs/FAQ.html

<块引用>

当我 llvm.global_ctors 时发生的 _GLOBAL__I_a...#include <iostream> 是什么?

<块引用>

如果将 <iostream> 标头 #include 到 C++ 翻译单元中,该文件可能会使用 std::cin/std::cout/… 全局对象。但是,C++ 不保证不同翻译单元中静态对象之间的初始化顺序,因此,例如,如果 .cpp 文件中的静态 ctor/dtor 使用 std::cout,则该对象不一定会在使用前自动初始化.

<块引用>

为了使 std::cout 和朋友在这些场景中正常工作,我们使用的 STL 声明了一个静态对象,该对象在每个包含 <iostream> 的翻译单元中创建。该对象有一个静态构造函数和析构函数,用于在全局 iostream 对象可能在文件中使用之前初始化和销毁​​它们。您在 .ll 文件中看到的代码对应于构造函数和析构函数的注册代码。

我将我的函数移到没有 <fstream> 的翻译单元中,现在导出的符号没有 _GLOBAL__sub_I_

答案 1 :(得分:0)

为了防止链接腐烂,我将在这里回答,尽管首先应该由Chris Britt查找信息(请参阅问题注释)。

如果我们查看"cxxabi.h File Reference" (2013),则会看到标题定义了两个名称空间:__gnu_cxxabi。因此,我们正在寻找的标头"cxxabi.h File Reference" (2019)声明该标头是2009年生成的,并且几乎相同,不同之处在于仅提到了abi命名空间。

区别是肤浅的,header code itself定义了命名空间__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>

所以看一下它们可能很有用。