如何检查库是否使用 -fno-rtti 编译
How can I check if a library was compiled with -fno-rtti?
>假设一个简单的文件bla.cpp
:
struct MyClass {
virtual int foo(int x);
virtual ~MyClass();
};
int MyClass::foo(int x) { return x + 23; }
MyClass::~MyClass() {}
构建到共享库中
g++ -c -fPIC bla.cpp
g++ -shared -o bla.so bla.o
通常会包含一些type_info
符号,因为 RTTI 在 gcc 上默认启用。但是,如果我使用
g++ -c -fPIC -fno-rtti bla.cpp
type_info
将丢失。
有没有一种简单、可靠的方法(在gcc
或clang
)来检查库是用-fno-rtti
还是-frtti
构建的?我问是因为今天我盯着臭名昭著的undefined reference to type_info
,我花了一点时间才明白这是由我链接的图书馆引起的,反对用-fno-rtti
构建。
如果一个类有虚拟函数,它应该有类型信息。nm -C libname.so
并注意"vtable for","typeinfo for"和"typeinfo name for"。例:
00000000 b .bss
00000000 d .data
00000000 r .eh_frame
00000000 r .rdata$_ZTI3Foo
00000000 r .rdata$_ZTS3Foo
00000000 r .rdata$_ZTV3Foo
00000000 r .rdata$zzz
00000000 t .text
00000000 T Foo::foo()
00000000 R typeinfo for Foo
00000000 R typeinfo name for Foo
00000000 R vtable for Foo
U vtable for __cxxabiv1::__class_type_info
如果你有vtable
但没有typeinfo
,这是用-fno-rtti
编译的。例:
00000000 b .bss
00000000 d .data
00000000 r .eh_frame
00000000 r .rdata$_ZTV3Foo
00000000 r .rdata$zzz
00000000 t .text
00000000 T Foo::foo()
00000000 R vtable for Foo
如果你没有任何虚拟功能,你就无法分辨(也不应该关心)。
如果你需要这个进行配置,请像 GNU autoconf 那样做:编写一个最小的程序来执行检查并构建它。构建(或运行)是否失败会告诉您需要了解的内容。
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- g++:如果在 -O2 或 -O3 之前指定,-fno-omit-frame-pointer 是否有效
- clang, std::function and -fno-rtti
- 使用 RTTI(或返回类型标记的虚函数)是否正常
- 如何检查库是否使用 -fno-rtti 编译
- BOOST_NO_EXCEPTIONS是否可以保证与-fno -exceptions的兼容性
- -fno elide构造函数是否包含在-O0或任何其他优化级别中
- 当设置-fno-elide构造函数时,clang Xcode 4.4.1是否有错误
- 是否可以在 Boost 库中禁用异常和 RTTI
- 是否可以混淆RTTI数据
- "this"指针是否启用了 RTTI?
- RTTI和例外之间是否存在关系
- 编译时将fno-rtti-lib和rtti-lib合并
- 使用条带是否删除二进制文件上的RTTI信息
- 错误:无法将typeid与-fno rtti一起使用
- 在关闭RTTI的情况下增强简单类的序列化(-fno-rtti)
- 类型是否在最终二进制文件中公开?它们在符号文件和RTTI中可用吗?
- Visual Studio 如何将 boost::function 与 /GR- 一起使用,而 GCC 不能使用 -fno-rtti?
- 使用-fno-rtti编译的共享库中的子类