LINUX.ORG.RU

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

 , , long, lp64


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 ★★★★★
() автор топика
Ответ на: комментарий от 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 ★★★★★
()
Ответ на: комментарий от anonymous

long int test( ) { return 0; }

Поломается на этапе компиляции, что лучше сюрпризов в рантайм.

andreyu ★★★★★
()
Ответ на: комментарий от 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)

открой для себя 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 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.