我想调查一下如何在不使用libstdc ++的情况下链接C ++程序,但支持rtti。 我试图按照下面描述的方式进行编译。 任何必要但缺席的符号,我可以在例子中定义像函数strcmp,但是有没有可能定义typeinfo符号没有明确的mangle / demangle魔术? 如果可能的话如何?
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'中:
“ABI-volatile”寄存器在函数调用中被视为非易失性
windows和ABI兼容性
windows x64 ABI。 deBUGging器如何显示传递给函数的参数
arm版本之间的区别?(仅适用于ARMv7)
在x86-64调用约定中返回值
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 ++来定义'charinfotypes信息'(_ ZTIc @@ CXXABI_1.3)呢?
PS。 不要问我为什么需要它。 只是一个好奇心。
G ++ ABI兼容性列表
使用Boost向后兼容ABI创build库
每个cpu arch真正的ELF TLS ABI要求是什么?
ELF生成使用libelf提示
64位系统的整数大小差异(与旧的32位PC系统混淆)
由于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++有任何动态的依赖关系,只有实际需要的符号被引入到您的可执行文件中。 (好吧,包含所需符号的目标文件中的所有符号,例如,我想是基本类型信息。)
感谢gcc社区的提示。
答案是:
“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); }
在编译期间,所有的基本类型都被插入到目标文件中。
$g++ -c ./rtti.cc;readelf -sW ./rtti.o |c++filt|grep typeinfo|wc -l
$153
所以这个问题就回答了。
总结以上是内存溢出为你收集整理的没有libstdc ++的C ++ RTTI。 可能吗?全部内容,希望文章能够帮你解决没有libstdc ++的C ++ RTTI。 可能吗?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)