#155714 - Ruben - Sat May 03, 2008 9:34 am
Code: |
c:/devkitpro/devkitarm/bin/../lib/gcc/arm-eabi/4.3.0/../../../../arm-eabi/bin/ld.exe: section .ewram [08038f50 -> 0803928b] overlaps section .bss [08038f50 -> 08039967]
collect2: ld returned 1 exit status |
I have no idea what could be causing that. All I did was change from devKitARM r21 to r23, and that happened. Any ideas?
I'm using a modified version of Jeff's crt0.s file and his lnkscript. Also, I don't have ANYTHING in EWRAM so it can't be because it's full (it never said that anyway). Any help appreciated.
This is my modified cart file named '0.s' so it ends up in first position when linking (I use a complicated batch script):
Code: |
.text
.global _start .align .arm _start: b rom_header_end .fill 0x9C,0x01,0x00 @ NINTENDO logo .byte 0x00,0x00,0x00,0x00,0x00 @ \ .byte 0x00,0x00,0x00,0x00,0x00 @ Game title .byte 0x00,0x00 @ / .byte 0x00,0x00,0x00,0x00 @ Game code .byte 0x30,0x31 @ Maker code .byte 0x96 @ Reserved .byte 0x00 @ Main unit code .byte 0x00 @ Device type .byte 0x00,0x00,0x00,0x00,0x00 @ \ Reserved .byte 0x00,0x00 @ / .byte 0x00 @ Software version .byte 0xF0 @ Complement .byte 0x00,0x00 @ Checksum .align .arm rom_header_end: b start_vector .global __boot_method, __slave_number __boot_method: .byte 0x00 @ boot type __slave_number: .byte 0x00 @ slave number @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ .global start_vector .align .arm start_vector: mov r0, #0x12 msr cpsr, r0 ldr sp, =__sp_irq mov r0, #0x1F msr cpsr, r0 ldr sp, =__sp_usr adr r0,1f + 1 bx r0 .thumb 1: ldr r1, =__intr_vector_buf ldr r0, =IntrRout str r0, [r1] .LDoEWRAMClear: mov r1, #0x40 lsl r1, #0x0C lsl r0, r1, #0x07 bl .LClearMem .LSkipEWRAMClear: mov r0, #0x03 lsl r0, #0x18 ldr r1, =__sp_usr_offset - 16 bl .LClearMem ldr r1, =__data_lma ldr r2, =__data_start ldr r4, =__data_end bl .LCopyMemChk ldr r1, =__iwram_lma ldr r2, =__iwram_start ldr r4, =__iwram_end bl .LCopyMemChk ldr r2, =__load_stop_iwram0 ldr r1, =__load_start_iwram0 sub r3, r2, r1 beq .LCIW0Skip ldr r2, =__iwram_overlay_start bl .LCopyMem .LCIW0Skip: ldr r1, =__ewram_lma ldr r2, =__ewram_start ldr r4, =__ewram_end bl .LCopyMemChk ldr r2, =__load_stop_ewram0 ldr r1, =__load_start_ewram0 sub r3, r2, r1 beq .LCEW0Skip ldr r2, =__ewram_overlay_start bl .LCopyMem .LCEW0Skip: mov r0, #0x00 @ int argc mov r1, #0x00 @ char *argv[] ldr r3, =start_vector @ r3 = start_vector mov lr, r3 @ lr = r3 ldr r3, =main @ r3 = main bx r3 @ bx to r3 .LClearMem: mov r2, #0x03 @ r2 = 0x03 add r1, r2 @ r1 += r2 bic r1, r2 @ \ beq .LClearMX @ if(!((r1 += 0x03) &~ 0x03)) branch to .LClearMX mov r2, #0x40 lsl r2, r2, #0x14 add r2, r2, #0xD0 lsr r1, #0x02 adr r3, .LClrVal str r3, [r2, #0x4] str r0, [r2, #0x8] strh r1, [r2, #0xC] mov r1, #0x85 lsl r1, r1, #0x08 strh r1, [r2, #0xE] .LClearMX: bx lr @ bx to lr .LCopyMemChk: sub r3, r4, r2 @ r3 = r4 - r2 .LCopyMem: mov r0, #0x03 @ r0 = 0x03 add r3, r0 @ r3 += r0 bic r3, r0 @ \ beq .LCIDExit @ if(r3 == 0) branch to .LCIDExit mov r0, #0x40 lsl r0, r0, #0x14 add r0, r0, #0xD0 lsr r3, #0x02 str r1, [r0, #0x4] str r2, [r0, #0x8] strh r3, [r0, #0xC] mov r3, #0x84 lsl r3, r3, #0x08 strh r3, [r0, #0xE] .LCIDExit: bx lr .align .LClrVal: .word 0x00000000 .align .pool @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ .section .iwram, "ax", %progbits .extern IntrTable .global IntrRout .align .arm IntrRout: mov r2, #0x04000000 @ r2 = REG_BASE ldr r3, [r2,#0x0200]! @ r2 = REG_IE, r3 = REG_IF<<16 | REG_IE mrs r0, spsr @ save spsr to r0 stmfd sp!, {r0-r2, lr} @ push {r0-r2, lr} and r1, r3, r3, lsr #0x10 @ r1 = REG_IE & REG_IF ldr r12, =IntrTable @ r12 = &IntrTable ands r0, r1, #0x01 @ \ bne .LIntrGo @ if(r0 = r1 & 0x0001) VBL intr add r12,r12, #0x04 @ r12 += 4 ands r0, r1, #0x02 @ \ bne .LIntrGo @ if(r0 = r1 & 0x0002) HBL intr add r12,r12, #0x04 @ r12 += 4 ands r0, r1, #0x04 @ \ bne .LIntrGo @ if(r0 = r1 & 0x0004) VCNT intr add r12,r12, #0x04 @ r12 += 4 ands r0, r1, #0x08 @ \ bne .LIntrGo @ if(r0 = r1 & 0x0008) TM0 intr add r12,r12, #0x04 @ r12 += 4 ands r0, r1, #0x10 @ \ bne .LIntrGo @ if(r0 = r1 & 0x0010) TM1 intr add r12,r12, #0x04 @ r12 += 4 ands r0, r1, #0x20 @ \ bne .LIntrGo @ if(r0 = r1 & 0x0020) TM2 intr add r12,r12, #0x04 @ r12 += 4 ands r0, r1, #0x40 @ \ bne .LIntrGo @ if(r0 = r1 & 0x0040) TM3 intr add r12,r12, #0x04 @ r12 += 4 ands r0, r1, #0x80 @ \ bne .LIntrGo @ if(r0 = r1 & 0x0080) serial intr add r12,r12, #0x04 @ r12 += 4 ands r0, r1, #0x100 @ \ bne .LIntrGo @ if(r0 = r1 & 0x0100) DMA0 intr add r12,r12, #0x04 @ r12 += 4 ands r0, r1, #0x200 @ \ bne .LIntrGo @ if(r0 = r1 & 0x0200) DMA1 intr add r12,r12, #0x04 @ r12 += 4 ands r0, r1, #0x400 @ \ bne .LIntrGo @ if(r0 = r1 & 0x0400) DMA2 intr add r12,r12, #0x04 @ r12 += 4 ands r0, r1, #0x800 @ \ bne .LIntrGo @ if(r0 = r1 & 0x0800) DMA3 intr add r12,r12, #0x04 @ r12 += 4 ands r0, r1, #0x1000 @ \ bne .LIntrGo @ if(r0 = r1 & 0x1000) keypad intr ands r0, r1, #0x2000 strneb r0, [r2, #-0x0284] @ REG_SNDCNT1 = r0 .LsndLoop: swine 0x02 bne .LsndLoop @ branch to .LsndLoop .LIntrGo: strh r0, [r2, #0x02] @ REG_IF = r0 ldr r3, [r2, #-0x0208] @ r3 = BIOS_IF orr r3, r3, r0 @ r3 |= r0 str r3, [r2, #-0x0208] @ BIOS_IF = r3 mrs r3, cpsr @ save cpsr bic r3, r3, #0xDF @ r3 &= ~0xDF (clear) orr r3, r3, #0x1F @ r3 |= 0x1F (IRQ + system mode?) msr cpsr, r3 @ restore cpsr ldr r0, [r12] @ get the handler's address cmp r0, #0x00 @ \ beq .LIntrPostRet @ if(adr == 0x00) goto .LIntrPostRet stmfd sp!, {lr} @ push {lr} adr lr, .LIntrRet @ lr = .LIntrRet bx r0 @ bx to r0 .LIntrRet: ldmfd sp!, {lr} @ pop {lr} .LIntrPostRet: mrs r3, cpsr @ save cpsr bic r3, r3, #0xDF @ r3 &= ~0xDF (clear) orr r3, r3, #0x92 @ r3 |= 0x92 (FIQ + IRQ mode?) msr cpsr, r3 @ store cpsr ldmfd sp!, {r0-r2, lr} @ pop {r0-r2, lr} msr spsr, r0 @ restore spsr bx lr @ bx to lr .align .end |
And this is the batch script:
Code: |
@echo off
setlocal enabledelayedexpansion path=%path%;C:\devKitPro\devKitARM\bin; set pre=arm-eabi set gas=%pre%-as set gcc=%pre%-gcc set fix=gbafix set cpy=%pre%-objcopy set nm=%pre%-nm set sflags=-mthumb-interwork set cflags=-c -mthumb -mthumb-interwork -O2 -ffast-math -ffreestanding -Wall cd source for %%f in (*.s) do ( %gas% %sflags% %%f -o %%f.o move %%f.o .. ) for %%f in (*.c) do ( %gcc% %cflags% -I../include %%f -o %%f.o move %%f.o .. ) cd.. set obj= for %%f in (*.o) do set obj=!obj! %%f %gcc% %obj% -o main.elf -nostartfiles -T misc/lnkscript.ld %cpy% -O binary main.elf main.gba %nm% -n -S main.elf > main.txt %fix% main.gba -p del *.o *.elf /q pause |