Я создал собственный компилятор для aarch64.Построено было успешно.У меня проблемы, хотя, указав библиотеку glibc (libc.so
) для ссылки.Я следовал предложению в этой ссылке о компиляции с несколькими glibc, но он не работает.
Среда:
ARM 64-битный компьютер.
Набор инструментов в toolchain_dir/bin/aarch64-linux-g++
.
Каталог sysroot в toolchain/sysroot/lib
, который содержит библиотеку lib.библиотеки so.6 (glibc 2.25) и libstdc ++. so (6.0.22), а также компоновщик ld-linux-aarch64.so.1
.
Каталог /lib64
содержит libc.so.6 (glibc 2.17) и libstdc ++. so (6.0.19), старые версии.
Что я пробовал:
Я пытался скомпилировать простую программу как:
$aarch-64-linux-g++ file.cpp -o out \
-L/home/user/toolchain/sysroot/lib -lc -lstdc++ \
-Wl,--rpath=/home/user/toolchain/sysroot/lib \
-Wl,--dynamic-link=/home/user/toolchain/sysroot/lib/ld-linux-aarch64.so.1
Но я получаю ошибку "/lib64/libstdc++.so.6: version GLIBCXX_3.4.20 not found"
.Ошибка обнаруживает, что rpath
не работает, так как по-прежнему ищет библиотеку /lib64
вместо toolchain/sysroot/lib
, которая содержит GLIBCXX_3.4.20 (libstdc ++. So.6).
Затем я переместил toolchain/sysroot/lib/libstdc++.so.6
в /lib64
и снова скомпилировал с помощью той же команды, приведенной выше, теперь получаю ошибку: "/lib64/libstdc++.so.6 version GLIBC_2.18 not defined"
.Ошибка показывает, что новая встроенная библиотека libstdc ++. So.6 пытается найти новую встроенную версию glibc-2.25, но не может выполнить поиск по неправильному пути к каталогу в /lib64
.
ДалееЯ установил LD_LIBRARY_PATH=/home/user/toolchain/sysroot/lib
.Но сразу после установки этой переменной я получаю ошибки сегментации.
У вас есть идеи, почему это происходит?Как я мог решить эту проблему?Спасибо!
Редактировать: Ниже приведена дополнительная информация от компилятора, для g ++ -v удалена часть вывода, так как она действительно длинная:
$aarch64-unknown-linux-gnueabi-g++ -v
Target: aarch64-unknown-linux-gnueabi
Configured with: --build=x86_64-build_pc-linux-gnu --host=aarch64-host_unknown-linux-gnueabi --target=aarch64-unknown-linux-gnueabi --enable-gold --disable-nls --disable-multilib --with-local-prefix=/home/common/userX/x-tools/HOST-aarch64-unknown-linux-gnueabi/aarch64-unknown-linux-gnueabi/aarch64-unknown-linux-gnueabi/sysroot --enable-long-long
gcc version 6.3.1 20170109 (crosstool-NG crosstool-ng-1.23.0)
$file aarch64-unknown-linux-gnueabi-g++
ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 4.10.8, stripped