OS X组件中的Zerofill尺寸溢出

Zerofill size overflow in OS X assembly

本文关键字:溢出 Zerofill 组件 OS      更新时间:2023-10-16

假设以下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一起使用,即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 Assembler中的错误,我应该尝试针对Xcode报告它?如果是这样,到底怎么样?还是这实际上是在这里使用的LLVM软件,我应该在此报告?

以及系统gcc在其装配输出中产生错误的大小的事实如何?由于Macports版本处理得更好,因此我认为GCC Devs同时已将其修复,Apple最终可能会选择它。您是否同意这一点,还是我应该在某个地方提交第二个报告来解决此问题?

苹果工程师以这种方式向我的错误报告#15977897报告:

LLVM-GCC已经不支持了几年。请使用clang。

使用clang确实有效。至少没有错误消息,并且对象文件似乎确实具有带有S_ZEROFILL标志的正确大小的__DATA段。我使用Machoview工具发现了这一点。汇编代码clang生成的外观也很理智:它具有两个变量的正确尺寸。