没有libstdc的C RTTI.可能吗?

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

cd / tmp&&猫<< '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.不要问我为什么需要它.只是好奇心.

解决方法:

由于RTTI所需的符号似乎位于libstdc库中,因此如果没有它,则无法完全执行.请注意,我通过运行找到了这个

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.)

上一篇:android studio cmake 设置编译so的平台


下一篇:UCGUI分析视窗管理器初始化和重绘过程