summaryrefslogtreecommitdiff
path: root/ldso/ldso/sh/dl-startup.h
diff options
context:
space:
mode:
Diffstat (limited to 'ldso/ldso/sh/dl-startup.h')
-rw-r--r--ldso/ldso/sh/dl-startup.h54
1 files changed, 54 insertions, 0 deletions
diff --git a/ldso/ldso/sh/dl-startup.h b/ldso/ldso/sh/dl-startup.h
index d1ca6d985..0a41e36d6 100644
--- a/ldso/ldso/sh/dl-startup.h
+++ b/ldso/ldso/sh/dl-startup.h
@@ -19,3 +19,57 @@ asm("" \
);
#define DL_BOOT(X) static void __attribute__ ((unused)) _dl_boot2 (X)
+
+/*
+ * Get a pointer to the argv array. On many platforms this can be just
+ * the address if the first argument, on other platforms we need to
+ * do something a little more subtle here.
+ */
+#define GET_ARGV(ARGVP, ARGS) ARGVP = ((unsigned long*) ARGS)
+
+/*
+ * Here is a macro to perform a relocation. This is only used when
+ * bootstrapping the dynamic loader. RELP is the relocation that we
+ * are performing, REL is the pointer to the address we are relocating.
+ * SYMBOL is the symbol involved in the relocation, and LOAD is the
+ * load address.
+ */
+#define PERFORM_BOOTSTRAP_RELOC(RELP,REL,SYMBOL,LOAD,SYMTAB) \
+ switch(ELF32_R_TYPE((RELP)->r_info)){ \
+ case R_SH_REL32: \
+ *(REL) = (SYMBOL) + (RELP)->r_addend \
+ - (unsigned long)(REL); \
+ break; \
+ case R_SH_DIR32: \
+ case R_SH_GLOB_DAT: \
+ case R_SH_JMP_SLOT: \
+ *(REL) = (SYMBOL) + (RELP)->r_addend; \
+ break; \
+ case R_SH_RELATIVE: \
+ *(REL) = (LOAD) + (RELP)->r_addend; \
+ break; \
+ case R_SH_NONE: \
+ break; \
+ default: \
+ SEND_STDERR("BOOTSTRAP_RELOC: unhandled reloc type "); \
+ SEND_NUMBER_STDERR(ELF32_R_TYPE((RELP)->r_info), 1); \
+ SEND_STDERR("REL, SYMBOL, LOAD: "); \
+ SEND_ADDRESS_STDERR(REL, 0); \
+ SEND_STDERR(", "); \
+ SEND_ADDRESS_STDERR(SYMBOL, 0); \
+ SEND_STDERR(", "); \
+ SEND_ADDRESS_STDERR(LOAD, 1); \
+ _dl_exit(1); \
+ }
+
+
+/*
+ * Transfer control to the user's application, once the dynamic loader
+ * is done. This routine has to exit the current function, then
+ * call the _dl_elf_main function.
+ */
+#define START() return _dl_elf_main;
+
+
+
+