summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Arnold <amiconn@rockbox.org>2009-03-02 00:16:44 +0000
committerJens Arnold <amiconn@rockbox.org>2009-03-02 00:16:44 +0000
commitc21e2e686fce7a7df5a933fd3bf06aa20e66c78b (patch)
tree483500a54064c878fd12196ca7fd1fad1177c064
parentce1c189d509b1b88044f9821fa36f2461af07219 (diff)
downloadrockbox-c21e2e686fce7a7df5a933fd3bf06aa20e66c78b.tar.gz
rockbox-c21e2e686fce7a7df5a933fd3bf06aa20e66c78b.zip
Calculate the optimal memory location for overlay plugins, and use plugin.lds for linking them. This gets rid of hand-adjusted archos.lds, making it easy to use overlay plugins on other lowmem targets. * Fix some duplicate and incorrect dependencies. * Change the way libs are filtered, so that a lib can be specified more than once. This allows to get rid of explicitly linking gcc-support.o, fixing empty plugins on some simulator platforms.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@20163 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/plugins/chessbox/archos.lds44
-rw-r--r--apps/plugins/chessbox/chessbox.make22
-rw-r--r--apps/plugins/goban/archos.lds43
-rw-r--r--apps/plugins/goban/goban.make22
-rw-r--r--apps/plugins/plugin.lds5
-rw-r--r--apps/plugins/plugins.make37
-rw-r--r--apps/plugins/rockboy/archos.lds44
-rw-r--r--apps/plugins/rockboy/rockboy.make22
-rw-r--r--apps/plugins/zxbox/archos.lds44
-rw-r--r--apps/plugins/zxbox/zxbox.make24
-rw-r--r--tools/ovl_offset.pl31
11 files changed, 102 insertions, 236 deletions
diff --git a/apps/plugins/chessbox/archos.lds b/apps/plugins/chessbox/archos.lds
deleted file mode 100644
index a419fce0bc..0000000000
--- a/apps/plugins/chessbox/archos.lds
+++ /dev/null
@@ -1,44 +0,0 @@
1#include "config.h"
2
3/* linker script for chessbox as an overlay,
4 * only used/ necessary for SH-based archos targets */
5
6OUTPUT_FORMAT(elf32-sh)
7
8#define DRAMORIG 0x09000000
9#define PLUGIN_LENGTH PLUGIN_BUFFER_SIZE
10
11#define OVERLAY_LENGTH 0x30000
12#define OVERLAY_ORIGIN (DRAMORIG + (MEMORYSIZE * 0x100000) - PLUGIN_LENGTH - OVERLAY_LENGTH)
13
14MEMORY
15{
16 OVERLAY_RAM : ORIGIN = OVERLAY_ORIGIN, LENGTH = OVERLAY_LENGTH
17}
18
19SECTIONS
20{
21 .header : {
22 _plugin_start_addr = .;
23 KEEP(*(.header))
24 } > OVERLAY_RAM
25
26 .text : {
27 *(.text*)
28 } > OVERLAY_RAM
29
30 .rodata : {
31 *(.rodata*)
32 } > OVERLAY_RAM
33
34 .data : {
35 *(.data*)
36 } > OVERLAY_RAM
37
38 .bss : {
39 *(.bss*)
40 *(COMMON)
41 . = ALIGN(0x4);
42 _plugin_end_addr = .;
43 } > OVERLAY_RAM
44}
diff --git a/apps/plugins/chessbox/chessbox.make b/apps/plugins/chessbox/chessbox.make
index 220f0839e3..43df3ab264 100644
--- a/apps/plugins/chessbox/chessbox.make
+++ b/apps/plugins/chessbox/chessbox.make
@@ -17,20 +17,17 @@ OTHER_SRC += $(CHESSBOX_SRC)
17 17
18ifndef SIMVER 18ifndef SIMVER
19ifneq (,$(strip $(foreach tgt,RECORDER ONDIO,$(findstring $(tgt),$(TARGET))))) 19ifneq (,$(strip $(foreach tgt,RECORDER ONDIO,$(findstring $(tgt),$(TARGET)))))
20 ## archos recorder targets 20 ### lowmem targets
21 CHESSBOX_INLDS := $(CHESSBOX_SRCDIR)/archos.lds
22 ROCKS += $(CHESSBOX_OBJDIR)/chessbox.ovl 21 ROCKS += $(CHESSBOX_OBJDIR)/chessbox.ovl
22 CHESSBOX_OUTLDS = $(CHESSBOX_OBJDIR)/chessbox.link
23 CHESSBOX_OVLFLAGS = -T$(CHESSBOX_OUTLDS) -Wl,--gc-sections -Wl,-Map,$(basename $@).map
23else 24else
24 ### all other targets 25 ### all other targets
25 CHESSBOX_INLDS := $(APPSDIR)/plugins/plugin.lds
26 ROCKS += $(CHESSBOX_OBJDIR)/chessbox.rock 26 ROCKS += $(CHESSBOX_OBJDIR)/chessbox.rock
27endif 27endif
28 CHESSBOX_OVLFLAGS = -T$(CHESSBOX_OUTLDS) -Wl,--gc-sections -Wl,-Map,$(basename $@).map
29 CHESSBOX_OUTLDS = $(CHESSBOX_OBJDIR)/chessbox.lds
30else 28else
31 ### simulator 29 ### simulator
32 ROCKS += $(CHESSBOX_OBJDIR)/chessbox.rock 30 ROCKS += $(CHESSBOX_OBJDIR)/chessbox.rock
33 CHESSBOX_OVLFLAGS = $(SHARED_FLAG) # <-- from Makefile
34endif 31endif
35 32
36ifeq ($(CPU),sh) 33ifeq ($(CPU),sh)
@@ -40,15 +37,18 @@ else
40CHESSBOXFLAGS = $(filter-out -O%,$(PLUGINFLAGS)) -O2 37CHESSBOXFLAGS = $(filter-out -O%,$(PLUGINFLAGS)) -O2
41endif 38endif
42 39
43$(CHESSBOX_OUTLDS): $(CHESSBOX_INLDS) $(CHESSBOX_OBJ) 40$(CHESSBOX_OBJDIR)/chessbox.rock: $(CHESSBOX_OBJ)
44 $(call PRINTS,PP $(<F))$(call preprocess2file,$<,$@) 41
42$(CHESSBOX_OBJDIR)/chessbox.refmap: $(CHESSBOX_OBJ)
45 43
46$(CHESSBOX_OBJDIR)/chessbox.rock: $(CHESSBOX_OBJ) $(CHESSBOX_OUTLDS) $(PLUGINBITMAPLIB) 44$(CHESSBOX_OUTLDS): $(PLUGIN_LDS) $(CHESSBOX_OBJDIR)/chessbox.refmap
45 $(call PRINTS,PP $(@F))$(call preprocess2file,$<,$@,-DOVERLAY_OFFSET=$(shell \
46 $(TOOLSDIR)/ovl_offset.pl $(CHESSBOX_OBJDIR)/chessbox.refmap))
47 47
48$(CHESSBOX_OBJDIR)/chessbox.ovl: $(CHESSBOX_OBJ) $(CHESSBOX_OUTLDS) $(PLUGINBITMAPLIB) 48$(CHESSBOX_OBJDIR)/chessbox.ovl: $(CHESSBOX_OBJ) $(CHESSBOX_OUTLDS)
49 $(SILENT)$(CC) $(PLUGINFLAGS) -o $(basename $@).elf \ 49 $(SILENT)$(CC) $(PLUGINFLAGS) -o $(basename $@).elf \
50 $(filter %.o, $^) \ 50 $(filter %.o, $^) \
51 $(filter %.a, $^) \ 51 $(filter %.a, $+) \
52 -lgcc $(CHESSBOX_OVLFLAGS) 52 -lgcc $(CHESSBOX_OVLFLAGS)
53 $(call PRINTS,LD $(@F))$(OC) -O binary $(basename $@).elf $@ 53 $(call PRINTS,LD $(@F))$(OC) -O binary $(basename $@).elf $@
54 54
diff --git a/apps/plugins/goban/archos.lds b/apps/plugins/goban/archos.lds
deleted file mode 100644
index c17346ff0b..0000000000
--- a/apps/plugins/goban/archos.lds
+++ /dev/null
@@ -1,43 +0,0 @@
1#include "config.h"
2
3/* linker script for goban as an overlay */
4
5OUTPUT_FORMAT(elf32-sh)
6
7#define DRAMORIG 0x09000000
8#define PLUGIN_LENGTH PLUGIN_BUFFER_SIZE
9
10#define OVERLAY_LENGTH 0x10000
11#define OVERLAY_ORIGIN (DRAMORIG + (MEMORYSIZE * 0x100000) - PLUGIN_LENGTH - OVERLAY_LENGTH)
12
13MEMORY
14{
15 OVERLAY_RAM : ORIGIN = OVERLAY_ORIGIN, LENGTH = OVERLAY_LENGTH
16}
17
18SECTIONS
19{
20 .header : {
21 _plugin_start_addr = .;
22 KEEP(*(.header))
23 } > OVERLAY_RAM
24
25 .text : {
26 *(.text*)
27 } > OVERLAY_RAM
28
29 .rodata : {
30 *(.rodata*)
31 } > OVERLAY_RAM
32
33 .data : {
34 *(.data*)
35 } > OVERLAY_RAM
36
37 .bss : {
38 *(.bss*)
39 *(COMMON)
40 . = ALIGN(0x4);
41 _plugin_end_addr = .;
42 } > OVERLAY_RAM
43}
diff --git a/apps/plugins/goban/goban.make b/apps/plugins/goban/goban.make
index b8866fbc4f..03f2276659 100644
--- a/apps/plugins/goban/goban.make
+++ b/apps/plugins/goban/goban.make
@@ -7,7 +7,6 @@
7# $Id$ 7# $Id$
8# 8#
9 9
10
11GOBAN_SRCDIR := $(APPSDIR)/plugins/goban 10GOBAN_SRCDIR := $(APPSDIR)/plugins/goban
12GOBAN_BUILDDIR := $(BUILDDIR)/apps/plugins/goban 11GOBAN_BUILDDIR := $(BUILDDIR)/apps/plugins/goban
13 12
@@ -18,31 +17,30 @@ OTHER_SRC += $(GOBAN_SRC)
18 17
19ifndef SIMVER 18ifndef SIMVER
20ifneq (,$(strip $(foreach tgt,RECORDER ONDIO,$(findstring $(tgt),$(TARGET))))) 19ifneq (,$(strip $(foreach tgt,RECORDER ONDIO,$(findstring $(tgt),$(TARGET)))))
21 ### archos recorder targets 20 ### lowmem targets
22 GOBAN_INLDS := $(GOBAN_SRCDIR)/archos.lds
23 ROCKS += $(GOBAN_BUILDDIR)/goban.ovl 21 ROCKS += $(GOBAN_BUILDDIR)/goban.ovl
22 GOBAN_OUTLDS = $(GOBAN_BUILDDIR)/goban.link
23 GOBAN_OVLFLAGS = -T$(GOBAN_OUTLDS) -Wl,--gc-sections -Wl,-Map,$(basename $@).map
24else 24else
25 ### all other targets 25 ### all other targets
26 GOBAN_INLDS := $(APPSDIR)/plugins/plugin.lds
27 ROCKS += $(GOBAN_BUILDDIR)/goban.rock 26 ROCKS += $(GOBAN_BUILDDIR)/goban.rock
28endif 27endif
29 GOBAN_OVLFLAGS = -T$(GOBAN_OUTLDS) -Wl,--gc-sections -Wl,-Map,$(basename $@).map
30 GOBAN_OUTLDS = $(GOBAN_BUILDDIR)/goban.lds
31else 28else
32 ### simulator 29 ### simulator
33 ROCKS += $(GOBAN_BUILDDIR)/goban.rock 30 ROCKS += $(GOBAN_BUILDDIR)/goban.rock
34 GOBAN_OVLFLAGS = $(SHARED_FLAG) # <-- from Makefile
35endif 31endif
36 32
37$(GOBAN_OUTLDS): $(GOBAN_INLDS) $(GOBAN_OBJ) 33$(GOBAN_BUILDDIR)/goban.rock: $(GOBAN_OBJ)
38 $(call PRINTS,PP $(<F))$(call preprocess2file,$<,$@)
39 34
40$(GOBAN_BUILDDIR)/goban.rock: $(GOBAN_OBJ) $(GOBAN_OUTLDS) 35$(GOBAN_BUILDDIR)/goban.refmap: $(GOBAN_OBJ)
36
37$(GOBAN_OUTLDS): $(PLUGIN_LDS) $(GOBAN_BUILDDIR)/goban.refmap
38 $(call PRINTS,PP $(@F))$(call preprocess2file,$<,$@,-DOVERLAY_OFFSET=$(shell \
39 $(TOOLSDIR)/ovl_offset.pl $(GOBAN_BUILDDIR)/goban.refmap))
41 40
42$(GOBAN_BUILDDIR)/goban.ovl: $(GOBAN_OBJ) $(GOBAN_OUTLDS) 41$(GOBAN_BUILDDIR)/goban.ovl: $(GOBAN_OBJ) $(GOBAN_OUTLDS)
43 $(SILENT)$(CC) $(PLUGINFLAGS) -o $(basename $@).elf \ 42 $(SILENT)$(CC) $(PLUGINFLAGS) -o $(basename $@).elf \
44 $(filter %.o, $^) \ 43 $(filter %.o, $^) \
45 $(filter %.a, $^) \ 44 $(filter %.a, $+) \
46 -lgcc $(GOBAN_OVLFLAGS) 45 -lgcc $(GOBAN_OVLFLAGS)
47 $(call PRINTS,LD $(@F))$(OC) -O binary $(basename $@).elf $@ 46 $(call PRINTS,LD $(@F))$(OC) -O binary $(basename $@).elf $@
48
diff --git a/apps/plugins/plugin.lds b/apps/plugins/plugin.lds
index ccf60100bf..e7ed9b1844 100644
--- a/apps/plugins/plugin.lds
+++ b/apps/plugins/plugin.lds
@@ -125,7 +125,10 @@ OUTPUT_FORMAT(elf32-littlemips)
125#ifdef CODEC 125#ifdef CODEC
126#define THIS_LENGTH CODEC_SIZE 126#define THIS_LENGTH CODEC_SIZE
127#define THIS_ORIGIN CODEC_ORIGIN 127#define THIS_ORIGIN CODEC_ORIGIN
128#else 128#elif defined OVERLAY_OFFSET
129#define THIS_LENGTH (DRAMSIZE - OVERLAY_OFFSET)
130#define THIS_ORIGIN (DRAMORIG + OVERLAY_OFFSET)
131#else /* plugin */
129#define THIS_LENGTH PLUGIN_LENGTH 132#define THIS_LENGTH PLUGIN_LENGTH
130#define THIS_ORIGIN PLUGIN_ORIGIN 133#define THIS_ORIGIN PLUGIN_ORIGIN
131#endif 134#endif
diff --git a/apps/plugins/plugins.make b/apps/plugins/plugins.make
index 7314888eed..8be87b94c1 100644
--- a/apps/plugins/plugins.make
+++ b/apps/plugins/plugins.make
@@ -26,24 +26,25 @@ PLUGINLIB_OBJ := $(PLUGINLIB_SRC:.c=.o)
26PLUGINLIB_OBJ := $(PLUGINLIB_OBJ:.S=.o) 26PLUGINLIB_OBJ := $(PLUGINLIB_OBJ:.S=.o)
27PLUGINLIB_OBJ := $(subst $(ROOTDIR),$(BUILDDIR),$(PLUGINLIB_OBJ)) 27PLUGINLIB_OBJ := $(subst $(ROOTDIR),$(BUILDDIR),$(PLUGINLIB_OBJ))
28 28
29# multifile plugins (subdirs):
30PLUGINSUBDIRS := $(call preprocess, $(APPSDIR)/plugins/SUBDIRS)
31
32# include <dir>.make from each subdir (yay!)
33$(foreach dir,$(PLUGINSUBDIRS),$(eval include $(dir)/$(notdir $(dir)).make))
34
35### build data / rules 29### build data / rules
36ifndef SIMVER 30ifndef SIMVER
37PLUGIN_LDS := $(APPSDIR)/plugins/plugin.lds 31PLUGIN_LDS := $(APPSDIR)/plugins/plugin.lds
38PLUGINLINK_LDS := $(BUILDDIR)/apps/plugins/plugin.link 32PLUGINLINK_LDS := $(BUILDDIR)/apps/plugins/plugin.link
33OVERLAYREF_LDS := $(BUILDDIR)/apps/plugins/overlay_ref.link
39endif 34endif
40 35
36# multifile plugins (subdirs):
37PLUGINSUBDIRS := $(call preprocess, $(APPSDIR)/plugins/SUBDIRS)
38
39# include <dir>.make from each subdir (yay!)
40$(foreach dir,$(PLUGINSUBDIRS),$(eval include $(dir)/$(notdir $(dir)).make))
41
41OTHER_INC += -I$(APPSDIR)/plugins -I$(APPSDIR)/plugins/lib 42OTHER_INC += -I$(APPSDIR)/plugins -I$(APPSDIR)/plugins/lib
42 43
43# special compile flags for plugins: 44# special compile flags for plugins:
44PLUGINFLAGS = -I$(APPSDIR)/plugins -DPLUGIN $(CFLAGS) 45PLUGINFLAGS = -I$(APPSDIR)/plugins -DPLUGIN $(CFLAGS)
45 46
46$(ROCKS): $(PLUGINLIB) $(APPSDIR)/plugin.h $(PLUGINLINK_LDS) $(PLUGINBITMAPLIB) 47$(ROCKS): $(APPSDIR)/plugin.h $(PLUGINLINK_LDS) $(PLUGINLIB) $(PLUGINBITMAPLIB)
47 48
48$(PLUGINLIB): $(PLUGINLIB_OBJ) 49$(PLUGINLIB): $(PLUGINLIB_OBJ)
49 $(SILENT)$(shell rm -f $@) 50 $(SILENT)$(shell rm -f $@)
@@ -54,11 +55,16 @@ $(PLUGINLINK_LDS): $(PLUGIN_LDS)
54 $(shell mkdir -p $(dir $@)) 55 $(shell mkdir -p $(dir $@))
55 $(call preprocess2file,$<,$@,-DLOADADDRESS=$(LOADADDRESS)) 56 $(call preprocess2file,$<,$@,-DLOADADDRESS=$(LOADADDRESS))
56 57
58$(OVERLAYREF_LDS): $(PLUGIN_LDS)
59 $(call PRINTS,PP $(@F))
60 $(shell mkdir -p $(dir $@))
61 $(call preprocess2file,$<,$@,-DOVERLAY_OFFSET=0)
62
57$(BUILDDIR)/credits.raw credits.raw: $(DOCSDIR)/CREDITS 63$(BUILDDIR)/credits.raw credits.raw: $(DOCSDIR)/CREDITS
58 $(call PRINTS,Create credits.raw)perl $(APPSDIR)/plugins/credits.pl < $< > $(BUILDDIR)/$(@F) 64 $(call PRINTS,Create credits.raw)perl $(APPSDIR)/plugins/credits.pl < $< > $(BUILDDIR)/$(@F)
59 65
60# special dependencies 66# special dependencies
61$(BUILDDIR)/apps/plugins/wav2wv.rock: $(BUILDDIR)/apps/codecs/libwavpack.a 67$(BUILDDIR)/apps/plugins/wav2wv.rock: $(BUILDDIR)/apps/codecs/libwavpack.a $(PLUGINLIB)
62 68
63# special pattern rule for compiling plugin lib (with -ffunction-sections) 69# special pattern rule for compiling plugin lib (with -ffunction-sections)
64$(BUILDDIR)/apps/plugins/lib/%.o: $(ROOTDIR)/apps/plugins/lib/%.c 70$(BUILDDIR)/apps/plugins/lib/%.o: $(ROOTDIR)/apps/plugins/lib/%.c
@@ -74,15 +80,22 @@ ifdef SIMVER
74 PLUGINLDFLAGS = $(SHARED_FLAG) # <-- from Makefile 80 PLUGINLDFLAGS = $(SHARED_FLAG) # <-- from Makefile
75else 81else
76 PLUGINLDFLAGS = -T$(PLUGINLINK_LDS) -Wl,--gc-sections -Wl,-Map,$*.map 82 PLUGINLDFLAGS = -T$(PLUGINLINK_LDS) -Wl,--gc-sections -Wl,-Map,$*.map
83 OVERLAYLDFLAGS = -T$(OVERLAYREF_LDS) -Wl,--gc-sections -Wl,-Map,$*.refmap
77endif 84endif
78 85
79$(BUILDDIR)/%.rock: $(GCCSUPPORT_OBJ) $(BUILDDIR)/%.o $(PLUGINLINK_LDS) 86$(BUILDDIR)/%.rock: $(BUILDDIR)/%.o
80 $(call PRINTS,LD $(@F))$(CC) $(PLUGINFLAGS) -o $(BUILDDIR)/$*.elf \ 87 $(call PRINTS,LD $(@F))$(CC) $(PLUGINFLAGS) -o $(BUILDDIR)/$*.elf \
81 $(filter %.o, $^) \ 88 $(filter %.o, $^) \
82 $(filter %.a, $^) \ 89 $(filter %.a, $+) \
83 -lgcc $(PLUGINLDFLAGS) 90 -lgcc $(PLUGINLDFLAGS)
84ifdef SIMVER 91ifdef SIMVER
85 $(SILENT)cp $(BUILDDIR)/$*.elf $@ 92 $(SILENT)cp $(BUILDDIR)/$*.elf $@
86else 93else
87 $(SILENT)$(OC) -O binary $(BUILDDIR)/$*.elf $@ 94 $(SILENT)$(OC) -O binary $(BUILDDIR)/$*.elf $@
88endif \ No newline at end of file 95endif
96
97$(BUILDDIR)/%.refmap: $(BUILDDIR)/%.o $(OVERLAYREF_LDS) $(PLUGINLIB) $(PLUGINBITMAPLIB)
98 $(call PRINTS,LD $(@F))$(CC) $(PLUGINFLAGS) -o /dev/null \
99 $(filter %.o, $^) \
100 $(filter %.a, $^) \
101 -lgcc $(OVERLAYLDFLAGS)
diff --git a/apps/plugins/rockboy/archos.lds b/apps/plugins/rockboy/archos.lds
deleted file mode 100644
index fcc3e6f922..0000000000
--- a/apps/plugins/rockboy/archos.lds
+++ /dev/null
@@ -1,44 +0,0 @@
1#include "config.h"
2
3/* linker script for rockboy as an overlay,
4 * only used/ necessary for SH-based archos targets */
5
6OUTPUT_FORMAT(elf32-sh)
7
8#define DRAMORIG 0x09000000
9#define PLUGIN_LENGTH PLUGIN_BUFFER_SIZE
10
11#define OVERLAY_LENGTH 0x68000
12#define OVERLAY_ORIGIN (DRAMORIG + (MEMORYSIZE * 0x100000) - PLUGIN_LENGTH - OVERLAY_LENGTH)
13
14MEMORY
15{
16 OVERLAY_RAM : ORIGIN = OVERLAY_ORIGIN, LENGTH = OVERLAY_LENGTH
17}
18
19SECTIONS
20{
21 .header : {
22 _plugin_start_addr = .;
23 KEEP(*(.header))
24 } > OVERLAY_RAM
25
26 .text : {
27 *(.text*)
28 } > OVERLAY_RAM
29
30 .rodata : {
31 *(.rodata*)
32 } > OVERLAY_RAM
33
34 .data : {
35 *(.data*)
36 } > OVERLAY_RAM
37
38 .bss : {
39 *(.bss*)
40 *(COMMON)
41 . = ALIGN(0x4);
42 _plugin_end_addr = .;
43 } > OVERLAY_RAM
44}
diff --git a/apps/plugins/rockboy/rockboy.make b/apps/plugins/rockboy/rockboy.make
index bce549c43c..ca0ed17a0a 100644
--- a/apps/plugins/rockboy/rockboy.make
+++ b/apps/plugins/rockboy/rockboy.make
@@ -18,30 +18,30 @@ OTHER_SRC += $(ROCKBOY_SRC)
18 18
19ifndef SIMVER 19ifndef SIMVER
20ifneq (,$(findstring RECORDER,$(TARGET))) 20ifneq (,$(findstring RECORDER,$(TARGET)))
21 ## archos recorder targets 21 ## lowmem targets
22 ROCKBOY_INLDS := $(ROCKBOY_SRCDIR)/archos.lds
23 ROCKS += $(ROCKBOY_OBJDIR)/rockboy.ovl 22 ROCKS += $(ROCKBOY_OBJDIR)/rockboy.ovl
23 ROCKBOY_OUTLDS = $(ROCKBOY_OBJDIR)/rockboy.link
24 ROCKBOY_OVLFLAGS = -T$(ROCKBOY_OUTLDS) -Wl,--gc-sections -Wl,-Map,$(basename $@).map
24else 25else
25 ### all other targets 26 ### all other targets
26 ROCKBOY_INLDS := $(APPSDIR)/plugins/plugin.lds
27 ROCKS += $(ROCKBOY_OBJDIR)/rockboy.rock 27 ROCKS += $(ROCKBOY_OBJDIR)/rockboy.rock
28endif 28endif
29 ROCKBOY_OVLFLAGS = -T$(ROCKBOY_OUTLDS) -Wl,--gc-sections -Wl,-Map,$(basename $@).map
30 ROCKBOY_OUTLDS = $(ROCKBOY_OBJDIR)/rockboy.lds
31else 29else
32 ### simulator 30 ### simulator
33 ROCKS += $(ROCKBOY_OBJDIR)/rockboy.rock 31 ROCKS += $(ROCKBOY_OBJDIR)/rockboy.rock
34 ROCKBOY_OVLFLAGS = $(SHARED_FLAG) # <-- from Makefile
35endif 32endif
36 33
37$(ROCKBOY_OUTLDS): $(ROCKBOY_INLDS) $(ROCKBOY_OBJ) 34$(ROCKBOY_OBJDIR)/rockboy.rock: $(ROCKBOY_OBJ)
38 $(call PRINTS,PP $(<F))$(call preprocess2file,$<,$@) 35
36$(ROCKBOY_OBJDIR)/rockboy.refmap: $(ROCKBOY_OBJ)
39 37
40$(ROCKBOY_OBJDIR)/rockboy.rock: $(ROCKBOY_OBJ) $(ROCKBOY_OUTLDS) $(PLUGINBITMAPLIB) 38$(ROCKBOY_OUTLDS): $(PLUGIN_LDS) $(ROCKBOY_OBJDIR)/rockboy.refmap
39 $(call PRINTS,PP $(@F))$(call preprocess2file,$<,$@,-DOVERLAY_OFFSET=$(shell \
40 $(TOOLSDIR)/ovl_offset.pl $(ROCKBOY_OBJDIR)/rockboy.refmap))
41 41
42$(ROCKBOY_OBJDIR)/rockboy.ovl: $(ROCKBOY_OBJ) $(ROCKBOY_OUTLDS) $(PLUGINBITMAPLIB) 42$(ROCKBOY_OBJDIR)/rockboy.ovl: $(ROCKBOY_OBJ) $(ROCKBOY_OUTLDS)
43 $(SILENT)$(CC) $(PLUGINFLAGS) -o $(basename $@).elf \ 43 $(SILENT)$(CC) $(PLUGINFLAGS) -o $(basename $@).elf \
44 $(filter %.o, $^) \ 44 $(filter %.o, $^) \
45 $(filter %.a, $^) \ 45 $(filter %.a, $+) \
46 -lgcc $(ROCKBOY_OVLFLAGS) 46 -lgcc $(ROCKBOY_OVLFLAGS)
47 $(call PRINTS,LD $(@F))$(OC) -O binary $(basename $@).elf $@ 47 $(call PRINTS,LD $(@F))$(OC) -O binary $(basename $@).elf $@
diff --git a/apps/plugins/zxbox/archos.lds b/apps/plugins/zxbox/archos.lds
deleted file mode 100644
index 5b4db7dc3e..0000000000
--- a/apps/plugins/zxbox/archos.lds
+++ /dev/null
@@ -1,44 +0,0 @@
1#include "config.h"
2
3/* linker script for zxbox as an overlay,
4 * only used/ necessary for SH-based archos targets */
5
6OUTPUT_FORMAT(elf32-sh)
7
8#define DRAMORIG 0x09000000
9#define PLUGIN_LENGTH PLUGIN_BUFFER_SIZE
10
11#define OVERLAY_LENGTH 0x48000
12#define OVERLAY_ORIGIN (DRAMORIG + (MEMORYSIZE * 0x100000) - PLUGIN_LENGTH - OVERLAY_LENGTH)
13
14MEMORY
15{
16 OVERLAY_RAM : ORIGIN = OVERLAY_ORIGIN, LENGTH = OVERLAY_LENGTH
17}
18
19SECTIONS
20{
21 .header : {
22 _plugin_start_addr = .;
23 KEEP(*(.header))
24 } > OVERLAY_RAM
25
26 .text : {
27 *(.text*)
28 } > OVERLAY_RAM
29
30 .rodata : {
31 *(.rodata*)
32 } > OVERLAY_RAM
33
34 .data : {
35 *(.data*)
36 } > OVERLAY_RAM
37
38 .bss : {
39 *(.bss*)
40 *(COMMON)
41 . = ALIGN(0x4);
42 _plugin_end_addr = .;
43 } > OVERLAY_RAM
44}
diff --git a/apps/plugins/zxbox/zxbox.make b/apps/plugins/zxbox/zxbox.make
index 6f6d1ab693..24f8e91f20 100644
--- a/apps/plugins/zxbox/zxbox.make
+++ b/apps/plugins/zxbox/zxbox.make
@@ -17,12 +17,12 @@ OTHER_SRC += $(ZXBOX_SRC)
17 17
18ifndef SIMVER 18ifndef SIMVER
19ifneq (,$(strip $(foreach tgt,RECORDER ONDIO,$(findstring $(tgt),$(TARGET))))) 19ifneq (,$(strip $(foreach tgt,RECORDER ONDIO,$(findstring $(tgt),$(TARGET)))))
20 ## archos recorder targets 20 ## lowmem targets
21 ZXBOX_INLDS := $(ZXBOX_SRCDIR)/archos.lds
22 ROCKS += $(ZXBOX_OBJDIR)/zxbox.ovl 21 ROCKS += $(ZXBOX_OBJDIR)/zxbox.ovl
22 ZXBOX_OUTLDS = $(ZXBOX_OBJDIR)/zxbox.link
23 ZXBOX_LDFLAGS = -T$(ZXBOX_OUTLDS) -Wl,--gc-sections -Wl,-Map,$(basename $@).map
23else 24else
24 ### all other targets 25 ### all other targets
25 ZXBOX_INLDS := $(APPSDIR)/plugins/plugin.lds
26 ROCKS += $(ZXBOX_OBJDIR)/zxbox.rock 26 ROCKS += $(ZXBOX_OBJDIR)/zxbox.rock
27endif 27endif
28else 28else
@@ -32,22 +32,18 @@ endif
32 32
33ZXBOXFLAGS = $(filter-out -O%,$(PLUGINFLAGS)) -O3 -funroll-loops 33ZXBOXFLAGS = $(filter-out -O%,$(PLUGINFLAGS)) -O3 -funroll-loops
34 34
35ifdef SIMVER 35$(ZXBOX_OBJDIR)/zxbox.rock: $(ZXBOX_OBJ)
36 ZXBOX_LDFLAGS = $(SHARED_FLAG) # <-- from Makefile
37else
38 ZXBOX_OUTLDS = $(ZXBOX_OBJDIR)/zxbox.lds
39 ZXBOX_LDFLAGS = -T$(ZXBOX_OUTLDS) -Wl,--gc-sections -Wl,-Map,$(basename $@).map
40endif
41 36
42$(ZXBOX_OUTLDS): $(ZXBOX_INLDS) $(ZXBOX_OBJ) 37$(ZXBOX_OBJDIR)/zxbox.refmap: $(ZXBOX_OBJ)
43 $(call PRINTS,PP $(<F))$(call preprocess2file,$<,$@)
44 38
45$(ZXBOX_OBJDIR)/zxbox.rock: $(ZXBOX_OBJ) $(ZXBOX_OUTLDS) $(PLUGINBITMAPLIB) 39$(ZXBOX_OUTLDS): $(PLUGIN_LDS) $(ZXBOX_OBJDIR)/zxbox.refmap
40 $(call PRINTS,PP $(@F))$(call preprocess2file,$<,$@,-DOVERLAY_OFFSET=$(shell \
41 $(TOOLSDIR)/ovl_offset.pl $(ZXBOX_OBJDIR)/zxbox.refmap))
46 42
47$(ZXBOX_OBJDIR)/zxbox.ovl: $(ZXBOX_OBJ) $(ZXBOX_OUTLDS) $(PLUGINBITMAPLIB) $(PLUGINLIB) 43$(ZXBOX_OBJDIR)/zxbox.ovl: $(ZXBOX_OBJ) $(ZXBOX_OUTLDS)
48 $(SILENT)$(CC) $(PLUGINFLAGS) -o $(basename $@).elf \ 44 $(SILENT)$(CC) $(PLUGINFLAGS) -o $(basename $@).elf \
49 $(filter %.o, $^) \ 45 $(filter %.o, $^) \
50 $(filter %.a, $^) \ 46 $(filter %.a, $+) \
51 -lgcc $(ZXBOX_LDFLAGS) 47 -lgcc $(ZXBOX_LDFLAGS)
52 $(call PRINTS,LD $(@F))$(OC) -O binary $(basename $@).elf $@ 48 $(call PRINTS,LD $(@F))$(OC) -O binary $(basename $@).elf $@
53 49
diff --git a/tools/ovl_offset.pl b/tools/ovl_offset.pl
new file mode 100644
index 0000000000..89c3468556
--- /dev/null
+++ b/tools/ovl_offset.pl
@@ -0,0 +1,31 @@
1#!/usr/bin/perl
2
3# Calculate the highest possible location for an overlay based
4# on a reference map file (.refmap)
5
6sub map_scan {
7 my ($map) = @_;
8 my $ramstart = -1, $ramsize = -1, $startaddr = -1, $endaddr = -1;
9 open (MAP, "<$map");
10 while (<MAP>) {
11 if ($_ =~ /^PLUGIN_RAM +0x([0-9a-f]+) +0x([0-9a-f]+)$/) {
12 $ramstart = hex($1);
13 $ramsize = hex($2);
14 }
15 elsif ($_ =~ / +0x([0-9a-f]+) +_?plugin_start_addr = ./) {
16 $startaddr = hex($1);
17 }
18 elsif ($_ =~ / +0x([0-9a-f]+) +_?plugin_end_addr = ./) {
19 $endaddr = hex($1);
20 }
21 }
22 close (MAP);
23 if ($ramstart < 0 || $ramsize < 0 || $startaddr < 0 || $endaddr < 0
24 || $ramstart != $startaddr) {
25 printf "Could not analyze map file.\n";
26 exit 1;
27 }
28 return $ramstart + $ramsize - $endaddr;
29}
30
31printf map_scan($ARGV[0]) & ~0xf;