LINUX.ORG.RU

Сборка gcc-5.3.0, glibc-2.23 из сырцов

 ,


0

5

Здравствуйте! Проблема заключается в том, что я вроде бы верно скомпилировал и установил все в /opt, однако линкер ругается на то, что не находит GLIBC_2.17, которая должна присутствовать исходя из версии компилятора и glibc.

Вот что выдает команда

strings /opt/Compiler/lib64/libstdc++.so.6 | grep GLIBC

GLIBCXX_3.4

GLIBCXX_3.4.1

GLIBCXX_3.4.2

GLIBCXX_3.4.3

GLIBCXX_3.4.4

GLIBCXX_3.4.5

GLIBCXX_3.4.6

GLIBCXX_3.4.7

GLIBCXX_3.4.8

GLIBCXX_3.4.9

GLIBCXX_3.4.10

GLIBCXX_3.4.11

GLIBCXX_3.4.12

GLIBCXX_3.4.13

GLIBCXX_3.4.14

GLIBCXX_3.4.15

GLIBCXX_3.4.16

GLIBCXX_3.4.17

GLIBCXX_3.4.18

GLIBCXX_3.4.19

GLIBCXX_3.4.20

GLIBCXX_3.4.21

GLIBC_2.3

GLIBC_2.2.5

GLIBC_2.3.2

GLIBCXX_DEBUG_MESSAGE_LENGTH

Никакого GLIBC_2.17 нет и в помине... Может быть я ошибся где то в сборке? Это первый раз для меня. Прилагаю этапы сборки -

  • binutils (фаза 1)
  • gcc (фаза 1)
    • wget -c http://ftp.gnu.org/gnu/gcc/gcc-5.3.0/gcc-5.3.0.tar.gz
    • tar xzf gcc-5.3.0.tar.gz
    • cd gcc-5.3.0
    • ./contrib/download_prerequisites
    • mkdir -v build
    • cd build
    • ../configure --prefix=/opt/Compiler --enable-languages=c,c++ --disable-multilib
    • make
    • make install
    • cd /root/distr
  • glibc
  • libstdc++-v3
    • Является частью тарболла gcc, поэтому cd gcc-5.3.0/libstdc++-v3
    • mkdir -v build
    • cd build
    • ../configure --prefix=/opt/Compiler
    • make all
    • make install
    • cd /root/distr
  • binutils (фаза 2)
    • cd binutils-2.26.1
    • mkdir -v build2
    • cd build2
    • ../configure --prefix=/opt/Compiler/
    • make all
    • make install
    • cd /root/distr
  • gcc (фаза 2)
    • cd gcc-5.3.0
    • mkdir -v build2
    • cd build2
    • ../configure --prefix=/opt/Compiler --enable-languages=c,c++ --disable-multilib
    • make all
    • make install
    • cd /root/distr

    Помогите, знатоки, пожалуйста!

Во-первых оформите, пожалуйста, по-нормальному - читать сложно, во-вторых где непосредственно запуск и текст ошибки?

alexanius ★★ ()
Ответ на: комментарий от alexanius

Начал исправлять - пока отвечу Вам!

make

