проблема совместимости Solaris Sparc 9/10 с libstdС++ (64-разрядная версия)

У меня установлен gcc 3.4.6 в системах sparc9 и sparc10. У меня возникают проблемы с совместимостью, когда я пытаюсь использовать общий объект (построенный на sparc9) на sparc10. Я не вижу никаких проблем, если я использую тот же общий объект в системе sparc9. Фрагмент из makefile: -

LIB=-L/usr/lib/sparcv9 -L/usr/local/lib/sparcv9 -L/lib/sparcv9
gcc -m64 -shared -fPIC -o myapi.so.1 myapi.o $(LIB) -lc -lstdc++ -luuid

Теперь следуем в sparc10: -

ldd -d /home/myapi.so
libstdc++.so.6 =>        /usr/local/lib/sparcv9/libstdc++.so.6
symbol not found: _ZNSt15basic_streambufIcSt11char_traitsIcEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode                (./myapi.so)

Я пропустил другие зависимости в приведенном выше выводе, которые выглядят нормально.

Затем я запустил «nm» против libstdc++.so.6 в /usr/local/lib/sparcv9 для указанного выше символа без ссылки и пришел к следующему выводу: -

V9---> _ZNSt15basic_streambufIcSt11char_traitsIcEE7seekoffExSt12_Ios_SeekdirSt13_Ios_Openmode
V10--->_ZNSt15basic_streambufIcSt11char_traitsIcEE7seekoffElSt12_Ios_SeekdirSt13_Ios_Openmode

Если вы посмотрите внимательно, вы увидите разницу в символе искаженного имени в sparc9 и sparc10... "ExSt12" и "ElSt12".

Точно так же, если я соберу myapi.so на sparc10, он выйдет из строя на sparc9 из-за несоответствия символов в V9 и V10.

Может ли кто-нибудь указать мне какие-либо полезные советы, если я что-то упустил? Или мне нужно установить какой-либо пакет на V9. Я предполагаю, что общий объект, построенный на V9, должен работать на V10.

Я хотел бы добавить, что размер libstdc++.so.6 на V9 отличается от V10. V9 имеет SMCgcc, а V10 имеет SUNWgccruntime и SMCgcc.


person confused    schedule 04.08.2011    source источник


Ответы (2)


Эти символы расшифровываются как:

std::basic_streambuf<char, std::char_traits<char> >::seekoff(long long, std::_Ios_Seekdir, std::_Ios_Openmode)

а также

std::basic_streambuf<char, std::char_traits<char> >::seekoff(long, std::_Ios_Seekdir, std::_Ios_Openmode)

Обратите внимание, что один использует long, а другой использует long long

Я подозреваю, что это означает, что один был построен с 64-битными смещениями файлов (т. е. поддержкой больших файлов), а другой — нет. Это означает, что две версии GCC были созданы по-разному (компанией sunfreeware.com или тем, кто их предоставил) и несовместимы.

person Jonathan Wakely    schedule 20.09.2013

Похоже, вы используете несовместимые версии компилятора GNU C++ и стандартной библиотеки в двух ОС. К сожалению, не существует стандартного ABI для C++, и многие компиляторы несовместимо изменяют соглашения об изменении символов между основными выпусками (например, компилятор Sun C++ 4.x по сравнению с 5.x или g++ 2.x по сравнению с 3.x по сравнению с 4.x). ).

Путь /usr/local/lib означает, что вы используете библиотеки из пакетов SMCgcc, загруженных с сайта sunfreeware.com. - убедитесь, что у вас есть соответствующие версии на машинах Solaris 9 и 10. (Нет «sparc 10», поэтому вы должны иметь в виду Solaris 10.)

person alanc    schedule 04.08.2011
comment
@alanc .. спасибо за помощь в этом вопросе. Версии gcc/g++ 3.4.6 на обеих машинах. Однако базовая версия gcc отличается на обеих машинах. Я не могу найти 64-битный пакет SUNWgccruntime для Solaris9 (который является пакетом по умолчанию в Solaris 10). В этом случае я должен проверить версию SMCgcc на Solaris 10 и установить ту же версию на Solaris 9? Это рекомендуемый подход или должно быть наоборот? - person confused; 04.08.2011
comment
SUNWgccruntime — это интегрированная в Solaris среда выполнения gcc, которая впервые была добавлена ​​в Solaris 10 — она никогда не создавалась для Solaris 9. - person alanc; 05.08.2011