Note: This website is archived. For up-to-date information about D projects and development, please visit wiki.dlang.org.

Changeset 795

Show
Ignore:
Timestamp:
12/09/10 01:33:26 (14 years ago)
Author:
walter
Message:

bugzilla 5331 mach format problem

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/dmd-1.x/src/backend/machobj.c

    r754 r795  
    745745            } 
    746746            else 
    747747            { 
    748748                psechdr->offset = foffset; 
    749749                psechdr->size = 0; 
    750750                //printf("\tsection name %s,", psechdr->sectname); 
    751751                if (pseg->SDbuf && pseg->SDbuf->size()) 
    752752                { 
    753753                    //printf("\tsize %d\n", pseg->SDbuf->size()); 
    754754                    psechdr->size = pseg->SDbuf->size(); 
    755755                    fobjbuf->write(pseg->SDbuf->buf, psechdr->size); 
    756756                    foffset += psechdr->size; 
    757757                } 
    758758            } 
    759759            psechdr->addr = vmaddr; 
    760760            vmaddr += psechdr->size; 
    761761            //printf(" assigned offset %d, size %d\n", foffset, psechdr->sh_size); 
    762762        } 
    763763    } 
    764764 
    765     /* Apparently having the filesize field greater than the vmsize field is an 
     765    segment_cmd.vmsize = vmaddr; 
     766    segment_cmd.filesize = foffset - segment_cmd.fileoff; 
     767    /* Bugzilla 5331: Apparently having the filesize field greater than the vmsize field is an 
    766768     * error, and is happening sometimes. 
    767769     */ 
    768     segment_cmd.vmsize = vmaddr; 
    769     segment_cmd.filesize = foffset - segment_cmd.fileoff
     770    if (segment_cmd.filesize > vmaddr) 
     771        segment_cmd.vmsize = segment_cmd.filesize
    770772 
    771773    // Put out relocation data 
    772774    mach_numbersyms(); 
    773775    for (int seg = 1; seg <= seg_count; seg++) 
    774776    { 
    775777        seg_data *pseg = SegData[seg]; 
    776778        struct section *psechdr = &SecHdrTab[pseg->SDshtidx];   // corresponding section 
    777779        //printf("psechdr->addr = x%x\n", psechdr->addr); 
    778780        foffset = elf_align(I64 ? 8 : 4, foffset); 
    779781        unsigned reloff = foffset; 
    780782        unsigned nreloc = 0; 
    781783        if (pseg->SDrel) 
    782784        {   Relocation *r = (Relocation *)pseg->SDrel->buf; 
    783785            Relocation *rend = (Relocation *)(pseg->SDrel->buf + pseg->SDrel->size()); 
    784786            for (; r != rend; r++) 
    785787            {   const char *rs = r->rtype == RELaddr ? "addr" : "rel"; 
    786788                symbol *s = r->targsym; 
    787789                //printf("%d:x%04x : tseg %d tsym %p REL%s\n", 
    788790                    //seg, r->offset, r->targseg, s, rs); 
    789791                relocation_info rel; 
  • trunk/src/backend/machobj.c

    r754 r795  
    745745            } 
    746746            else 
    747747            { 
    748748                psechdr->offset = foffset; 
    749749                psechdr->size = 0; 
    750750                //printf("\tsection name %s,", psechdr->sectname); 
    751751                if (pseg->SDbuf && pseg->SDbuf->size()) 
    752752                { 
    753753                    //printf("\tsize %d\n", pseg->SDbuf->size()); 
    754754                    psechdr->size = pseg->SDbuf->size(); 
    755755                    fobjbuf->write(pseg->SDbuf->buf, psechdr->size); 
    756756                    foffset += psechdr->size; 
    757757                } 
    758758            } 
    759759            psechdr->addr = vmaddr; 
    760760            vmaddr += psechdr->size; 
    761761            //printf(" assigned offset %d, size %d\n", foffset, psechdr->sh_size); 
    762762        } 
    763763    } 
    764764 
    765     /* Apparently having the filesize field greater than the vmsize field is an 
     765    segment_cmd.vmsize = vmaddr; 
     766    segment_cmd.filesize = foffset - segment_cmd.fileoff; 
     767    /* Bugzilla 5331: Apparently having the filesize field greater than the vmsize field is an 
    766768     * error, and is happening sometimes. 
    767769     */ 
    768     segment_cmd.vmsize = vmaddr; 
    769     segment_cmd.filesize = foffset - segment_cmd.fileoff
     770    if (segment_cmd.filesize > vmaddr) 
     771        segment_cmd.vmsize = segment_cmd.filesize
    770772 
    771773    // Put out relocation data 
    772774    mach_numbersyms(); 
    773775    for (int seg = 1; seg <= seg_count; seg++) 
    774776    { 
    775777        seg_data *pseg = SegData[seg]; 
    776778        struct section *psechdr = &SecHdrTab[pseg->SDshtidx];   // corresponding section 
    777779        //printf("psechdr->addr = x%x\n", psechdr->addr); 
    778780        foffset = elf_align(I64 ? 8 : 4, foffset); 
    779781        unsigned reloff = foffset; 
    780782        unsigned nreloc = 0; 
    781783        if (pseg->SDrel) 
    782784        {   Relocation *r = (Relocation *)pseg->SDrel->buf; 
    783785            Relocation *rend = (Relocation *)(pseg->SDrel->buf + pseg->SDrel->size()); 
    784786            for (; r != rend; r++) 
    785787            {   const char *rs = r->rtype == RELaddr ? "addr" : "rel"; 
    786788                symbol *s = r->targsym; 
    787789                //printf("%d:x%04x : tseg %d tsym %p REL%s\n", 
    788790                    //seg, r->offset, r->targseg, s, rs); 
    789791                relocation_info rel;