c++ -o VIT VIT.o -L/root/distr/FOR_REG/lib -lBo -lVodi -lVodiUTILS -lVodiHASP -Wl,--rpath=/opt/Compiler/lib -Wl,--rpath=/opt/Compiler/lib64 -Wl,--dynamic-linker=/opt/Compiler/lib/ld-linux.so.2

  • /opt/Compiler/lib/libpthread.so.0: undefined reference to `__tdelete@GLIBC_PRIVATE'
  • /opt/Compiler/lib/libpthread.so.0: undefined reference to `__libc_vfork@GLIBC_PRIVATE'
  • /opt/Compiler/lib/libpthread.so.0: undefined reference to `__mktemp@GLIBC_PRIVATE'
  • /opt/Compiler/lib/libpthread.so.0: undefined reference to `__madvise@GLIBC_PRIVATE'
  • /opt/Compiler/lib/libpthread.so.0: undefined reference to `__getrlimit@GLIBC_PRIVATE'
  • /root/distr/FOR_REG/lib/libBo.so: undefined reference to `memcpy@GLIBC_2.14'
  • /opt/Compiler/lib/libpthread.so.0: undefined reference to `__tfind@GLIBC_PRIVATE'
  • /opt/Compiler/lib/libpthread.so.0: undefined reference to `__h_errno@GLIBC_PRIVATE'
  • /opt/Compiler/lib/libpthread.so.0: undefined reference to `__twalk@GLIBC_PRIVATE'
  • /opt/Compiler/lib/libpthread.so.0: undefined reference to `__ctype_init@GLIBC_PRIVATE'
  • /opt/Compiler/lib/libpthread.so.0: undefined reference to `__call_tls_dtors@GLIBC_PRIVATE'
  • /opt/Compiler/lib/libpthread.so.0: undefined reference to `__tsearch@GLIBC_PRIVATE'
  • /root/distr/FOR_REG/lib/libVodiUTILS.so: undefined reference to `clock_gettime@GLIBC_2.17' collect2: error: ld returned 1 exit status
ArthurKhairullin ()
Ответ на: комментарий от ArthurKhairullin

Пока в глаза бросаются эти пути: /opt/Compiler/lib/ и /root/distr/FOR_REG/lib/. Очень похоже что библиотека по второму пути была собрана с другой glibc и ищет функции в ней. А собранный компилятор ссылается на на собранную по первому пути.

Что с pthread'ом не так пока не пойму. А можно ещё вывод компилятора с добавленной опцией -v?

alexanius ★★ ()
Ответ на: комментарий от alexanius

Я завтра утром скину вывод , хорошо ? Зайдёте ?

По поводу путей , все верно , те что в /root/distr это либы стороннего вендора, собраны с Glibc_2.17. По умолчанию ищут в системных путях , но думаю , указав свой собранный загрузчик , либо через ld_preload можно его обмануть. Проблема в том , что собираемая мной версия glibc (которая в opt)должна включать Glibc_2.17, но почему то не включает . Причём не включает много ещё что ... если вы выполните команду strings над своей Libstdc ( из репозитория установленная ), то увидите большую разницу (((

ArthurKhairullin ()
Ответ на: комментарий от anonymous

Это как то автоматизирует процесс сборки сразу всей цепочки ? Я просто этот вариант сборки видел ,но решил все как то по старому

ArthurKhairullin ()
Ответ на: комментарий от alexanius

Вот вывод собранного gcc

/opt/Compiler/bin/gcc -v Using built-in specs. COLLECT_GCC=/opt/Compiler/bin/gcc COLLECT_LTO_WRAPPER=/opt/Compiler/libexec/gcc/x86_64-unknown-linux-gnu/5.3.0/lto-wrapper Target: x86_64-unknown-linux-gnu Configured with: ../configure --prefix=/opt/Compiler --enable-languages=c,c++ --disable-multilib Thread model: posix gcc version 5.3.0 (GCC)

Вот вывод системного gcc

Using built-in specs. Target: x86_64-redhat-linux Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux Thread model: posix gcc version 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC)

ArthurKhairullin ()
Ответ на: комментарий от anonymous

Собрал crosstool-ng

Теперь GLIBC_2.17 есть в libstdc++6. Собираю простейшую программу собранным c++

PATH := /home/crosstooler/x-tools/x86_64-unknown-linux-gnu/bin:$(PATH)

simple: simple.o

x86_64-unknown-linux-gnu-c++ -o simple simple.o -Wl,--rpath=/home/crosstooler/x-tools/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/sysroot/lib -Wl,--dynamic-linker=/home/crosstooler/x-tools/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu-gcc/lib/ld-linux-x86-64.so.2

simple.o: simple.cpp

x86_64-unknown-linux-gnu-c++ --std=c++11 -O2 -c simple.cpp

clean: rm -rf *.o simple

Успешно собирается, но вот при запуске ругается так -

/home/crosstooler/x-tools/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/sysroot/lib/ld-linux-x86-64.so.2 simple

simple: error while loading shared libraries: simple: cannot open shared object file

Вот что выдает команда strace

strace /home/crosstooler/x-tools/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/sysroot/lib/ld-linux-x86-64.so.2 simple

execve(«/home/crosstooler/x-tools/x86_64-unknown-linux-gnu/x86_64-unknown-linux-gnu/sysroot/lib/ld-linux-x86-64.so.2», [«/home/crosstooler/x-tools/x86_64»..., «simple»], [/* 24 vars */]) = 0

brk(0) = 0x5631ac38d000

open(«/etc/ld.so.cache», O_RDONLY|O_CLOEXEC) = 3

fstat(3, {st_mode=S_IFREG|0644, st_size=18103, ...}) = 0

mmap(NULL, 18103, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7faec8d1c000

close(3) = 0

writev(2, [{«simple», 6}, {": ", 2}, {«error while loading shared libra»..., 36}, {": ", 2}, {«simple», 6}, {": ", 2}, {«cannot open shared object file», 30}, {"", 0}, {"", 0}, {«\n», 1}], 10simple: error while loading shared libraries: simple: cannot open shared object file

) = 85

exit_group(127) = ?

+++ exited with 127 +++

Есть какие - нибудь варианты ?:(

ArthurKhairullin ()

Извиняюсь, вчера никак не сомг ответить. В общем такое предложение - попробуйте сделать всё как здесь, с поправкой на свою архитектуру, а потом расскажите о результатах (особое внимание опциям сборки).

alexanius ★★ ()
Ответ на: комментарий от alexanius

Спасибо за помощь! я собрал crosstool-ng и с помощью него все получилось!

mkdir /opt/Crosstool
chown -R crosstooler:crosstooler /opt/Crosstool/
useradd crosstooler
passwd crosstooler
yum install gperf help2man patch libtool ncurses-devel python-devel
su - crosstooler
wget -c http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.22.0.tar.bz2
gpg --recv-keys 35B871D1
gpg --recv-keys 35B871D1(именно дважды)
wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.22.0.tar.bz2.sig
tar xjf crosstool-ng-1.22.0.tar.bz2
cd /home/crosstooler/crosstool-ng/
./configure --prefix=/opt/Crosstool/
make
make install
export PATH=$PATH:/opt/Crosstool/bin/
mkdir /home/crosstooler/crosstool-ng/build
cd /home/crosstooler/crosstool-ng/build
ct-ng help
ct-ng list-samples
ct-ng show-x86_64-unknown-linux-gnu
ct-ng x86_64-unknown-linux-gnu
поправить .config и .config.2 - static=n
ct-ng build
exit

Правда в итоге приходится указывать вместо g++ /home/crosstooler/x-tools/x86_64-unknown-linux-gnu/bin/x86_64-unknown-linux-gnu-g++

но все работает

ArthurKhairullin ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.