Solaris sparc 9/10 libstdc ++ проблема совместимости (64 бит) - PullRequest
0 голосов
/ 04 августа 2011

У меня установлен 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" v / s "ElSt12".

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

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

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

Ответы [ 2 ]

1 голос
/ 20 сентября 2013

Эти символы делятся на:

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 или кем-либо, кто их предоставил) и несовместимы.

0 голосов
/ 04 августа 2011

Похоже, что вы используете несовместимые версии компилятора 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.)

...