LINUX.ORG.RU

Сделать long 32 bit на x86_64 - можно ли?

 , , ,


1

1

Есть программа, которая не работает, будучи собранной под x86_64 (с lp64 data model https://usrmisc.wordpress.com/2012/12/27/integer-sizes-in-c-on-32-bit-and-64-...)
Можно ли сказать компилятору использовать модель данных как в ia32?

★★★★★

Можно ли сказать компилятору использовать модель данных как в ia32?

собирать 32-битный бинарь и использовать multilib - не вариант?

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

допустим, надо выделить 5 гигабайт памяти (это компилятор map->bsp).
тогда это уже не устроит.

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

Окей, пойдет другим костыльным путем. #define вставить, не?

Отладка будет веселой, да...

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

Верный путь переписать всё на stdint. Но он долгий к сожалению.
А #define тут не сработает ибо long long особо не задефайнишь. Вопрос скорее касался именно параметров компилятора, если gcc конечно умеет такое.

mittorn ★★★★★ ()

Наверное, как-то можно. В Visual Studio, кстати, long = 32 бита, по-моему.

Но ты учти, что тебе придётся пересобирать libc, все остальные библиотеки, которые твоя программа использует, а возможно, и ядро.

proud_anon ★★★★★ ()

Пришло время регулярок рефакторинга.

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

Для всяких size_t не прокатит. Поэтому, помимо изначально грамотного описания типов, нужно еще для 32-битного барахла добавлять _LARGEFILE64_SOURCE и _FILE_OFFSET_BITS в дефайны, чтобы иметь возможность с большими файлами работать.

anonymous ()

Посмотри нет ли в программе игрищ со структурами, которые могут быть packed и/или использовать long для чтения-записи каких-нибудь бинарных файлов/пакетов данных и т.п. Вот там, скорее всего, и порылась собака.

Если принудительно сказать что long - 32 бита, то получишь кучу несостыковок по параметрам функций со сторонними библиотеками, которые собраны для 64бит, например, и у тебя вообще ничего работать не будет.

Stanson ★★★★★ ()

2016

не использовать целочисленные типы фиксированной длины

Простого пути нет. Но можно попробовать заменить твой long везде на int32_t.

buddhist ★★★★★ ()

Re: Сделать long 32 bit на x86_64

/* have a nice day motherf*ckers */
#define long int

/thread

kawaii_neko ★★★ ()
Ответ на: Re: Сделать long 32 bit на x86_64 от kawaii_neko

Re: Сделать long 32 bit на x86_64

ну на, откомпилируй это своим «решением»

long int test( ) { return 0; }

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

Я немного отстал от жизни? В Си появились целочисленные типы переменной длинны?

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

Я немного отстал от жизни? В Си появились целочисленные типы переменной длинны?

Здрасьте! Стандарт ничего не говорит по поводу размеров char, short, int, long etc. Гарантируется только что sizeof(char) == 1 (вот тут могу заблуждаться), а дальше

sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)

kawaii_neko ★★★ ()

Я думаю, можно. Где-то внутрях gcc или в дефайнах задано для какой платформы какие размеры брать. Можешь новую платформу добавить. Короче, гугли INT_TYPE_SIZE и смотри plugin/include/defaults.h . Там говорят что длины можно поправить в неком tm.h . Гугление по tm.h меня привело к https://gcc.gnu.org/onlinedocs/gccint/Target-Macros.html, это, возможно, то что тебе нужно.

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

Я немного отстал от жизни? В Си появились целочисленные типы переменной длинны?

они разной длины только для разных архитктур, как-то так

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

Так пишут только 3.14анонимы

Ну пусть long long. Такое встречается чаще.

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

ну так регулярками его, регулярками. сначала убираем long long, потом long int, потом long...

dib2 ★★★★★ ()

открой для себя stdint.h и uint32_t, uint64_t и тд

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

Стандарт ничего не говорит по поводу размеров char, short, int, long etc

Минимальная ширина таки гарантируется.

anonymous ()

Я правильно понимаю, что хочется 32-bit long, но 64-bit указатели? Можешь пропатчить gcc/config/i386/i386.h (смотри с 718 строчки). Как минимум надо будет пересобрать все либы патченым компилятором.

deadNightTiger ★★★★ ()

Мне тоже было нужно. Если решишь заменить в исходниках long на int, то смотри, какие мне советы дали.

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