LINUX.ORG.RU

Вопрос про переносимость типов i386 -> amd64

 , ,


0

2

Здравствуйте. Есть одна либа в исходных кодах. Там реализация бинарного протокола, соответственно перекладывание байтов (и битов!) всю дорогу. Либа портирована на ARM32, AVR и прочее. Всё «портирование» сводится к переопределению типов в зависимости от архитектуры. в частности, для gcc i386 там такой расклад:


/* Gcc for PC / Linux & Power PC / Linux */
#elif defined(__GNUC__) &&      \
      defined(__gnu_linux__) && \
      ( defined(__i386__) || defined(__PPC405__) )
typedef unsigned char      byte;
typedef unsigned char      int8u;            /* 8 bit unsigned  */
typedef char               int8s;            /* 8 bit signed    */
typedef unsigned short int int16u;           /* 16 bit unsigned */
typedef short int          int16s;           /* 16 bit signed   */
typedef unsigned int       int32u;           /* 32 bit unsigned */
typedef int                int32s;           /* 32 bit signed   */
typedef int                fast_int;

Есть небольшое желание собрать под x64, чтобы потом слепить биндинги для Rust. Но в этой архитектурной кухне я не в зуб ногой. Соответственно вопрос: если тупо к вышеприведенному добавить условие #if defined(__x86_64__) какой шанс что всё будет OK? Или придется как-то извращаться чтобы корректно заработало на x64?



Последнее исправление: pornandme (всего исправлений: 1)
Ответ на: комментарий от pornandme

Добро пожаловать на наши платные консалтинговые услуги :)

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

Что за либа неизвестно, видно древность какая-то, раз без поддержки 64 бит. Ты телепатов что ли ищешь? Правильно сказали: попробуй и узнаешь.

anonymous
()

типы, имеющие определённый размер, давно опрелены в <stdint.h> Ну и учитывать big-little endian (увидел слово PPC).

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

Лень тестовый стенд собирать. Поэтому решил спросить у специалистов, каковы шансы на успех

1/2

anonymous
()

Предлагаю сделать

#include <stdint.h>
typedef uint8_t            byte;
typedef uint8_t            int8u;            /* 8 bit unsigned  */
typedef int8_t             int8s;            /* 8 bit signed    */
typedef uint16_t           int16u;           /* 16 bit unsigned */
typedef int16_t            int16s;           /* 16 bit signed   */
typedef uint32_t           int32u;           /* 32 bit unsigned */
typedef int32_t            int32s;           /* 32 bit signed   */
typedef int_fast32_t       fast_int; // тут хз, может лучше int_fast8_t

SZT ★★★★★
()

Шанс примерно такой же как и то что это заработает под i386. Т.е. код заведомо некорректный, но тем не менее окружение где он не заработает нужно специально искать или создавать. Так-то можешь просто добавить условие в этот же #elif: defined(__i386__) || defined (__x86_64__). Правильно было бы конечно же использовать типы фиксированной длины из cstdint, или ещё лучше пользоваться всегда платформоспецифичными быстрыми типами и сериализовать побайтово.

slovazap ★★★★★
()
Последнее исправление: slovazap (всего исправлений: 2)

Читай ман от Intel по портированию на архитектуру 64 бита

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