LINUX.ORG.RU

sparc, endian и ошибка bus error?


0

0

откопал рабочую станцию SparcUltra 5/10, проц 64-бит UltraSPARC-IIi 440Мгц, 512 оперативы, поставил debian (solaris10 еще в пути) g++ -v дает:

Using built-in specs. Target: sparc-linux-gnu Configured with: ../src/configure -v --enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --program-suffix=-4.1 --enable-__cxa_atexit --enable-clocale=gnu --enable-libstdcxx-debug --enable-mpfr --with-cpu=v8 --enable-checking=release sparc-linux-gnu Thread model: posix gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)

собственно есть кусок кода:

ptr32 = reinterpret_cast<const u32 *>(ptr8); byte32 = *ptr32; SDL_Swap32(byte32); //experience = byte32;

инициализация класса героя по прочитанному байтовому массиву (реверс инженеринг). так вот на то что закомментировано в обратном случае дает "bus error"

что подскажете?

★★★★★

Наверное на RISC с 64разрядной адресацией нельзя разыменовывать невыровненные указатели по 64битной границе. Как красиво решать - не знаю. (Возможно стоит выбросить reinterpret_cast и заменить на что-либо менее привязанное железу.

Опыта пока не имею. Первая ссылка в гугле: http://www.viva64.com/articles/20_issues_of_porting_C++_code_on_the_64-bit_pl...

Надеюсь поможет.

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

хорошая статья только не помогает)))
вот упростил:

#include <iostream>

int main()
{
    unt8_t a[] = { 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3 };

    const uint16_t *ptr2 = (const uint16_t *) (& a[1]);

    std::cout << "val: " << *ptr2 << std::endl;

    return 0;
}

при запуске bus error

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