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

时间:2014-03-03 15:34:11

标签: c++ linker 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符号,因为默认情况下在gcc上启用了RTTI。但是,如果我用

构建
g++ -c -fPIC -fno-rtti bla.cpp

type_info将丢失。

是否有一种简单,可靠的方法(在gccclang上)检查是否已使用-fno-rtti-frtti构建了库?我问,因为今天我盯着臭名昭着的undefined reference to type_info,我花了一点时间才明白,这是由于我正在链接而不是用-fno-rtti构建的库。

2 个答案:

答案 0 :(得分: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

如果您有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

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

答案 1 :(得分:3)

如果你需要这个来进行配置,那就像GNU autoconf一样:编写一个最小的proggie进行检查并构建那个。构建(或者可能是运行)是否失败告诉您需要知道什么。