gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:04:08 26 4
gpt4 key购买 nike

假设一个简单的文件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 将丢失。

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

最佳答案

如果一个类有virtual.功能,它应该有类型信息。执行 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

如果您没有任何虚函数,则无法判断(也不应该关心)。

关于c++ - 如何检查库是否使用 -fno-rtti 编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22150806/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com