I tried different versions of DMD 2.057:
- compiled from sources in the release zip (Gentoo ebuild)
- using the 32-bit binaries in the release zip
- compiling the latest 32-bit version of DMD from the repository
I tried different compiler flags or no flags at all, compiled similar code in C++ to see if the linker is ok and tried -m32 and -m64, all to no avail. Then I found a solution that I can hardly imagine happening only on my unique snow-flake of a system ;) :

struct Test {
    __gshared byte abcd[10 * 1024 * 1024];
}

If it weren't for your own test results, I'd assume there is a small compiler bug in the code that decides what can go into .bss, that makes it look only for data explicitly flagged as __gshared, but not other immutable data. (Something like that anyway.) I back-tracked the compiler code to where it either calls obj_bytes (good case, goes into .bss) or obj_lidata (bad case) to write the 10 MB of zeros. But there were so many call sites, that I figured someone with inside knowledge would figure it out faster.

As a side-effect of this experiment I found this combination to do funny things at runtime:

--------------------------------------------------

struct Test {
        byte arr1[1024 * 1024 * 10];
        __gshared byte arr2[1024 * 1024 * 10];
}

int main() {
        Test test;
        return 0;
}

--------------------------------------------------

-- Marco

Am 18.01.2012, 11:18 Uhr, schrieb Walter Bright <newshou...@digitalmars.com>:

On 1/18/2012 1:43 AM, Marco Leise wrote:
It is back again! The following struct in my main module increases the
executable size by 10MB with DMD 2.075:

struct Test {
byte abcd[10 * 1024 * 1024];
}

Compiling it and obj2asm'ing the result, and you'll see it goes into the BSS segment:


_TEXT   segment dword use32 public 'CODE'       ;size is 0
_TEXT   ends
_DATA   segment para use32 public 'DATA'        ;size is 12
_DATA   ends
CONST   segment para use32 public 'CONST'       ;size is 0
CONST   ends
_BSS    segment para use32 public 'BSS' ;size is 10485760
_BSS    ends
FLAT    group
         extrn   _D19TypeInfo_S3foo4Test6__initZ

         public  _D3foo4Test6__initZ
FMB     segment dword use32 public 'DATA'       ;size is 0
FMB     ends
FM      segment dword use32 public 'DATA'       ;size is 4
FM      ends
FME     segment dword use32 public 'DATA'       ;size is 0
FME     ends
         extrn   _D15TypeInfo_Struct6__vtblZ

         public  _D3foo12__ModuleInfoZ
_D19TypeInfo_S3foo4Test6__initZ COMDAT flags=x0 attr=x10 align=x0

_TEXT   segment
         assume  CS:_TEXT
_TEXT   ends
_DATA   segment
_D3foo12__ModuleInfoZ:
db 004h,000h,000h,0ffffff80h,000h,000h,000h,000h ;........
         db      066h,06fh,06fh,000h     ;foo.
_DATA   ends
CONST   segment
CONST   ends
_BSS    segment
_BSS    ends
FMB     segment
FMB     ends
FM      segment
         dd      offset FLAT:_D3foo12__ModuleInfoZ
FM      ends
FME     segment
FME     ends
_D19TypeInfo_S3foo4Test6__initZ comdat
         dd      offset FLAT:_D15TypeInfo_Struct6__vtblZ
         db      000h,000h,000h,000h     ;....
         db      008h,000h,000h,000h     ;....
         dd      offset FLAT:_D19TypeInfo_S3foo4Test6__initZ[03Ch]
db 000h,000h,0ffffffa0h,000h,000h,000h,000h,000h ;........
         db      000h,000h,000h,000h,000h,000h,000h,000h ;........
         db      000h,000h,000h,000h,000h,000h,000h,000h ;........
         db      000h,000h,000h,000h,000h,000h,000h,000h ;........
         db      000h,000h,000h,000h,000h,000h,000h,000h ;........
         db      001h,000h,000h,000h,066h,06fh,06fh,02eh ;....foo.
         db      054h,065h,073h,074h,000h        ;Test.
_D19TypeInfo_S3foo4Test6__initZ ends
         end
-------------------------------------------------

Adding a void main(){} yields an executable of 145,948 bytes.

Reply via email to