Changeset 795
- Timestamp:
- 12/09/10 01:33:26 (14 years ago)
- Files:
-
- branches/dmd-1.x/src/backend/machobj.c (modified) (1 diff)
- trunk/src/backend/machobj.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/dmd-1.x/src/backend/machobj.c
r754 r795 745 745 } 746 746 else 747 747 { 748 748 psechdr->offset = foffset; 749 749 psechdr->size = 0; 750 750 //printf("\tsection name %s,", psechdr->sectname); 751 751 if (pseg->SDbuf && pseg->SDbuf->size()) 752 752 { 753 753 //printf("\tsize %d\n", pseg->SDbuf->size()); 754 754 psechdr->size = pseg->SDbuf->size(); 755 755 fobjbuf->write(pseg->SDbuf->buf, psechdr->size); 756 756 foffset += psechdr->size; 757 757 } 758 758 } 759 759 psechdr->addr = vmaddr; 760 760 vmaddr += psechdr->size; 761 761 //printf(" assigned offset %d, size %d\n", foffset, psechdr->sh_size); 762 762 } 763 763 } 764 764 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 766 768 * error, and is happening sometimes. 767 769 */ 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; 770 772 771 773 // Put out relocation data 772 774 mach_numbersyms(); 773 775 for (int seg = 1; seg <= seg_count; seg++) 774 776 { 775 777 seg_data *pseg = SegData[seg]; 776 778 struct section *psechdr = &SecHdrTab[pseg->SDshtidx]; // corresponding section 777 779 //printf("psechdr->addr = x%x\n", psechdr->addr); 778 780 foffset = elf_align(I64 ? 8 : 4, foffset); 779 781 unsigned reloff = foffset; 780 782 unsigned nreloc = 0; 781 783 if (pseg->SDrel) 782 784 { Relocation *r = (Relocation *)pseg->SDrel->buf; 783 785 Relocation *rend = (Relocation *)(pseg->SDrel->buf + pseg->SDrel->size()); 784 786 for (; r != rend; r++) 785 787 { const char *rs = r->rtype == RELaddr ? "addr" : "rel"; 786 788 symbol *s = r->targsym; 787 789 //printf("%d:x%04x : tseg %d tsym %p REL%s\n", 788 790 //seg, r->offset, r->targseg, s, rs); 789 791 relocation_info rel; trunk/src/backend/machobj.c
r754 r795 745 745 } 746 746 else 747 747 { 748 748 psechdr->offset = foffset; 749 749 psechdr->size = 0; 750 750 //printf("\tsection name %s,", psechdr->sectname); 751 751 if (pseg->SDbuf && pseg->SDbuf->size()) 752 752 { 753 753 //printf("\tsize %d\n", pseg->SDbuf->size()); 754 754 psechdr->size = pseg->SDbuf->size(); 755 755 fobjbuf->write(pseg->SDbuf->buf, psechdr->size); 756 756 foffset += psechdr->size; 757 757 } 758 758 } 759 759 psechdr->addr = vmaddr; 760 760 vmaddr += psechdr->size; 761 761 //printf(" assigned offset %d, size %d\n", foffset, psechdr->sh_size); 762 762 } 763 763 } 764 764 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 766 768 * error, and is happening sometimes. 767 769 */ 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; 770 772 771 773 // Put out relocation data 772 774 mach_numbersyms(); 773 775 for (int seg = 1; seg <= seg_count; seg++) 774 776 { 775 777 seg_data *pseg = SegData[seg]; 776 778 struct section *psechdr = &SecHdrTab[pseg->SDshtidx]; // corresponding section 777 779 //printf("psechdr->addr = x%x\n", psechdr->addr); 778 780 foffset = elf_align(I64 ? 8 : 4, foffset); 779 781 unsigned reloff = foffset; 780 782 unsigned nreloc = 0; 781 783 if (pseg->SDrel) 782 784 { Relocation *r = (Relocation *)pseg->SDrel->buf; 783 785 Relocation *rend = (Relocation *)(pseg->SDrel->buf + pseg->SDrel->size()); 784 786 for (; r != rend; r++) 785 787 { const char *rs = r->rtype == RELaddr ? "addr" : "rel"; 786 788 symbol *s = r->targsym; 787 789 //printf("%d:x%04x : tseg %d tsym %p REL%s\n", 788 790 //seg, r->offset, r->targseg, s, rs); 789 791 relocation_info rel;
