当我尝试解决静态链接中的问题时,我在符号名称前面遇到了几个_GLOBAL__sub_I_
前缀。虽然我使用了nm --demangle(-C)
,但它仍以该格式显示。
我偶然发现了这个答案(How to find global static initializations)。看看我的源代码,它确实看起来像一个全局静态变量的初始化。
我想知道的是,哪里可以获得有关__sub_和其他受损名称的更多信息,例如__cxxabiv1
?
答案 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_cxx
和abi
。因此,我们正在寻找的标头"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>
所以看一下它们可能很有用。