如何检查库是否使用-fno-rtti编译?

pmr*_*pmr 3 c++ linker rtti

假设一个简单的文件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.

n. *_* m. 5

如果一个类有虚拟.函数,它应该有类型信息.请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)

如果您没有任何虚拟功能,则无法分辨(也不应该关注).