我想研究如何在没有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.)