linux — C ++ RTTI без libstdc ++. Является ли это возможным?

Я хочу исследовать, как можно связать программу на C ++ без libstdc ++, но с поддержкой 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);
}

Линкер говорит:

/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

Итак, как я могу определить ‘typeinfo of char’ (_ ZTIc @@ CXXABI_1.3) в исходном файле, используя g ++ или clang ++?

PS. Не спрашивайте меня, зачем мне это нужно. Просто любопытство.

4

Решение

Поскольку символы, необходимые для 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 в вашем примере, я полагаю.)

4

Другие решения

Благодаря сообщество 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);
}

Все основные typeinfos вставляются в объектный файл во время компиляции.

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

$153

Так что на вопрос дан ответ.

2

По вопросам рекламы [email protected]