Переполнение размера Zerofill в сборке OS X

Предположим, следующий фрагмент кода C ++:

char huge[0x900000000];
char large[0x90000000];

На OS X это не компилируется (g++ -c filename.cc):

….s:4:zerofill size (2415919104.) <0! Ignored.
….s:4:Rest of line ignored. 1st junk character valued 44 (,).

Смотря на ассемблерный код (g++ -S filename.cc):

    .section    __TEXT,__text,regular,pure_instructions
.globl  _huge
.zerofill __DATA,__common,_huge,1,5
.globl  _large
.zerofill __DATA,__common,_large,2415919104,5

.subsections_via_symbols

Это было с системой GCC на Apple Mountain Lion, а именно i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00), У меня также есть версия, установленная через MacPorts: g++-mp-4.8 (MacPorts gcc48 4.8.2_0) 4.8.2, После этого я получаю то же самое сообщение об ошибке, хотя сгенерированная сборка теперь выглядит так:

    .globl _huge
.zerofill __DATA,__pu_bss5,_huge,38654705664,5
.globl _large
.zerofill __DATA,__pu_bss5,_large,2415919104,5
.constructor
.destructor
.align 1
.subsections_via_symbols

Все это выглядит для меня как минимум одной ошибкой: очевидно, ассемблер интерпретирует этот размер как 32-разрядное число со знаком, без учета переполнения. Однако я не уверен, где сообщить об этой проблеме: это ошибка GCC, о которой следует сообщать с помощью средства отслеживания ошибок GCC? Или это ошибка в ассемблере Apple, и я должен попытаться сообщить об этом XCode или что-то вроде этого? Если да, то как именно? Или это фактически программное обеспечение LLVM, используемое здесь, и я должен сообщить об этом там?

А как насчет того, что система gcc генерирует неправильный размер в своем выводе сборки? Поскольку версия MacPorts справляется с этим лучше, я предполагаю, что разработчики GCC исправили это в это время, и Apple, вероятно, в конечном итоге поднимет это. Вы согласны с этим или я должен подать второй отчет куда-нибудь, чтобы решить эту проблему?

1

Решение

Инженеры Apple сообщили о моем сообщении об ошибке # 15977897 следующим образом:

llvm-gcc не поддерживается уже пару лет. Пожалуйста, используйте лязг.

Использование clang действительно работает. По крайней мере, нет сообщений об ошибках, и объектный файл, кажется, имеет __DATA сегмент правильного размера, помеченный S_ZEROFILL флаг. Это я нашел с помощью MachOView инструмент. Код ассемблера, который генерирует clang, также выглядит вменяемым: он имеет правильные размеры для обеих переменных.

0

Другие решения

Других решений пока нет …