没有libstdc ++的C ++ RTTI。可能吗?

时间:2013-06-17 07:08:20

标签: c++ linux rtti libstdc++ abi

我想研究如何在没有libstdc ++的情况下链接C ++程序,但支持rtti。我试着按照下面描述的方式编译它。我可以像示例中的函数strcmp一样定义任何必要但不存在的符号,但是可以定义没有显式mangle / demangle魔法的typeinfo符号吗?如果可能的话怎么样?

cd /tmp && cat << 'eof' >rtti.cpp && g++ -nodefaultlibs -lc rtti.cpp

extern "C" int strcmp(const char *s1, const char *s2) { return 0; };
#include "typeinfo"

int main(){
    return typeid(int) == typeid(char);
}

Linker说:

/tmp/cc6rBAef.o:在函数`main'中:

rtti.cpp:(.text+0x18): undefined reference to `typeinfo for char'
rtti.cpp:(.text+0x1d): undefined reference to `typeinfo for int'
collect2: error: ld returned 1 exit status

那么,如何使用g ++或clang ++在源文件中定义'typeinfo of char'(_ ZTIc @@ CXXABI_1.3)?

PS。不要问我为什么需要它。只是好奇心。

2 个答案:

答案 0 :(得分:4)

由于RTTI所需的符号似乎位于libstdc++库中,因此如果没有它,则无法完全执行。{p>请注意,我通过运行

找到了这个
readelf -Ws `g++ -print-file-name=libstdc++.so` | awk '{print $8}' | c++filt | grep 'typeinfo for'

所做的事情与libstdc++静态链接:

g++ -static-libstdc++ rtti.cpp

通过这种方式,您将不会在libstdc++上拥有任何动态依赖关系,并且只有实际需要的符号会被提取到您的可执行文件中。 (好吧,我想,在你的例子中,包含所需符号的目标文件中的所有符号fundamental_type_info.o。)

答案 1 :(得分:2)

感谢gcc community提示。

答案是:

“gcc使用一些魔法将__fundamental_type_info的析构函数替换为一组typeinfo符号”

替换代码放在档案中:gcc-4.7.2 / gcc / cp / rtti.c,void emit_support_tinfos(void);

rtti.cc:

#include <typeinfo>
namespace __cxxabiv1 {
class __fundamental_type_info:public std::type_info{
public:
     explicit __fundamental_type_info(const char* __n) : std::type_info(_n) { } 
     virtual ~__fundamental_type_info(){}; 
};
}
int main(){
    return typeid(int) == typeid(char);
}

在编译期间,所有基本的typeinfos都会插入到目标文件中。

$g++ -c ./rtti.cc;readelf -sW ./rtti.o |c++filt|grep typeinfo|wc -l

$153

所以问题得到了回答。