假设一个简单的文件bla.cpp:
struct MyClass {
virtual int foo(int x);
virtual ~MyClass();
};
int MyClass::foo(int x) { return x + 23; }
MyClass::~MyClass() {}
Run Code Online (Sandbox Code Playgroud)
用它构建一个共享库
g++ -c -fPIC bla.cpp
g++ -shared -o bla.so bla.o
Run Code Online (Sandbox Code Playgroud)
通常会包含一些type_info符号,因为默认情况下在gcc上启用了RTTI.但是,如果我建立
g++ -c -fPIC -fno-rtti bla.cpp
Run Code Online (Sandbox Code Playgroud)
在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
Run Code Online (Sandbox Code Playgroud)
如果你有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
Run Code Online (Sandbox Code Playgroud)
如果您没有任何虚拟功能,则无法分辨(也不应该关注).
| 归档时间: |
|
| 查看次数: |
1524 次 |
| 最近记录: |