]> Chaos Git - corbenik/corbenik.git/commitdiff
Fix linker (hopefully)
authorroot <chaos.kagami@gmail.com>
Tue, 31 May 2016 02:13:46 +0000 (22:13 -0400)
committerroot <chaos.kagami@gmail.com>
Tue, 31 May 2016 02:13:46 +0000 (22:13 -0400)
17 files changed:
Makefile
copy.sh
host/symtab.sh [new file with mode: 0755]
linker.ld
modules/template/Makefile
modules/template/linker.ld
modules/template/src/exported.h
modules/template/src/main.c
modules/template/src/start.s [deleted file]
modules/template/src/symtab.h [new file with mode: 0644]
source/linker.c
source/patch/aadowngrade.c
source/patch/patch_file.h
source/patch/prot.c
source/patch/sig.c
source/patch/svc.c
source/patcher.c

index d56354624588184168a853f0a83714bffd56fb60..8c3d8ee3d4e28e5e59b88055ce790e07e312501b 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -20,16 +20,19 @@ dir_out    := out
 REVISION := r$(shell git rev-list --count HEAD):$(shell git rev-parse HEAD | head -c8)
 
 ASFLAGS := -mlittle-endian -mcpu=arm946e-s -march=armv5te
-CFLAGS  := -MMD -MP -Wall -Wextra -Werror -Os $(ASFLAGS) -fno-builtin -std=c11 -DVERSION=\"$(REVISION)\"
+CFLAGS  := -MMD -MP -Wall -Wextra -Werror -fno-omit-frame-pointer -Os $(ASFLAGS) -fno-builtin -std=c11 -DVERSION=\"$(REVISION)\"
 FLAGS   := dir_out=$(abspath $(dir_out)) --no-print-directory
-LDFLAGS := -nostdlib -Wl,-z,defs -lgcc
+LDFLAGS := -nostdlib -Wl,-z,defs -lgcc -Wl,-Map,$(dir_build)/link.map
 
 objects_cfw = $(patsubst $(dir_source)/%.s, $(dir_build)/%.o, \
                          $(patsubst $(dir_source)/%.c, $(dir_build)/%.o, \
                          $(call rwildcard, $(dir_source), *.s *.c)))
 
 .PHONY: all
-all: host/langemu.conf a9lh modules external
+all: a9lh modules external
+
+.PHONY: full
+full: host/langemu.conf all
 
 .PHONY: modules
 modules:
@@ -41,6 +44,8 @@ external:
 
 .PHONY: a9lh
 a9lh: $(dir_out)/arm9loaderhax.bin
+       echo "Generating symbol table"
+       ./host/symtab.sh > modules/template/src/symtab.h
 
 .PHONY: reformat
 reformat:
@@ -102,7 +107,6 @@ $(dir_build)/firm/%.o: $(dir_source)/firm/%.s
        @mkdir -p "$(@D)"
        $(COMPILE.s) $(OUTPUT_OPTION) $<
 
-
 $(dir_build)/patch/%.o: $(dir_source)/patch/%.c
        @mkdir -p "$(@D)"
        $(COMPILE.c) -Wno-unused-function $(OUTPUT_OPTION) $<
diff --git a/copy.sh b/copy.sh
index 10df3f296c55b8a0e0023ec4171689d050085371..ab6dce3e8d52e65d5c85cd1de8eb8c30dabedd47 100644 (file)
--- a/copy.sh
+++ b/copy.sh
@@ -4,7 +4,7 @@
 # You don't and shouldn't need to use it.
 
 mnt=/media/sd
-dev=/dev/sdd
+dev=/dev/sdb
 
 mnt=/mnt/ext1
 
