Не удается собрать старый libstdc++.so.6 (gcc-5 на arm-glibc-2.13) с включенными символами версии (что приводит к libstdc++.so.6: информация о версии отсутствует)
Мне нужно запустить приложение (или собрать
dotnet5
из источника), чтобы быть совместимым с
arm
машины с очень старыми
glibc
(начиная с , обновление невозможно, так как это полувстроенные системы).
Целевые машины поставляются на основе
gcc <5.1
и поэтому не поддерживает необходимый C++11 ABI.
Первое решение состояло в том, чтобы «просто» получить двоичный файл руки.
libstdc++.so.6.0.21
откуда-то и пытается запустить приложение с его помощью (через
LD_LIBRARY_PATH
). Это почти сработало, но это зависело от
glibc-2.16
.
Следующее решение: построить
gcc >=5.1
(включая ) из источника в моем
debian-wheezy-armhf
контейнер, в основе которого
glibc-2.13
. Это работает довольно хорошо, хотя мне приходится форсировать некоторые вещи, потому что
gcc
процесс сборки на некоторых этапах, кажется, считает, что это перекрестная сборка (но не на самом деле?), получая такие ошибки: не могу найти биты/predefs.h и ошибки hard- vs. soft-float. Они были решены путем создания такой сборки (
Makefile
правило, выполняемое в контейнере сборки):
C_INCLUDE_PATH=/usr/include:/usr/include/$$(gcc -print-multiarch); \
CPATH=/usr/include:/usr/include/$$(gcc -print-multiarch); \
LIBRARY_PATH=/usr/lib:/usr/lib/$$(gcc -print-multiarch); \
CFLAGS="-mfloat-abi=hard"; \
CXXFLAGS="-mfloat-abi=hard"; \
LDFLAGS="-mfloat-abi=hard"; \
export LIBRARY_PATH C_INCLUDE_PATH CPATH CFLAGS CXXFLAGS LDFLAGS; \
../gcc-5.5.0/configure --enable-languages=c,c++ --enable-shared=libgcc,libstdc++ `#--build=$$(gcc -print-multiarch)` --disable-multilib --disable-bootstrap --prefix=/build/install \
&& make -j24 && make install
... но в результате
libstdc++
не содержит символов версии:
> objdump -p .build/arm-glibc2.13/install/lib/libstdc++.so.6.0.21 | grep GLIBCXX
# nothing
/build/gcc-5.5.0-build/armv7l-unknown-linux-gnueabihf/libstdc++-v3/config.log
показывает:
configure:78121: WARNING: === You have requested GNU symbol versioning, but
configure:78123: WARNING: === you are not building a shared libgcc_s.
configure:78125: WARNING: === Symbol versioning will be disabled.
так что видимо причина. Но почему я не создаю общий
libgcc_s
? Даже с
--enable-shared=libgcc,libstdc++
(что в любом случае должно быть по умолчанию) это не работает...
Любые идеи?