Added relocation support and did my best to do work w/ them

This commit is contained in:
Morten Delenk 2016-08-10 15:43:54 +02:00
parent d5d02f8b5b
commit 318cd6adab
No known key found for this signature in database
GPG key ID: 3F818D0F65DCB490
11 changed files with 30 additions and 16 deletions

View file

@ -5,7 +5,7 @@ SRCS = $(shell find . -name '*.[cS]')
OBJS = $(addsuffix .o,$(basename $(SRCS))) OBJS = $(addsuffix .o,$(basename $(SRCS)))
ASFLAGS = ASFLAGS =
CFLAGS += -I. -fno-stack-protector -nostdinc -ffreestanding -std=c11 -fno-builtin -w -Werror -nostdlib -fpie CFLAGS += -I. -fno-stack-protector -nostdinc -ffreestanding -std=c11 -fno-builtin -w -Werror -nostdlib -fpie
LDFLAGS += -T loader.ld LDFLAGS = -T loader.ld
all: $(OBJS) all: $(OBJS)
$(LD) $(LDFLAGS) -o loader.elf $(OBJS) -L$(HOME)/opt/lib/gcc/$(libpath)/6.1.0/ -lgcc $(LD) $(LDFLAGS) -o loader.elf $(OBJS) -L$(HOME)/opt/lib/gcc/$(libpath)/6.1.0/ -lgcc
objcopy -O binary loader.elf loader.bin objcopy -O binary loader.elf loader.bin

View file

