четвер, 12 листопада 2015 р.

libcxxrt в ролі libsupc++ -- бібліотеки підтримки мовних засобів часу виконання


Клікабельно. :-)
Розглядаючи підтримку С++ на "голому залізі", в попередньому пості, ми орієнтувалися на штатні засоби --- мінімальний набір із libsupc++, яка підтримує синтаксичні засоби мови (зокрема, виключення та RTTI) та повну libstdc++, що дозволяє, принаймні -- в теорії, користуватися всіма засобами стандартної бібліотеки мови. Однак, і одна і друга страждають певною громіздкістю, тому іноді хотілося б мати більш компактну альтернативу, навіть якщо її можливості будуть дещо урізаними. В ролі альтернативи до libsupc++ часто пропонують libcxxrt, для повної бібліотеки можна подивитися на uClibc++.

Почнемо із розгляду libcxxrt. Вона прийшла із світу FreeBSD/x86, потім модифікувалася і для інших платформ. Потребує окрему бібліотеку розкрутки стеку, в ролі якої підходять як libgcc_s так і libunwind (якщо просто --- одна із них мала б бути з GCC, детальніше -- див. попередні пости або тут чи тут). Крім того, вона, все ж, розрахована на великі системи, де не потрібно економити кожен кілобайт, що проявляється в коді.

Зразу скажу, добитися повної функціональності мені поки не вдалося. Даний пост -- класичний Quick and Dirty опис способу почати працювати з бібліотекою, містить ряд доволі примітивних заглушок та не до кінця продуманих рішень. 

При тому, завдяки своїй простоті (відносній), бібліотека виявилася неоціненим джерелом подробиць про роботу C++ runtime, допомігши розібратися в нюансах для попереднього поста. У свою чергу, цінні підказки по перенесенню libcxxrt знайдено тут: "C++ Exception Support".

Попередивши, можна починати. Розгляд проводиться на прикладі все тієї ж STM32VLDiscovery, але для інших мікроконтролерів сімейства особливих відмінностей (крім доступного розміру RAM) бути не мало б.