Скомпилированная программа на собранном gcc выдает segfault
От: lolovo  
Дата: 06.12.19 09:59
Оценка:
Всем привет!

Имеется штатный древний компилятор gcc4.2.1(freebsd). Была необходима поддержка одной библиотеки, которая вынудила перейти на новую версию gcc, так вот...после долгих танцев с бубном вокруг разных версий gcc , которые не хотели ставиться...с горем пополам собрал gcc-4.9.4 со следующим конфигом:


../gcc-4.9.4/configure --enable-thread=posix --enable-bootstrap --enable-languages=c,c++,objc,obj-c++,lto --with-gmp=/usr/local —
-with-gmp-include=/usr/local/include --with-gmp-lib=/usr/local/lib --with-mpfr=/usr/local --with-mpfr-include=/usr/local/lib/include
--with-mpfr-lib=/usr/local/lib --with-mpc=/usr/local --with-mpc-include=/usr/local/include --with-mpc-lib=/usr/local/lib


перед этим были поставлены все необходимое и даже более, т.к. пробовал разные версии gcc поставить (не все при сборке gcc-4.9.4 используется):


binutils-2.33.1
gmp-6.1.2
mpfr-4.0.2
mpc-1.1.0
isl-0.21
make-4.2
m4-1.4.8
perl-5.30.1
cloog-0.18.0
ppl-1.2


путь PATH был изменен таким образом, чтоб /usr/local/bin был доступен для поиска первым (export PATH=/usr/local/bin:...), т.к. все что собирал из списка выше, все устанавливалось в /usr/local.

После успешной сборки gcc-4.9.4 попробовал протестировать простую программу (make check не делал, т.к. надо собирать для этого другие утилиты и машина не самая быстрая, в общем пропустил шаг):
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <map>
#include <iostream>

int main()
{
        int i=123;
        std::cout<<i<<std::endl; //<--- SegFault 
//      std::map<std::string,int> _A;
//      _A["SSSddd"]=111;
//      printf("%s %d\n",_A.begin()->first.c_str(),_A.begin()->second);        // [1]-->ok
//      std::cout<<_A.begin()->first<<" "<<_A.begin()->second<<std::endl;     // [2]-->SegFault
        return 0;
}


Перед компиляцией настроил LD_LIBRARY_PATH (к слову, его такой переменной окружения изначально не было): export LD_LIBRARY_PATH=/usr/local/bin:$LD_LIBRARY_PATH

Сама компиляция: g++ -g -o k k.cpp

Так вот, выяснилось, что если скомпилировать программу собранным gcc-4.9.4, то она выдает SegFault при std::cout! Старая версия gcc-4.2.1 компилирует нормально.
Причем printf новый gcc-4.9.4 переваривает нормально и в принципе работа с std::map и std::string не приводит к SegFault'у.

Что делаю не так? Чутье подсказывает мне, что проблема либо в изначальной сборке (что скорее всего и не понятно из-за чего, что и где могло пойти не так...ед. момент перед этим успешно собрал 4.5.0, но не проверял с std::cout его и перенес его в /usr/local, потом уже используя его собрал 4.7.0, далее аналогично перенес его в /usr/local и потом аналогично 4.9.0 и 4.9.4... может проблема в этом, что изначально на кривом g++ собирались последующие сборки), либо в том, что что-то при компиляции/линковке самой программы берется из разных мест (хочется больше верить в это, чем в ошибку при сборке самого gcc и понять что я упустил и делаю не то) и как результат валится в кору, причем dbg (правда, он старый, gdb-6.1.1 и с новым DWARF не совместим) говорит следующее:

Error while reading shared library symbols:
Dwarf Error: wrong version in compilation unit header (is 4, should be 2) [in module /usr/local/lib/libstdc++.so.6]
(no debugging symbols found)...Error while reading shared library symbols:
Dwarf Error: wrong version in compilation unit header (is 4, should be 2) [in module /usr/local/lib/libgcc_s.so.1]
(no debugging symbols found)...(no debugging symbols found)...
Program received signal SIGSEGV, Segmentation fault.
0x28103e0e in ?? () from /usr/local/lib/libstdc++.so.6


Если кто сталкивался, прошу помочь, а то машина старая и каждая итерация по сборке занимает уйму времени......
p.s. сейчас пытаюсь собрать 4.9.4 сразу используя рабочий 4.2.1 (хотя ранее пытался собрать 4.9.0 и не получилось).. надеюсь он возьмет все из нужных мест ... PATH вернул в исходное состояние, чтобы все бралось из /usr/bin
и попробую поставить новый gdb, может он что подскажет нового в коре.....
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.