]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[efi] Populate debug directory entry FileOffset field
authorMichael Brown <mcb30@ipxe.org>
Tue, 1 Sep 2015 00:30:57 +0000 (01:30 +0100)
committerMichael Brown <mcb30@ipxe.org>
Tue, 1 Sep 2015 00:35:03 +0000 (01:35 +0100)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/util/elf2efi.c

index eb8f51ee5bee113d46fe5394d5b1473820e6912a..4d2de3e753ae71671c952c9b554e025769445053 100644 (file)
@@ -41,6 +41,7 @@
 struct pe_section {
        struct pe_section *next;
        EFI_IMAGE_SECTION_HEADER hdr;
+       void ( * fixup ) ( struct pe_section *section );
        uint8_t contents[0];
 };
 
@@ -547,6 +548,20 @@ create_reloc_section ( struct pe_header *pe_header,
        return reloc;
 }
 
+/**
+ * Fix up debug section
+ *
+ * @v debug            Debug section
+ */
+static void fixup_debug_section ( struct pe_section *debug ) {
+       EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *contents;
+
+       /* Fix up FileOffset */
+       contents = ( ( void * ) debug->contents );
+       contents->FileOffset += ( debug->hdr.PointerToRawData -
+                                 debug->hdr.VirtualAddress );
+}
+
 /**
  * Create debug section
  *
@@ -581,6 +596,7 @@ create_debug_section ( struct pe_header *pe_header, const char *filename ) {
        debug->hdr.Characteristics = ( EFI_IMAGE_SCN_CNT_INITIALIZED_DATA |
                                       EFI_IMAGE_SCN_MEM_NOT_PAGED |
                                       EFI_IMAGE_SCN_MEM_READ );
+       debug->fixup = fixup_debug_section;
 
        /* Create section contents */
        contents->debug.TimeDateStamp = 0x10d1a884;
@@ -589,6 +605,7 @@ create_debug_section ( struct pe_header *pe_header, const char *filename ) {
                ( sizeof ( *contents ) - sizeof ( contents->debug ) );
        contents->debug.RVA = ( debug->hdr.VirtualAddress +
                                offsetof ( typeof ( *contents ), rsds ) );
+       contents->debug.FileOffset = contents->debug.RVA;
        contents->rsds.Signature = CODEVIEW_SIGNATURE_RSDS;
        snprintf ( contents->name, sizeof ( contents->name ), "%s",
                   filename );
@@ -629,6 +646,8 @@ static void write_pe_file ( struct pe_header *pe_header,
                        fpos += section->hdr.SizeOfRawData;
                        fpos = efi_file_align ( fpos );
                }
+               if ( section->fixup )
+                       section->fixup ( section );
        }
 
        /* Write file header */