@ -2,7 +2,7 @@
#include "sdmmc.h" #include "sdmmc.h"
#include "fatfs/ff.h" #include "fatfs/ff.h"
char *lfb=(char*)0x18346500; char *lfb=(char*)0x18346500;
#ifndef ARM9 #ifdef ARM9
#define DIAGPXL(i) (lfb[6*(i)]=lfb[6*(i)+1]=lfb[6*(i)+2]=0xFF) #define DIAGPXL(i) (lfb[6*(i)]=lfb[6*(i)+1]=lfb[6*(i)+2]=0xFF)
#else #else
#define DIAGPXL(i) (0) #define DIAGPXL(i) (0)
@ -75,6 +75,8 @@ void init() {
f_open(&dsp_txt9, "dsp_txt.neun", FA_READ | FA_OPEN_EXISTING); f_open(&dsp_txt9, "dsp_txt.neun", FA_READ | FA_OPEN_EXISTING);
f_read(&dsp_txt9, (void*)off, f_size(&dsp_txt9), &br); f_read(&dsp_txt9, (void*)off, f_size(&dsp_txt9), &br);
off+=f_size(&dsp_txt9); off+=f_size(&dsp_txt9);
off&=~0xfff;
off+=0x1000;
FIL dsp_txt11; FIL dsp_txt11;
arm11modtable[0]=off; arm11modtable[0]=off;
arm11modtable[1]=0; arm11modtable[1]=0;

View file

@ -5,7 +5,7 @@ SRCS = $(shell find . -name '*.[cS]')
OBJS = $(addsuffix .o,$(basename $(SRCS))) OBJS = $(addsuffix .o,$(basename $(SRCS)))
ASFLAGS += ASFLAGS +=
CFLAGS += -fno-stack-protector -nostdinc -ffreestanding -std=c11 -fno-builtin -w -Werror -nostdlib -fpie CFLAGS += -fno-stack-protector -nostdinc -ffreestanding -std=c11 -fno-builtin -w -Werror -nostdlib -fpie
LDFLAGS += -T loader.ld LDFLAGS = -T loader.ld
all: $(OBJS) all: $(OBJS)
$(LD) $(LDFLAGS) -o loader.bin $(OBJS) $(LD) $(LDFLAGS) -o loader.bin $(OBJS)

View file

@ -5,7 +5,7 @@ SRCS = $(shell find . -name '*.[cS]')
OBJS = $(addsuffix .o,$(basename $(SRCS))) OBJS = $(addsuffix .o,$(basename $(SRCS)))
ASFLAGS = ASFLAGS =
CFLAGS += -fno-stack-protector -nostdinc -ffreestanding -std=c11 -fno-builtin -w -Werror -nostdlib -fpie CFLAGS += -fno-stack-protector -nostdinc -ffreestanding -std=c11 -fno-builtin -w -Werror -nostdlib -fpie
LDFLAGS += -T loader.ld LDFLAGS = -T loader.ld
all: $(OBJS) all: $(OBJS)
$(LD) $(LDFLAGS) -o loader.bin $(OBJS) $(LD) $(LDFLAGS) -o loader.bin $(OBJS)

View file

@ -2,7 +2,7 @@ arch = 3ds
subvar = 9 subvar = 9
MODE = debug MODE = debug
export PATH := $(HOME)/opt/bin:$(PATH) export PATH := $(HOME)/opt/bin:$(PATH)
LDFLAGS = LDFLAGS = -fPIC
ifeq ($(arch),x86) ifeq ($(arch),x86)
PREFIX = i686-mtgos- PREFIX = i686-mtgos-
libpath = i686-mtgos libpath = i686-mtgos
@ -37,5 +37,5 @@ else
CPPFLAGS := -O2 CPPFLAGS := -O2
endif endif
ASFLAGS += $(ARCHFLAGS) ASFLAGS += $(ARCHFLAGS)
CFLAGS += $(ARCHFLAGS) CFLAGS += -fPIC $(ARCHFLAGS)
CPPFLAGS += $(ARCHFLAGS) CPPFLAGS += -fPIC $(ARCHFLAGS)

View file

@ -68,12 +68,19 @@ extern "C" void _start(void ** modtable) {
break; break;
DIAGPXL(15); DIAGPXL(15);
void(**(*fptr)(void*))() = load((Elf_Ehdr*) modtable[i]); void(**(*fptr)(void*))() = load((Elf_Ehdr*) modtable[i]);
fptr=(void(**(*)(void*))())((unsigned int)fptr-8);
DIAGPXL(16); DIAGPXL(16);
debugNumber((unsigned int)fptr,50);
// debugNumber((unsigned int)modtable[i],50+32);
if(!fptr) if(!fptr)
continue; continue;
DIAGPXL(17); DIAGPXL(17);
void(**table)()=fptr(modtable[i]); void(**table)()=fptr(modtable[i]);
DIAGPXL(18); DIAGPXL(18);
table=(void(**)())((unsigned int)table+(unsigned int)modtable[i]+0x1000);
unsigned int* tbl=(unsigned int*)table;
tbl[0]+=(unsigned int)modtable[i]+0x1000;
debugNumber((unsigned int)table[0],50+32);
ModType type=((getType_type)table[0])(); //Get module type ModType type=((getType_type)table[0])(); //Get module type
DIAGPXL(19); DIAGPXL(19);
if(type!=ModType::output_text) if(type!=ModType::output_text)

View file

@ -103,7 +103,7 @@ private:
void(*tbl[3])()={(void(*)())&getType,(void(*)())&size_of,(void(*)())&spawnAt}; void(*tbl[3])()={(void(*)())&getType,(void(*)())&size_of,(void(*)())&spawnAt};
table_type getTable() { table_type getTable() {
x=y=0; x=y=0;
doCtors(); // doCtors();
DIAGPXL(23); DIAGPXL(23);
return (table_type)&tbl; return (table_type)&tbl;
} }

View file

@ -3,7 +3,7 @@ OUTPUT_FORMAT(elf32-littlearm)
OUTPUT_ARCH(arm) OUTPUT_ARCH(arm)
SECTIONS SECTIONS
{ {
. = 0x20010000; . = 0;
module_start = .; module_start = .;
.text : { .text : {
*(.text) *(.text)
@ -28,6 +28,9 @@ SECTIONS
*(.bss) *(.bss)
*(COMMON) *(COMMON)
} }
.plt : {
*(.plt)
}
.rel.plt : { .rel.plt : {
*(.rel.plt) *(.rel.plt)
} }

Binary file not shown.

Binary file not shown.

2
out Normal file
View file

@ -0,0 +1,2 @@
Ny41TQkvdXNyL2xvY2FsL2xpYmV4ZWMvZ2NjNDgvZ2NjL3g4Nl82NC1wb3J0Ymxk
LWZyZWVic2QxMS4wLzQuOC41L2NjMXBsdXMK