mirror of https://github.com/zeldaret/oot.git
				
				
				
			Comment on the makerom linker layout in mkldscript
This commit is contained in:
		
							parent
							
								
									92db06611c
								
							
						
					
					
						commit
						c4b38b98bc
					
				| 
						 | 
				
			
			@ -29,6 +29,36 @@ static void write_ld_script(FILE *fout, uint32_t entrypoint_addr, const char *ma
 | 
			
		|||
          "{\n",
 | 
			
		||||
          fout);
 | 
			
		||||
 | 
			
		||||
    // Here we write the makerom segment in multiple parts, excluding it from the spec. Before, we would set a fake
 | 
			
		||||
    // base address of (0x80000400 - 0x1000) so that entry.o, the only case that matters, would end up at the correct
 | 
			
		||||
    // address. However, this is incompatible with converting the .elf to the ROM image via objcopy due to a bug in how
 | 
			
		||||
    // binutils computes LMAs from elf sections. Using 0x7FFFF400, the LMA is somehow computed as equal to the VMA:
 | 
			
		||||
    //  Sections:
 | 
			
		||||
    //  Idx Name          Size      VMA       LMA       File off  Algn
 | 
			
		||||
    //    0 ..makerom     00001060  7ffff400  00000000  00009400  2**4  CONTENTS, ALLOC, LOAD, RELOC, CODE
 | 
			
		||||
    //    1 ..makerom.bss 00000000  80000460  80000460  0000a460  2**4  ALLOC
 | 
			
		||||
    //    2 ..boot        00011f10  80000460  80000460  0000a460  2**5  CONTENTS, ALLOC, LOAD, RELOC, CODE
 | 
			
		||||
    //    3 ..boot.bss    00004a30  80012370  80012370  0001c370  2**4  ALLOC
 | 
			
		||||
    //    4 ..dmadata     000060c0  80016da0  00012f70  0001cda0  2**4  CONTENTS, ALLOC, LOAD, RELOC, DATA
 | 
			
		||||
    //    5 ..dmadata.bss 00000000  8001ce60  8001ce60  0359edf0  2**0  CONTENTS
 | 
			
		||||
    //    6 ..Audiobank   0002bdc0  00000000  00019030  00023000  2**4  CONTENTS, ALLOC, LOAD, RELOC, CODE
 | 
			
		||||
    //
 | 
			
		||||
    // 0x7FFFF400 trips this bug likely due having a different 32-bit sign extension than the other addresses involved.
 | 
			
		||||
    // Notably, llvm-objdump does not have the same problem with a base address of 0x7FFFF400:
 | 
			
		||||
    //  Sections:
 | 
			
		||||
    //  Idx Name                                  Size     VMA      LMA      Type
 | 
			
		||||
    //    0                                       00000000 00000000 00000000
 | 
			
		||||
    //    1 ..makerom                             00001060 7ffff400 00000000 TEXT
 | 
			
		||||
    //    2 .rel..makerom                         00000040 00000000 00000000
 | 
			
		||||
    //    3 ..makerom.bss                         00000000 80000460 00001060 BSS
 | 
			
		||||
    //    4 ..boot                                00011f10 80000460 00001060 TEXT
 | 
			
		||||
    //    5 .rel..boot                            00005f60 00000000 00000000
 | 
			
		||||
    //    6 ..boot.bss                            00004a30 80012370 00012f70 BSS
 | 
			
		||||
    //    7 ..dmadata                             000060c0 80016da0 00012f70 DATA
 | 
			
		||||
    //
 | 
			
		||||
    // To simplify things, we simply fix the contents of makerom as they should not change anyway, and assign the
 | 
			
		||||
    // address only when it matters. The ROM symbols for makerom must encompass these sections only as dmadata would
 | 
			
		||||
    // not match otherwise.
 | 
			
		||||
    fprintf(fout,
 | 
			
		||||
       "    /* makerom */"                                                                                      "\n"
 | 
			
		||||
       ""                                                                                                       "\n"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue