|  | @@ -41,6 +41,7 @@
 | 
		
	
		
			
			| 41 | 41 |  struct pe_section {
 | 
		
	
		
			
			| 42 | 42 |  	struct pe_section *next;
 | 
		
	
		
			
			| 43 | 43 |  	EFI_IMAGE_SECTION_HEADER hdr;
 | 
		
	
		
			
			|  | 44 | +	void ( * fixup ) ( struct pe_section *section );
 | 
		
	
		
			
			| 44 | 45 |  	uint8_t contents[0];
 | 
		
	
		
			
			| 45 | 46 |  };
 | 
		
	
		
			
			| 46 | 47 |  
 | 
		
	
	
		
			
			|  | @@ -547,6 +548,20 @@ create_reloc_section ( struct pe_header *pe_header,
 | 
		
	
		
			
			| 547 | 548 |  	return reloc;
 | 
		
	
		
			
			| 548 | 549 |  }
 | 
		
	
		
			
			| 549 | 550 |  
 | 
		
	
		
			
			|  | 551 | +/**
 | 
		
	
		
			
			|  | 552 | + * Fix up debug section
 | 
		
	
		
			
			|  | 553 | + *
 | 
		
	
		
			
			|  | 554 | + * @v debug		Debug section
 | 
		
	
		
			
			|  | 555 | + */
 | 
		
	
		
			
			|  | 556 | +static void fixup_debug_section ( struct pe_section *debug ) {
 | 
		
	
		
			
			|  | 557 | +	EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *contents;
 | 
		
	
		
			
			|  | 558 | +
 | 
		
	
		
			
			|  | 559 | +	/* Fix up FileOffset */
 | 
		
	
		
			
			|  | 560 | +	contents = ( ( void * ) debug->contents );
 | 
		
	
		
			
			|  | 561 | +	contents->FileOffset += ( debug->hdr.PointerToRawData -
 | 
		
	
		
			
			|  | 562 | +				  debug->hdr.VirtualAddress );
 | 
		
	
		
			
			|  | 563 | +}
 | 
		
	
		
			
			|  | 564 | +
 | 
		
	
		
			
			| 550 | 565 |  /**
 | 
		
	
		
			
			| 551 | 566 |   * Create debug section
 | 
		
	
		
			
			| 552 | 567 |   *
 | 
		
	
	
		
			
			|  | @@ -581,6 +596,7 @@ create_debug_section ( struct pe_header *pe_header, const char *filename ) {
 | 
		
	
		
			
			| 581 | 596 |  	debug->hdr.Characteristics = ( EFI_IMAGE_SCN_CNT_INITIALIZED_DATA |
 | 
		
	
		
			
			| 582 | 597 |  				       EFI_IMAGE_SCN_MEM_NOT_PAGED |
 | 
		
	
		
			
			| 583 | 598 |  				       EFI_IMAGE_SCN_MEM_READ );
 | 
		
	
		
			
			|  | 599 | +	debug->fixup = fixup_debug_section;
 | 
		
	
		
			
			| 584 | 600 |  
 | 
		
	
		
			
			| 585 | 601 |  	/* Create section contents */
 | 
		
	
		
			
			| 586 | 602 |  	contents->debug.TimeDateStamp = 0x10d1a884;
 | 
		
	
	
		
			
			|  | @@ -589,6 +605,7 @@ create_debug_section ( struct pe_header *pe_header, const char *filename ) {
 | 
		
	
		
			
			| 589 | 605 |  		( sizeof ( *contents ) - sizeof ( contents->debug ) );
 | 
		
	
		
			
			| 590 | 606 |  	contents->debug.RVA = ( debug->hdr.VirtualAddress +
 | 
		
	
		
			
			| 591 | 607 |  				offsetof ( typeof ( *contents ), rsds ) );
 | 
		
	
		
			
			|  | 608 | +	contents->debug.FileOffset = contents->debug.RVA;
 | 
		
	
		
			
			| 592 | 609 |  	contents->rsds.Signature = CODEVIEW_SIGNATURE_RSDS;
 | 
		
	
		
			
			| 593 | 610 |  	snprintf ( contents->name, sizeof ( contents->name ), "%s",
 | 
		
	
		
			
			| 594 | 611 |  		   filename );
 | 
		
	
	
		
			
			|  | @@ -629,6 +646,8 @@ static void write_pe_file ( struct pe_header *pe_header,
 | 
		
	
		
			
			| 629 | 646 |  			fpos += section->hdr.SizeOfRawData;
 | 
		
	
		
			
			| 630 | 647 |  			fpos = efi_file_align ( fpos );
 | 
		
	
		
			
			| 631 | 648 |  		}
 | 
		
	
		
			
			|  | 649 | +		if ( section->fixup )
 | 
		
	
		
			
			|  | 650 | +			section->fixup ( section );
 | 
		
	
		
			
			| 632 | 651 |  	}
 | 
		
	
		
			
			| 633 | 652 |  
 | 
		
	
		
			
			| 634 | 653 |  	/* Write file header */
 |