It works!
Just managed to get the relocating loader run it's first bit of code successfully:
~/src/elf-loader-1.0# ./reloc-test elf_reloc_core `e-test-reloc.elf' to core 0,0 at 0x18000-0x1ffff dump of section headers Type name addr offset size entsz link info addralign flags 00: 0 SHT_NULL 00000000 00000000 00000000 0 0 0 0000000 01: 1 SHT_PROGBITS .init 00000000 00000034 00000024 0 0 0 0000002 SHF_ALLOC SHF_EXECINSTR 02: 4 SHT_RELA .rela.init 00000000 000047dc 00000030 12 36 1 0000004 03: 1 SHT_PROGBITS .text 00000000 00000060 00000398 0 0 0 0000016 SHF_ALLOC SHF_EXECINSTR 04: 4 SHT_RELA .rela.text 00000000 0000480c 00000324 12 36 3 0000004 05: 1 SHT_PROGBITS .fini 00000000 000003f8 0000001a 0 0 0 0000002 SHF_ALLOC SHF_EXECINSTR 06: 4 SHT_RELA .rela.fini 00000000 00004b30 00000018 12 36 5 0000004 07: 1 SHT_PROGBITS .jcr 00000000 00000414 00000004 0 0 0 0000004 SHF_WRITE SHF_ALLOC 08: 1 SHT_PROGBITS .data 00000000 00000418 00000458 0 0 0 0000008 SHF_WRITE SHF_ALLOC 09: 4 SHT_RELA .rela.data 00000000 00004b48 0000003c 12 36 8 0000004 10: 1 SHT_PROGBITS .ctors 00000000 00000870 00000008 0 0 0 0000004 SHF_WRITE SHF_ALLOC 11: 1 SHT_PROGBITS .dtors 00000000 00000878 00000008 0 0 0 0000004 SHF_WRITE SHF_ALLOC 12: 1 SHT_PROGBITS .tm_clone_table 00000000 00000880 00000000 0 0 0 0000004 SHF_WRITE SHF_ALLOC 13: 1 SHT_PROGBITS .rodata 00000000 00000880 00000004 0 0 0 0000004 SHF_ALLOC ... etc ... actual loading of sections 1: load .init on-core @ 00058 host 0x18058 36 3: load .text on-core @ 00080 host 0x18080 920 5: load .fini on-core @ 00418 host 0x18418 26 7: load .jcr on-core @ 00434 host 0x18434 4 8: load .data on-core @ 00438 host 0x18438 1112 10: load .ctors on-core @ 00890 host 0x18890 8 11: load .dtors on-core @ 00898 host 0x18898 8 12: load .tm_clone_table on-core @ 008a0 host 0x188a0 0 13: load .rodata on-core @ 008a0 host 0x188a0 4 15: load IVT_RESET isr @ 00000 17: load RESERVED_CRT0 on-core @ 008a4 host 0x188a4 12 19: load .rodata.str1.8 on-core @ 008b0 host 0x188b0 8 20: load .bss on-core @ 008b8 host 0x188b8 8 core bss start = 008b8 21: load .bss.shared xshared @ 8e000000 host 0xb4e3e000 8 processing reloc hunks offset symid addend type section symval symsize result name 1: 00000004 000002 0000015c R_EPIPHANY_LOW 3 00000000 0 [fffe805c / 0000005c <= 000001dc] LOW p = 0x1805c <= low(000001dc) *p=0002000b <- 00121b8b 1: 00000008 000002 0000015c R_EPIPHANY_HIGH 3 00000000 0 [fffe8060 / 00000060 <= 000001dc] HI p = 0x18060 <= hi(000001dc) *p=1002000b <- 1002000b 1: 0000000e 000002 0000035c R_EPIPHANY_LOW 3 00000000 0 [fffe8066 / 00000066 <= 000003dc] LOW p = 0x18066 <= low(000003dc) *p=0002000b <- 00321b8b 1: 00000012 000002 0000035c R_EPIPHANY_HIGH 3 00000000 0 [fffe806a / 0000006a <= 000003dc] HI p = 0x1806a <= hi(000003dc) *p=1002000b <- 1002000b 3: 00000090 000008 00000000 R_EPIPHANY_LOW 12 00000000 0 [fffe8110 / 00000110 <= 000008a0] LOW p = 0x18110 <= low(000008a0) *p=0002000b <- 0082140b 3: 00000094 0001af 00000003 R_EPIPHANY_LOW 12 00000000 0 [fffe8114 / 00000114 <= 000008a3] ___TMC_END__ LOW p = 0x18114 <= low(000008a3) *p=0002200b <- 0082346b ... etc ... 15: 00000000 0001a4 00000000 R_EPIPHANY_SIMM24 17 00000000 10 [fffe8000 / 00000000 <= 000008a4] .normal_start SIMM24 reloc 00000000 000000e8 <- 000452e8 17: 00000000 0001a5 00000000 R_EPIPHANY_LOW 3 00000000 132 [fffe88a4 / 000008a4 <= 00000080] _epiphany_start LOW p = 0x188a4 <= low(00000080) *p=0002600b <- 0002700b 17: 00000004 0001a5 00000000 R_EPIPHANY_HIGH 3 00000000 132 [fffe88a8 / 000008a8 <= 00000080] _epiphany_start HI p = 0x188a8 <= hi(00000080) *p=1002600b <- 1002600b running test code find symbol _shared section base = 8e000000 shared address = 0xb4e3e000 before 0,0 after 0,0 before 0,1 after 1,1 before 1,2 after 2,2 before 2,3 after 3,3 before 3,4 after 4,4
Not much to look at it but it shows it's relocating and linking properly and communicating between the host and the epu.
So that's only for a single core, now I have to go away and think about multi-core programmes.