diff --git a/host/symtab.sh b/host/symtab.sh
new file mode 100755 (executable)
index 0000000..35e185d
--- /dev/null
@@ -0,0 +1,18 @@
+#!/bin/bash
+echo "// This file is automatically generated. Don't edit it."
+echo "#ifndef __SYMTAB_H"
+echo "#define __SYMTAB_H"
+grep '                0x00000000........                ' build/link.map | \
+       while read sym; do
+       declare -a dat
+       dat=($sym)
+       offs=${dat[0]}
+       name=${dat[1]}
+
+       offs="$(echo "$offs" | sed 's|00000000||g')"
+
+       if [ "$name" != "." ]; then
+               echo "  #define ${name}_offset ((void*)${offs})"
+       fi
+done
+echo "#endif"
index 51bd05472562dc27b9c706094c17cf7afa05303d..802a17dba2cd163ada2015274fda90e6ad132feb 100644 (file)
--- a/linker.ld
+++ b/linker.ld
@@ -1,19 +1,3 @@
-/* This memory map is mainly to assist in doing stuff in code.
-MEMORY
-{
-    INSTRUCTION_TCM  (rw)   : ORIGIN = 0x00000000, LENGTH = 0x08000000
-    ARM_INTERNAL     (rw)  : ORIGIN = 0x08000000, LENGTH = 0x00100000
-    NEW_INTERNAL     (rw)  : ORIGIN = 0x08100000, LENGTH = 0x00080000
-    IO_MEMORY        (rw)  : ORIGIN = 0x10000000, LENGTH = 0x08000000
-    VRAM             (rw)  : ORIGIN = 0x18000000, LENGTH = 0x00600000
-    DSP_MEMORY       (rw)  : ORIGIN = 0x1FF00000, LENGTH = 0x00080000
-    AXI_WRAM         (rw)  : ORIGIN = 0x1FF80000, LENGTH = 0x00080000
-    FCRAM            (rwx) : ORIGIN = 0x20000000, LENGTH = 0x08000000
-    NEW_FCRAM        (rwx) : ORIGIN = 0x28000000, LENGTH = 0x08000000
-    DATA_TCM         (rw)  : ORIGIN = 0xFFF00000, LENGTH = 0x00004000
-    BOOTROM          (rw)   : ORIGIN = 0xFFFF0000, LENGTH = 0x00010000
-} */
-
 ENTRY(_start)
 SECTIONS
 {
index 972f9eed1dcbf2088fd56d0343d1ef2b9ae3f03a..6cebdc44bbb42a00e7e365fd1c76e8fb95eef28d 100644 (file)
@@ -14,7 +14,7 @@ dir_build  := build
 dir_out    := out
 
 ASFLAGS := -mlittle-endian -mcpu=arm946e-s -march=armv5te
-CFLAGS  := -MMD -MP -Wall -Wextra -Werror -O0 $(ASFLAGS) -fno-builtin -std=c11
+CFLAGS  := -MMD -MP -Wall -Wextra -Werror -Os -fno-omit-frame-pointer $(ASFLAGS) -fno-builtin -std=c11
 FLAGS   := dir_out=$(abspath $(dir_out)) --no-print-directory
 LDFLAGS := -nostdlib -Wl,-z,defs -lgcc
 
index 0a7a3ade4ffcf3e0ae26e2b6cab0200a9f9ff91a..b8eb07e3ebace6459289145319f477fb63f7ddd2 100644 (file)
@@ -1,4 +1,4 @@
-ENTRY(_start)
+ENTRY(main)
 SECTIONS
 {
     . = 0x24400000;
index 495cf313fcebf1746980760a93b75286ce2ffe04..13e6f3a85a4eda1ef272fe4e4afa93f1928a96ba 100644 (file)
@@ -1,33 +1,30 @@
 #ifndef EXPORTED_H
 #define EXPORTED_H
 
+#include "symtab.h"
+
 #include "headers.h"
 
 #define stdout ((void*)0)
 #define stderr ((void*)2)
 
-extern int strlen(const char *string);
-extern int isprint(char c);
-extern void memcpy(void *dest, const void *src, size_t size);
-extern void memmove(void *dest, const void *src, size_t size);
-extern void memset(void *dest, const int filler, size_t size);
-extern int memcmp(const void *buf1, const void *buf2, const size_t size);
-extern void strncpy(void *dest, const void *src, const size_t size);
-extern int strncmp(const void *buf1, const void *buf2, const size_t size);
-extern int atoi(const char *str);
-extern uint8_t* memfind (uint8_t *string, uint32_t stringlen, uint8_t *pat, uint32_t patlen);
-
-extern void putc(void* buf, const int c);
-extern void puts(void* buf, const char *string);
-extern void fprintf(void* channel, const char* format, ...);
-
-extern firm_h* get_firm();
-extern exefs_h* get_firm_proc9_exefs();
-
-extern firm_h* get_agb();
-extern exefs_h* get_agb_proc9_exefs();
-
-extern firm_h* get_twl();
-extern exefs_h* get_twl_proc9_exefs();
+int  (*strlen)(const char *string) = strlen_offset;
+int  (*isprint)(char c) = isprint_offset;
+void (*memcpy)(void *dest, const void *src, size_t size) = memcpy_offset;
+void (*memmove)(void *dest, const void *src, size_t size) = memmove_offset;
+void (*memset)(void *dest, const int filler, size_t size) = memset_offset;
+int  (*memcmp)(const void *buf1, const void *buf2, const size_t size) = memcmp_offset;
+void (*strncpy)(void *dest, const void *src, const size_t size) = strncpy_offset;
+int  (*strncmp)(const void *buf1, const void *buf2, const size_t size) = strncmp_offset;
+int  (*atoi)(const char *str) = atoi_offset;
+uint8_t* (*memfind)(uint8_t *string, uint32_t stringlen, uint8_t *pat, uint32_t patlen) = memfind_offset;
+
+void (*putc)(void* buf, const int c) = putc_offset;
+void (*puts)(void* buf, const char *string) = puts_offset;
+void (*fprintf)(void* channel, const char* format, ...) = fprintf_offset;
+
+exefs_h* (*get_firm_proc9_exefs)() = get_firm_proc9_exefs_offset;
+exefs_h* (*get_agb_proc9_exefs)() = get_agb_proc9_exefs_offset;
+exefs_h* (*get_twl_proc9_exefs)() = get_twl_proc9_exefs_offset;
 
 #endif
index a790f751d33f251661147e1a2bd565837642f15b..75ec0569d389345fa04a546bff500005836a92e9 100644 (file)
@@ -3,8 +3,7 @@
 #include "exported.h"
 
 int main() {
-       // Your patch goes here.
-       fprintf(stderr, "Hi, I'm a patch!\n");
+       fprintf(stderr, "Hi!\n");
 
        return 0;
 }
diff --git a/modules/template/src/start.s b/modules/template/src/start.s
deleted file mode 100644 (file)
index 5898ae6..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-.section .text.start
-.align 4
-.global _start
-_start:
-       b main
-
-.macro stub name
-       .global \name
-       \name :
-               ldr pc, [pc, #-4] // Load the data after this to the PC. return will be before this call.
-               bx lr // Fall through in case of error.
-.endm
-
-// memory.c
-stub strlen
-stub isprint
-stub memcpy
-stub memmove
-stub memset
-stub memcmp
-stub strncpy
-stub strncmp
-stub atoi
-stub memfind
-
-// draw.c
-stub putc
-stub puts
-stub fprintf
-
-// Wrappers to get shit.
-
-// Get NATIVE_FIRM process9
-stub get_firm_proc9_exefs
-
-// Get AGB_FIRM process9 exefs
-stub get_agb_proc9_exefs
-
-// Get TWL_FIRM process9 exefs
-stub get_twl_proc9_exefs
diff --git a/modules/template/src/symtab.h b/modules/template/src/symtab.h
new file mode 100644 (file)
index 0000000..49bb47e
--- /dev/null
@@ -0,0 +1,195 @@
+// This file is automatically generated. Don't edit it.
+#ifndef __SYMTAB_H
+#define __SYMTAB_H
+  #define START_SECTION_offset ((void*)0x23f00000)
+  #define _start_offset ((void*)0x23f00000)
+  #define START_SECTION_END_offset ((void*)0x23f000e0)
+  #define TEXT_SECTION_offset ((void*)0x23f000e0)
+  #define getMMCDevice_offset ((void*)0x23f001dc)
+  #define geterror_offset ((void*)0x23f00204)
+  #define inittarget_offset ((void*)0x23f0021c)
+  #define sdmmc_send_command_offset ((void*)0x23f00274)
+  #define sdmmc_sdcard_writesectors_offset ((void*)0x23f004bc)
+  #define sdmmc_sdcard_readsectors_offset ((void*)0x23f00538)
+  #define sdmmc_nand_readsectors_offset ((void*)0x23f005b4)
+  #define sdmmc_nand_writesectors_offset ((void*)0x23f0063c)
+  #define InitSD_offset ((void*)0x23f006c4)
+  #define Nand_Init_offset ((void*)0x23f00848)
+  #define SD_Init_offset ((void*)0x23f00a04)
+  #define sdmmc_sdcard_init_offset ((void*)0x23f00c28)
+  #define sdmmc_get_cid_offset ((void*)0x23f00c48)
+  #define ff_convert_offset ((void*)0x23f014b0)
+  #define ff_wtoupper_offset ((void*)0x23f01698)
+  #define clust2sect_offset ((void*)0x23f016bc)
+  #define get_fat_offset ((void*)0x23f016e8)
+  #define put_fat_offset ((void*)0x23f01924)
+  #define f_mount_offset ((void*)0x23f02a24)
+  #define f_open_offset ((void*)0x23f02ab4)
+  #define f_read_offset ((void*)0x23f02cc4)
+  #define f_write_offset ((void*)0x23f02ee8)
+  #define f_sync_offset ((void*)0x23f0316c)
+  #define f_close_offset ((void*)0x23f03270)
+  #define f_chdir_offset ((void*)0x23f0329c)
+  #define f_lseek_offset ((void*)0x23f03338)
+  #define f_opendir_offset ((void*)0x23f03560)
+  #define f_closedir_offset ((void*)0x23f03644)
+  #define f_readdir_offset ((void*)0x23f03660)
+  #define f_stat_offset ((void*)0x23f036fc)
+  #define f_getfree_offset ((void*)0x23f03780)
+  #define f_truncate_offset ((void*)0x23f038e8)
+  #define f_unlink_offset ((void*)0x23f03a00)
+  #define f_mkdir_offset ((void*)0x23f03b38)
+  #define f_chmod_offset ((void*)0x23f03d70)
+  #define f_rename_offset ((void*)0x23f03e1c)
+  #define f_utime_offset ((void*)0x23f03fcc)
+  #define waitcycles_offset ((void*)0x23f04084)
+  #define disk_status_offset ((void*)0x23f040a4)
+  #define disk_initialize_offset ((void*)0x23f040b4)
+  #define disk_read_offset ((void*)0x23f040d0)
+  #define disk_write_offset ((void*)0x23f040f8)
+  #define disk_ioctl_offset ((void*)0x23f04120)
+  #define patch_example_offset ((void*)0x23f04180)
+  #define patch_signatures_offset ((void*)0x23f041a0)
+  #define getSvcAndExceptions_offset ((void*)0x23f042d4)
+  #define patch_services_offset ((void*)0x23f04360)
+  #define patch_aadowngrade_offset ((void*)0x23f04534)
+  #define patch_modules_offset ((void*)0x23f045b0)
+  #define patch_firmprot_offset ((void*)0x23f0476c)
+  #define wait_offset ((void*)0x23f0486c)
+  #define patch_firm_all_offset ((void*)0x23f048d4)
+  #define clear_disp_offset ((void*)0x23f04a08)
+  #define clear_text_offset ((void*)0x23f04a80)
+  #define clear_screen_offset ((void*)0x23f04b34)
+  #define set_cursor_offset ((void*)0x23f04b54)
+  #define clear_screens_offset ((void*)0x23f04b8c)
+  #define draw_character_offset ((void*)0x23f04bb4)
+  #define shut_up_offset ((void*)0x23f04cb4)
+  #define putc_offset ((void*)0x23f04cd8)
+  #define puts_offset ((void*)0x23f04f10)
+  #define put_int64_offset ((void*)0x23f04f68)
+  #define put_uint64_offset ((void*)0x23f0507c)
+  #define put_hexdump_offset ((void*)0x23f05158)
+  #define put_uint_offset ((void*)0x23f051ac)
+  #define put_int_offset ((void*)0x23f051d0)
+  #define fflush_offset ((void*)0x23f051f4)
+  #define vfprintf_offset ((void*)0x23f05368)
+  #define fprintf_offset ((void*)0x23f0560c)
+  #define strlen_offset ((void*)0x23f05664)
+  #define isprint_offset ((void*)0x23f0568c)
+  #define memcpy_offset ((void*)0x23f056a8)
+  #define memmove_offset ((void*)0x23f0573c)
+  #define memset_offset ((void*)0x23f057e0)
+  #define memcmp_offset ((void*)0x23f05840)
+  #define strncpy_offset ((void*)0x23f0587c)
+  #define strncmp_offset ((void*)0x23f058b4)
+  #define atoi_offset ((void*)0x23f05928)
+  #define memfind_offset ((void*)0x23f05958)
+  #define fmount_offset ((void*)0x23f05a10)
+  #define fopen_offset ((void*)0x23f05a80)
+  #define fclose_offset ((void*)0x23f05b54)
+  #define fumount_offset ((void*)0x23f05b80)
+  #define fseek_offset ((void*)0x23f05bd8)
+  #define ftell_offset ((void*)0x23f05c54)
+  #define feof_offset ((void*)0x23f05c7c)
+  #define fsize_offset ((void*)0x23f05ccc)
+  #define fwrite_offset ((void*)0x23f05cf4)
+  #define fread_offset ((void*)0x23f05d4c)
+  #define write_file_offset ((void*)0x23f05da4)
+  #define read_file_offset ((void*)0x23f05dfc)
+  #define regenerate_config_offset ((void*)0x23f05e54)
+  #define load_config_offset ((void*)0x23f05f3c)
+  #define save_config_offset ((void*)0x23f06074)
+  #define get_firm_proc9_exefs_offset ((void*)0x23f06100)
+  #define get_twl_proc9_exefs_offset ((void*)0x23f06118)
+  #define get_agb_proc9_exefs_offset ((void*)0x23f06130)
+  #define execp_offset ((void*)0x23f06148)
+  #define wait_key_offset ((void*)0x23f0623c)
+  #define header_offset ((void*)0x23f062f4)
+  #define menu_patches_offset ((void*)0x23f06320)
+  #define menu_options_offset ((void*)0x23f06330)
+  #define menu_info_offset ((void*)0x23f06790)
+  #define menu_help_offset ((void*)0x23f06864)
+  #define menu_reset_offset ((void*)0x23f068cc)
+  #define menu_poweroff_offset ((void*)0x23f068fc)
+  #define menu_main_offset ((void*)0x23f0692c)
+  #define menu_handler_offset ((void*)0x23f06af0)
+  #define arm11_preboot_halt_offset ((void*)0x23f06ba0)
+  #define slot0x11key96_init_offset ((void*)0x23f06bdc)
+  #define decrypt_firm_title_offset ((void*)0x23f06c50)
+  #define decrypt_arm9bin_offset ((void*)0x23f06db8)
+  #define decrypt_firm_offset ((void*)0x23f06f28)
+  #define load_firm_offset ((void*)0x23f06fac)
+  #define boot_firm_offset ((void*)0x23f0723c)
+  #define find_proc9_offset ((void*)0x23f073cc)
+  #define load_firms_offset ((void*)0x23f074b0)
+  #define boot_cfw_offset ((void*)0x23f07660)
+  #define aes_setkey_offset ((void*)0x23f076a8)
+  #define aes_use_keyslot_offset ((void*)0x23f07714)
+  #define aes_setiv_offset ((void*)0x23f0773c)
+  #define aes_advctr_offset ((void*)0x23f077a8)
+  #define aes_change_ctrmode_offset ((void*)0x23f0786c)
+  #define aes_batch_offset ((void*)0x23f078e0)
+  #define aes_offset ((void*)0x23f07990)
+  #define ncch_getctr_offset ((void*)0x23f07aa4)
+  #define sha_wait_idle_offset ((void*)0x23f07b64)
+  #define sha_offset ((void*)0x23f07b84)
+  #define rsa_wait_idle_offset ((void*)0x23f07c78)
+  #define rsa_use_keyslot_offset ((void*)0x23f07c98)
+  #define rsa_setkey_offset ((void*)0x23f07cbc)
+  #define rsa_iskeyset_offset ((void*)0x23f07d64)
+  #define rsa_offset ((void*)0x23f07d84)
+  #define rsa_verify_offset ((void*)0x23f07e24)
+  #define get_firm_info_offset ((void*)0x23f07e88)
+  #define i2cGetDeviceBusId_offset ((void*)0x23f07ed8)
+  #define i2cGetDeviceRegAddr_offset ((void*)0x23f07ef0)
+  #define i2cGetDataReg_offset ((void*)0x23f07f0c)
+  #define i2cGetCntReg_offset ((void*)0x23f07f28)
+  #define i2cWaitBusy_offset ((void*)0x23f07f44)
+  #define i2cGetResult_offset ((void*)0x23f07f6c)
+  #define i2cStop_offset ((void*)0x23f07f9c)
+  #define i2cSelectDevice_offset ((void*)0x23f07fd4)
+  #define i2cSelectRegister_offset ((void*)0x23f08014)
+  #define i2cReadRegister_offset ((void*)0x23f08054)
+  #define i2cReadRegisterBuffer_offset ((void*)0x23f08118)
+  #define i2cWriteRegister_offset ((void*)0x23f08250)
+  #define __udivsi3_offset ((void*)0x23f08308)
+  #define __aeabi_uidiv_offset ((void*)0x23f08308)
+  #define __aeabi_uidivmod_offset ((void*)0x23f083fc)
+  #define __aeabi_ldiv0_offset ((void*)0x23f0841c)
+  #define __aeabi_idiv0_offset ((void*)0x23f0841c)
+  #define __aeabi_ldivmod_offset ((void*)0x23f08420)
+  #define __aeabi_uldivmod_offset ((void*)0x23f084f4)
+  #define __udivmoddi4_offset ((void*)0x23f08530)
+  #define __clzdi2_offset ((void*)0x23f0865c)
+  #define __clzsi2_offset ((void*)0x23f08684)
+  #define TEXT_SECTION_END_offset ((void*)0x23f086cc)
+  #define DATA_SECTION_offset ((void*)0x23f086cc)
+  #define main_offset ((void*)0x23f086cc)
+  #define color_top_offset ((void*)0x23f08764)
+  #define color_bottom_offset ((void*)0x23f08765)
+  #define firm_loc_offset ((void*)0x23f08e64)
+  #define twl_firm_loc_offset ((void*)0x23f08e70)
+  #define agb_firm_loc_offset ((void*)0x23f08e78)
+  #define fcram_temp_offset ((void*)0x23f08e7c)
+  #define firm_signatures_offset ((void*)0x23f08e80)
+  #define DATA_SECTION_END_offset ((void*)0x23f09150)
+  #define BSS_SECTION_offset ((void*)0x23f09150)
+  #define handelSD_offset ((void*)0x23f09150)
+  #define handelNAND_offset ((void*)0x23f0918c)
+  #define memory_header_t_offset ((void*)0x23f091d0)
+  #define freeSpace_offset ((void*)0x23f091d8)
+  #define kill_output_offset ((void*)0x23f0a708)
+  #define conf_handle_offset ((void*)0x23f13580)
+  #define config_offset ((void*)0x23f13584)
+  #define doing_autoboot_offset ((void*)0x23f13e90)
+  #define firm_loaded_offset ((void*)0x23f13e98)
+  #define twl_firm_p9_exefs_offset ((void*)0x23f13e9c)
+  #define firm_p9_exefs_offset ((void*)0x23f13ea0)
+  #define agb_firm_proc9_offset ((void*)0x23f13ea4)
+  #define twl_firm_proc9_offset ((void*)0x23f13ed4)
+  #define firm_proc9_offset ((void*)0x23f13f04)
+  #define agb_firm_p9_exefs_offset ((void*)0x23f13f34)
+  #define BSS_SECTION_END_offset ((void*)0x23f13f38)
+  #define RODATA_SECTION_offset ((void*)0x23f13f38)
+  #define RODATA_SECTION_END_offset ((void*)0x23f148f8)
+#endif
index 219c435afe5d232c69f277169a7384f114ad0aeb..46a7dd7270887b4b7ad80113c0e8bd06257bbe7e 100644 (file)
@@ -57,38 +57,6 @@ execp(char* path)
 
     fclose(f);
 
-    fprintf(stderr, "[s]");
-
-    uint32_t* link_table = (uint32_t*)(FCRAM_PATCHBIN_EXEC_LOC + 4);
-
-    fprintf(stderr, "[r]");
-
-    // 0 - magic
-
-    // memory.c
-    link_table[2] = (uint32_t)strlen;
-    link_table[4] = (uint32_t)isprint;
-    link_table[6] = (uint32_t)memcpy;
-    link_table[8] = (uint32_t)memmove;
-    link_table[10] = (uint32_t)memset;
-    link_table[12] = (uint32_t)memcmp;
-    link_table[14] = (uint32_t)strncpy;
-    link_table[16] = (uint32_t)strncmp;
-    link_table[18] = (uint32_t)atoi;
-    link_table[20] = (uint32_t)memfind;
-
-    // draw.c
-    link_table[22] = (uint32_t)putc;
-    link_table[24] = (uint32_t)puts;
-    link_table[26] = (uint32_t)fprintf;
-
-    // Get functions
-    link_table[28] = (uint32_t)get_firm_proc9_exefs;
-
-    link_table[30] = (uint32_t)get_agb_proc9_exefs;
-
-    link_table[32] = (uint32_t)get_twl_proc9_exefs;
-
     fprintf(stderr, "[b]\n");
 
     int (*patch_loc)() = (void*)FCRAM_PATCHBIN_EXEC_LOC;
index bdd62e26f5117751f22f88bf1dc094562e8f6bd5..631682b263ba46cc0f94d6a51d52c5840ba5530e 100644 (file)
@@ -4,6 +4,8 @@
 
 PATCH(aadowngrade)
 {
+       exefs_h* firm_p9_exefs = get_firm_proc9_exefs();
+
     uint8_t* firm_mem = (uint8_t*)firm_p9_exefs + sizeof(exefs_h) +
                         firm_p9_exefs->fileHeaders[0].offset;
     uint32_t size = firm_p9_exefs->fileHeaders[0].size;
index c6c88a624c0ebb77c69a2dbb80e13d7d9df5654f..81c1fa81aca2e70af6cf29954e6e8764678e5683 100644 (file)
 #include "../config.h"
 #include "../common.h"
 
+exefs_h* get_firm_proc9_exefs();
+exefs_h* get_twl_proc9_exefs();
+exefs_h* get_agb_proc9_exefs();
+
 #define PATCH(name) int patch_##name()
 #elif MODULE
 // Build patch as loadable executable.
 
 // TODO - Includes.
 
-#define PATCH(name) int main()
+#define PATCH(name) int patch()
 #else
 #define PATCH(name) (void)
 
index 376bc426df2e68ad65ec5dd410d1a6fdbdf4a889..869bb5e29e90f9f718c181a727fd8ec58f5a7f44 100644 (file)
@@ -4,6 +4,8 @@
 
 PATCH(firmprot)
 {
+       exefs_h* firm_p9_exefs = get_firm_proc9_exefs();
+
     uint8_t* firm_mem = (uint8_t*)firm_p9_exefs + sizeof(exefs_h) +
                         firm_p9_exefs->fileHeaders[0].offset;
     uint32_t size = firm_p9_exefs->fileHeaders[0].size;
index 376d906f16f591950e3fe36b226f603ad1e67cd6..1f85495c107f895a1ba606eb5ee2248c664a00c1 100644 (file)
@@ -4,6 +4,8 @@
 
 PATCH(signatures)
 {
+       exefs_h* firm_p9_exefs = get_firm_proc9_exefs();
+
     // Look for signature checks
 
     uint8_t pat1[] = { 0xC0, 0x1C, 0x76, 0xE7 };
index a77ed888f581129b99f730f236672fb7ebfa44b6..912675bc1181c9a14ac08ca1bec286f5d15ddd96 100644 (file)
@@ -43,8 +43,8 @@ PATCH(services)
     char* at = str + (strlen(str) - 6);
     for (uint32_t i = 0; i <= 0xff; i++) {
         // Get string for svc.
-        at[0] = ("0123456789abcdef")[(
-            (i >> 4) & 0xf)]; // This is just hexdump. Nothing complicated.
+        at[0] = ("0123456789abcdef")[((i >> 4) & 0xf)];
+               // This is just hexdump. Nothing complicated.
         at[1] = ("0123456789abcdef")[(i & 0xf)];
 
         FILE* data = fopen(str, "r");
index fb55a2c3a3a5e28f53b5ea725ef8862b318af4fc..713500f1d9e0b0eee90e4dbaf616135fea627994 100644 (file)
@@ -32,7 +32,7 @@ int
 patch_firm_all()
 {
     // FIXME - Linker is bork at the moment.
-    // execp(PATH_PATCHES "/example.vco");
+    execp(PATH_PATCHES "/example.vco");
 
     // wait();