mirror of
				https://github.com/brain-hackers/lab
				synced 2025-11-04 06:28:36 +09:00 
			
		
		
		
	Add linkerscript (experimental)
This commit is contained in:
		
							
								
								
									
										31
									
								
								x1/linkerscript/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								x1/linkerscript/Makefile
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
			
		||||
CROSS_COMPILE := arm-linux-gnueabihf-
 | 
			
		||||
AS := $(CROSS_COMPILE)as
 | 
			
		||||
CC := $(CROSS_COMPILE)gcc
 | 
			
		||||
LD := $(CROSS_COMPILE)ld
 | 
			
		||||
OBJCOPY := $(CROSS_COMPILE)objcopy
 | 
			
		||||
 | 
			
		||||
TARGET := AppMain
 | 
			
		||||
OBJS := crt0.o main.o
 | 
			
		||||
 | 
			
		||||
ASFLAGS := -W
 | 
			
		||||
CFLAGS := -Wall -ffreestanding -fomit-frame-pointer -Os
 | 
			
		||||
LDFLAGS := -T x1.ld
 | 
			
		||||
 | 
			
		||||
.PHONY:
 | 
			
		||||
all: $(TARGET).bin
 | 
			
		||||
 | 
			
		||||
.PHONY:
 | 
			
		||||
clean:
 | 
			
		||||
	-rm -f $(TARGET).bin $(TARGET).elf $(OBJS)
 | 
			
		||||
 | 
			
		||||
%.o: %.s
 | 
			
		||||
	$(AS) $(ASFLAGS) $< -o $@
 | 
			
		||||
 | 
			
		||||
%.o: %.c
 | 
			
		||||
	$(CC) -c $(CFLAGS) $<
 | 
			
		||||
 | 
			
		||||
$(TARGET).elf: $(OBJS)
 | 
			
		||||
	$(LD) $(LDFLAGS) $^ -o $@
 | 
			
		||||
 | 
			
		||||
$(TARGET).bin: $(TARGET).elf
 | 
			
		||||
	$(OBJCOPY) -O binary $< $@
 | 
			
		||||
							
								
								
									
										41
									
								
								x1/linkerscript/crt0.s
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								x1/linkerscript/crt0.s
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,41 @@
 | 
			
		||||
.text
 | 
			
		||||
.arm
 | 
			
		||||
.align 4
 | 
			
		||||
 | 
			
		||||
.global _start
 | 
			
		||||
_start:
 | 
			
		||||
    stmdb   sp!, {r4, lr}
 | 
			
		||||
    /* store context */
 | 
			
		||||
    movs    r4, r0
 | 
			
		||||
 | 
			
		||||
    /* Clear the .bss section */
 | 
			
		||||
    bl      .L_clean_bss
 | 
			
		||||
 | 
			
		||||
    /* restore context */
 | 
			
		||||
    adr     r0, [.L_context]
 | 
			
		||||
    str     r4, [r0]
 | 
			
		||||
    ldr     r0, [r0]
 | 
			
		||||
 | 
			
		||||
    /* call user's main */
 | 
			
		||||
    bl      main
 | 
			
		||||
 | 
			
		||||
    ldmia   sp!, {r4, pc}
 | 
			
		||||
 | 
			
		||||
.L_context:
 | 
			
		||||
.long 0
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
    r0 = start address
 | 
			
		||||
    r1 = end address
 | 
			
		||||
    tmp: r2
 | 
			
		||||
*/
 | 
			
		||||
.L_clean_bss:
 | 
			
		||||
    ldr     r0, =__bss_start
 | 
			
		||||
    ldr     r1, =__bss_end
 | 
			
		||||
    sub     r1, r1, #4
 | 
			
		||||
    mov     r2, #0
 | 
			
		||||
.L_clean_bss_loop:
 | 
			
		||||
    cmp     r0, r1
 | 
			
		||||
    strlt   r2, [r0], #4
 | 
			
		||||
    blt     .L_clean_bss_loop
 | 
			
		||||
    bx      lr
 | 
			
		||||
							
								
								
									
										4
									
								
								x1/linkerscript/main.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								x1/linkerscript/main.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,4 @@
 | 
			
		||||
int main(void *arg)
 | 
			
		||||
{
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										51
									
								
								x1/linkerscript/x1.ld
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								x1/linkerscript/x1.ld
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,51 @@
 | 
			
		||||
OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
 | 
			
		||||
OUTPUT_ARCH(arm)
 | 
			
		||||
ENTRY(_start)
 | 
			
		||||
 | 
			
		||||
MEMORY {
 | 
			
		||||
    RAM (xrw): ORIGIN = 0x90000000, LENGTH = 15M
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
SECTIONS {
 | 
			
		||||
    .text : {
 | 
			
		||||
        *(.text)
 | 
			
		||||
        *(.text*)
 | 
			
		||||
        *(.rodata)
 | 
			
		||||
        *(.rodata*)
 | 
			
		||||
        *(.glue_7)
 | 
			
		||||
        *(.glue_7t)
 | 
			
		||||
 | 
			
		||||
        KEEP (*(.init))
 | 
			
		||||
        KEEP (*(.fini))
 | 
			
		||||
 | 
			
		||||
        . = ALIGN(4);
 | 
			
		||||
    } > RAM
 | 
			
		||||
 | 
			
		||||
    .data : {
 | 
			
		||||
        *(.data)
 | 
			
		||||
        *(.data*)
 | 
			
		||||
        . = ALIGN(4);
 | 
			
		||||
    } > RAM
 | 
			
		||||
 | 
			
		||||
    .bss : {
 | 
			
		||||
        __bss_start = .;
 | 
			
		||||
        *(.bss)
 | 
			
		||||
        *(COMMON)
 | 
			
		||||
        . = ALIGN(4);
 | 
			
		||||
        __bss_end = .;
 | 
			
		||||
    } > RAM
 | 
			
		||||
 | 
			
		||||
    /DISCARD/ : {
 | 
			
		||||
        *(.discard)
 | 
			
		||||
        *(.discard.*)
 | 
			
		||||
        *(.comment)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .stab 0 : { *(.stab) }
 | 
			
		||||
	.stabstr 0 : { *(.stabstr) }
 | 
			
		||||
	.stab.excl 0 : { *(.stab.excl) }
 | 
			
		||||
	.stab.exclstr 0 : { *(.stab.exclstr) }
 | 
			
		||||
	.stab.index 0 : { *(.stab.index) }
 | 
			
		||||
	.stab.indexstr 0 : { *(.stab.indexstr) }
 | 
			
		||||
    .ARM.attributes 0 : { *(.ARM.attributes) }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user