summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ldso/ldso/Makefile2
-rw-r--r--ldso/ldso/arm/dl-startup.h35
-rw-r--r--ldso/ldso/arm/dl-sysdep.h6
-rw-r--r--ldso/ldso/cris/dl-startup.h25
-rw-r--r--ldso/ldso/cris/dl-sysdep.h4
-rw-r--r--ldso/ldso/dl-startup.c17
-rw-r--r--ldso/ldso/i386/dl-startup.h21
-rw-r--r--ldso/ldso/i386/dl-sysdep.h4
-rw-r--r--ldso/ldso/ldso.c8
-rw-r--r--ldso/ldso/m68k/dl-sysdep.h4
-rw-r--r--ldso/ldso/mips/dl-startup.h143
-rw-r--r--ldso/ldso/powerpc/dl-startup.h23
-rw-r--r--ldso/ldso/sh/dl-startup.h31
-rw-r--r--ldso/ldso/sh/dl-sysdep.h4
-rw-r--r--ldso/ldso/sparc/dl-startup.h16
15 files changed, 206 insertions, 137 deletions
diff --git a/ldso/ldso/Makefile b/ldso/ldso/Makefile
index 8f58c3c9b..1ba79329d 100644
--- a/ldso/ldso/Makefile
+++ b/ldso/ldso/Makefile
@@ -73,7 +73,7 @@ XXFLAGS := $(XXFLAGS:-fomit-frame-pointer=)
all: $(LDSO_FULLNAME)
$(LDSO_FULLNAME): $(OBJS) $(DLINK_OBJS)
- $(LD) $(LDFLAGS) -e _dl_boot -soname=$(UCLIBC_LDSO) \
+ $(LD) $(LDFLAGS) -soname=$(UCLIBC_LDSO) \
-o $(LDSO_FULLNAME) $(OBJS) $(LIBGCC)
$(INSTALL) -d $(TOPDIR)lib
$(INSTALL) -m 755 $(LDSO_FULLNAME) $(TOPDIR)lib
diff --git a/ldso/ldso/arm/dl-startup.h b/ldso/ldso/arm/dl-startup.h
index b9c4ce1bc..cd4a1047b 100644
--- a/ldso/ldso/arm/dl-startup.h
+++ b/ldso/ldso/arm/dl-startup.h
@@ -4,29 +4,26 @@
* Copyright (C) 2000-2004 by Erik Andersen <andersen@codepoet.org>
*/
-void* _dl_boot(void);
-/* Overrive the default _dl_boot function, and replace it with a bit of asm.
- * Then call the real _dl_boot function, which is now named _dl_boot2. */
-asm("" \
-" .text\n" \
-" .globl _dl_boot\n" \
-"_dl_boot:\n" \
-" mov r7, sp\n" \
-" @ldr r0, [sp], #4\n" \
-" mov r0, sp\n" \
-" bl _dl_boot2\n" \
-" mov r6, r0\n" \
-" mov r0, r7\n" \
-" mov pc, r6\n" \
+asm(
+ " .text\n"
+ " .globl _start\n"
+ " .type _start,%function\n"
+ "_start:\n"
+ " mov r7, sp\n"
+ " @ldr r0, [sp], #4\n"
+ " mov r0, sp\n"
+ " bl _dl_start\n"
+ " mov r6, r0\n"
+ " mov r0, r7\n"
+ " mov pc, r6\n"
+ " .size _start,.-_start\n"
+ " .previous\n"
);
-#define DL_BOOT(X) static __attribute_used__ void* _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)
+#define GET_ARGV(ARGVP, ARGS) ARGVP = (((unsigned long*)ARGS)+1)
/* Handle relocation of the symbols in the dynamic loader. */
static inline
@@ -91,5 +88,3 @@ void PERFORM_BOOTSTRAP_RELOC(ELF_RELOC *rpnt, unsigned long *reloc_addr,
* done. This routine has to exit the current function, then call the
* _dl_elf_main function. */
#define START() return _dl_elf_main;
-
-
diff --git a/ldso/ldso/arm/dl-sysdep.h b/ldso/ldso/arm/dl-sysdep.h
index c4089b3e3..30e77a471 100644
--- a/ldso/ldso/arm/dl-sysdep.h
+++ b/ldso/ldso/arm/dl-sysdep.h
@@ -82,10 +82,10 @@ elf_machine_dynamic (void)
static inline Elf32_Addr __attribute__ ((unused))
elf_machine_load_address (void)
{
- extern void __dl_boot asm ("_dl_boot");
- Elf32_Addr got_addr = (Elf32_Addr) &__dl_boot;
+ extern void __dl_start asm ("_dl_start");
+ Elf32_Addr got_addr = (Elf32_Addr) &__dl_start;
Elf32_Addr pcrel_addr;
- asm ("adr %0, _dl_boot" : "=r" (pcrel_addr));
+ asm ("adr %0, _dl_start" : "=r" (pcrel_addr));
return pcrel_addr - got_addr;
}
diff --git a/ldso/ldso/cris/dl-startup.h b/ldso/ldso/cris/dl-startup.h
index cf8fd353a..afc158517 100644
--- a/ldso/ldso/cris/dl-startup.h
+++ b/ldso/ldso/cris/dl-startup.h
@@ -6,22 +6,25 @@
* can find argc, argv and auxvt (Auxillary Vector Table). */
asm("" \
" .text\n" \
-" .globl _dl_boot\n" \
-" .type _dl_boot,@function\n" \
-"_dl_boot:\n" \
+" .globl _start\n" \
+" .type _start,@function\n" \
+"_start:\n" \
" move.d $sp,$r10\n" \
" move.d $pc,$r9\n" \
-" add.d _dl_boot2 - ., $r9\n" \
+" add.d _dl_start - ., $r9\n" \
" jsr $r9\n" \
+" moveq 0,$r8\n" \
+" move $r8,$srp\n" \
+" jump $r10\n" \
+" .size _start,.-_start\n" \
+" .previous\n" \
);
-#define DL_BOOT(X) static void __attribute_used__ _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)
+#define GET_ARGV(ARGVP, ARGS) ARGVP = (((unsigned long *) ARGS)+1)
/* Handle relocation of the symbols in the dynamic loader. */
static inline
@@ -54,10 +57,4 @@ void PERFORM_BOOTSTRAP_RELOC(ELF_RELOC *rpnt, unsigned long *reloc_addr,
/* 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() __asm__ volatile ("moveq 0,$r8\n\t" \
- "move $r8,$srp\n\t" \
- "move.d %1,$sp\n\t" \
- "jump %0\n\t" \
- : : "r" (_dl_elf_main), "r" (args))
-
-
+#define START() return _dl_elf_main
diff --git a/ldso/ldso/cris/dl-sysdep.h b/ldso/ldso/cris/dl-sysdep.h
index 4c2c98a03..4d1ad9656 100644
--- a/ldso/ldso/cris/dl-sysdep.h
+++ b/ldso/ldso/cris/dl-sysdep.h
@@ -105,8 +105,8 @@ elf_machine_load_address(void)
{
Elf32_Addr gotaddr_diff;
- __asm__ ("sub.d [$r0+_dl_parse:GOT16],$r0,%0\n\t"
- "add.d _dl_parse:GOTOFF,%0" : "=r" (gotaddr_diff));
+ __asm__ ("sub.d [$r0+_dl_start:GOT16],$r0,%0\n\t"
+ "add.d _dl_start:GOTOFF,%0" : "=r" (gotaddr_diff));
return gotaddr_diff;
}
diff --git a/ldso/ldso/dl-startup.c b/ldso/ldso/dl-startup.c
index cdf9641b0..09c760f25 100644
--- a/ldso/ldso/dl-startup.c
+++ b/ldso/ldso/dl-startup.c
@@ -3,6 +3,7 @@
* Program to load an ELF binary on a linux system, and run it
* after resolving ELF shared library symbols
*
+ * Copyright (C) 2005 by Joakim Tjernlund
* Copyright (C) 2000-2004 by Erik Andersen <andersen@codepoet.org>
* Copyright (c) 1994-2000 Eric Youngdale, Peter MacDonald,
* David Engel, Hongjiu Lu and Mitch D'Souza
@@ -109,7 +110,7 @@ int (*_dl_elf_main) (int, char **, char **);
NULL
auxvt[0...N] Auxiliary Vector Table elements (mixed types)
*/
-DL_BOOT(unsigned long args)
+static void * __attribute_used__ _dl_start(unsigned long args)
{
unsigned int argc;
char **argv, **envp;
@@ -123,11 +124,6 @@ DL_BOOT(unsigned long args)
Elf32_auxv_t auxvt[AT_EGID + 1];
Elf32_Dyn *dpnt;
int indx;
-#if defined(__i386__)
- int status = 0;
-#endif
-
-
/* WARNING! -- we cannot make _any_ funtion calls until we have
* taken care of fixing up our own relocations. Making static
@@ -137,9 +133,6 @@ DL_BOOT(unsigned long args)
/* First obtain the information on the stack that tells us more about
what binary is loaded, where it is loaded, etc, etc */
GET_ARGV(aux_dat, args);
-#if defined (__arm__) || defined (__mips__) || defined (__cris__)
- aux_dat += 1;
-#endif
argc = *(aux_dat - 1);
argv = (char **) aux_dat;
aux_dat += argc; /* Skip over the argv pointers */
@@ -327,12 +320,12 @@ found_got:
}
}
#endif
-#if defined(__mips__)
+#ifdef PERFORM_BOOTSTRAP_GOT
#ifdef __SUPPORT_LD_DEBUG_EARLY__
- SEND_STDERR("About to do MIPS specific GOT bootstrap\n");
+ SEND_STDERR("About to do specific GOT bootstrap\n");
#endif
/* For MIPS we have to do stuff to the GOT before we do relocations. */
- PERFORM_BOOTSTRAP_GOT(got, tpnt);
+ PERFORM_BOOTSTRAP_GOT(tpnt);
#endif
/* OK, now do the relocations. We do not do a lazy binding here, so
diff --git a/ldso/ldso/i386/dl-startup.h b/ldso/ldso/i386/dl-startup.h
index fd546491e..68a2a6563 100644
--- a/ldso/ldso/i386/dl-startup.h
+++ b/ldso/ldso/i386/dl-startup.h
@@ -4,8 +4,15 @@
* Copyright (C) 2000-2004 by Erik Andersen <andersen@codepoet.org>
*/
-/* For x86 we do not need any special setup so go right to _dl_boot() */
-#define DL_BOOT(X) __attribute_used__ void _dl_boot (X)
+asm(
+ " .text\n"
+ " .globl _start\n"
+ " .type _start,@function\n"
+ "_start:\n"
+ " .set _start,_dl_start\n"
+ " .size _start,.-_start\n"
+ " .previous\n"
+);
/* 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
@@ -40,7 +47,9 @@ void PERFORM_BOOTSTRAP_RELOC(ELF_RELOC *rpnt, unsigned long *reloc_addr,
/* 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() \
- __asm__ volatile ("leave\n\t" \
- "jmp *%%eax\n\t" \
- : "=a" (status) : "a" (_dl_elf_main))
+#define START() { \
+ int status = 0; \
+ __asm__ volatile ("leave\n\t" \
+ "jmp *%%eax\n\t" \
+ : "=a" (status) : "a" (_dl_elf_main)); \
+}
diff --git a/ldso/ldso/i386/dl-sysdep.h b/ldso/ldso/i386/dl-sysdep.h
index de0e85faa..a916bb776 100644
--- a/ldso/ldso/i386/dl-sysdep.h
+++ b/ldso/ldso/i386/dl-sysdep.h
@@ -61,8 +61,8 @@ elf_machine_load_address (void)
via the GOT to make sure the compiler initialized %ebx in time. */
extern int _dl_errno;
Elf32_Addr addr;
- asm ("leal _dl_boot@GOTOFF(%%ebx), %0\n"
- "subl _dl_boot@GOT(%%ebx), %0"
+ asm ("leal _dl_start@GOTOFF(%%ebx), %0\n"
+ "subl _dl_start@GOT(%%ebx), %0"
: "=r" (addr) : "m" (_dl_errno) : "cc");
return addr;
}
diff --git a/ldso/ldso/ldso.c b/ldso/ldso/ldso.c
index c2560a1a2..9713416cd 100644
--- a/ldso/ldso/ldso.c
+++ b/ldso/ldso/ldso.c
@@ -3,6 +3,7 @@
* Program to load an ELF binary on a linux system, and run it
* after resolving ELF shared library symbols
*
+ * Copyright (C) 2005 by Joakim Tjernlund
* Copyright (C) 2000-2004 by Erik Andersen <andersen@codepoet.org>
* Copyright (c) 1994-2000 Eric Youngdale, Peter MacDonald,
* David Engel, Hongjiu Lu and Mitch D'Souza
@@ -82,6 +83,8 @@ static void debug_fini (int status, void *arg)
}
#endif
+extern void _start(void);
+
void _dl_get_ready_to_run(struct elf_resolve *tpnt, unsigned long load_addr,
Elf32_auxv_t auxvt[AT_EGID + 1], char **envp,
char **argv)
@@ -129,6 +132,11 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, unsigned long load_addr,
_dl_progname = argv[0];
}
+ if (_start == (void *) auxvt[AT_ENTRY].a_un.a_fcn) {
+ _dl_dprintf(2, "Standalone exection is not supported yet\n");
+ _dl_exit(1);
+ }
+
/* Start to build the tables of the modules that are required for
* this beast to run. We start with the basic executable, and then
* go from there. Eventually we will run across ourself, and we
diff --git a/ldso/ldso/m68k/dl-sysdep.h b/ldso/ldso/m68k/dl-sysdep.h
index 382049047..88722ee21 100644
--- a/ldso/ldso/m68k/dl-sysdep.h
+++ b/ldso/ldso/m68k/dl-sysdep.h
@@ -58,8 +58,8 @@ static inline Elf32_Addr
elf_machine_load_address (void)
{
Elf32_Addr addr;
- asm ("lea _dl_boot(%%pc), %0\n\t"
- "sub.l _dl_boot@GOT.w(%%a5), %0"
+ asm ("lea _dl_start(%%pc), %0\n\t"
+ "sub.l _dl_start@GOT.w(%%a5), %0"
: "=a" (addr));
return addr;
}
diff --git a/ldso/ldso/mips/dl-startup.h b/ldso/ldso/mips/dl-startup.h
index a4e8f13f4..b6cfaee1c 100644
--- a/ldso/ldso/mips/dl-startup.h
+++ b/ldso/ldso/mips/dl-startup.h
@@ -1,54 +1,126 @@
/* Any assmbly language/system dependent hacks needed to setup boot1.c so it
* will work as expected and cope with whatever platform specific wierdness is
* needed for this architecture.
+ * Copyright (C) 2005 by Joakim Tjernlund
*/
-asm("" \
-" .text\n" \
-" .globl _dl_boot\n" \
-"_dl_boot:\n" \
-" .set noreorder\n" \
-" bltzal $0, 0f\n" \
-" nop\n" \
-"0: .cpload $31\n" \
-" .set reorder\n" \
-" la $4, _DYNAMIC\n" \
-" sw $4, -0x7ff0($28)\n" \
-" move $4, $29\n" \
-" la $8, coff\n" \
-" .set noreorder\n" \
-" bltzal $0, coff\n" \
-" nop\n" \
-"coff: subu $8, $31, $8\n" \
-" .set reorder\n" \
-" la $25, _dl_boot2\n" \
-" addu $25, $8\n" \
-" jalr $25\n" \
-" lw $4, 0($29)\n" \
-" la $5, 4($29)\n" \
-" sll $6, $4, 2\n" \
-" addu $6, $6, $5\n" \
-" addu $6, $6, 4\n" \
-" la $7, _dl_elf_main\n" \
-" lw $25, 0($7)\n" \
-" jr $25\n" \
+#if 0
+asm(""
+ " .text\n"
+ " .globl _start\n"
+ " .type _start,@function\n"
+ "_start:\n"
+ " .set noreorder\n"
+ " bltzal $0, 0f\n"
+ " nop\n"
+ "0: .cpload $31\n"
+ " .set reorder\n"
+ " la $4, _DYNAMIC\n"
+ " sw $4, -0x7ff0($28)\n"
+ " move $4, $29\n"
+ " la $8, coff\n"
+ " .set noreorder\n"
+ " bltzal $0, coff\n"
+ " nop\n"
+ "coff: subu $8, $31, $8\n"
+ " .set reorder\n"
+ " la $25, _dl_start\n"
+ " addu $25, $8\n"
+ " jalr $25\n"
+ " lw $4, 0($29)\n"
+ " la $5, 4($29)\n"
+ " sll $6, $4, 2\n"
+ " addu $6, $6, $5\n"
+ " addu $6, $6, 4\n"
+ " la $7, _dl_elf_main\n"
+ " lw $25, 0($7)\n"
+ " jr $25\n"
+ " .size _start,.-_start\n"
+ " .previous\n"
+);
+#endif
+#if 0
+asm(""
+ " .text\n"
+ " .globl _start\n"
+ " .type _start,@function\n"
+ "_start:\n"
+ " .set noreorder\n"
+ " bltzal $0, 0f\n"
+ " nop\n"
+ "0: .cpload $31\n"
+ " .set reorder\n"
+ " la $4, _DYNAMIC\n"
+ " sw $4, -0x7ff0($28)\n"
+ " move $4, $29\n"
+ " la $8, coff\n"
+ " .set noreorder\n"
+ " bltzal $0, coff\n"
+ " nop\n"
+ "coff: subu $8, $31, $8\n"
+ " .set reorder\n"
+ " la $25, _dl_start\n"
+ " addu $25, $8\n"
+ " jalr $25\n"
+ " move $17, $2\n"
+ " lw $4, 0($29)\n"
+ " la $5, 4($29)\n"
+ " sll $6, $4, 2\n"
+ " addu $6, $6, $5\n"
+ " addu $6, $6, 4\n"
+ " move $25, $17\n"
+ " jr $25\n"
+ " .size _start,.-_start\n"
+ " .previous\n"
+);
+#endif
+asm(""
+ " .text\n"
+ " .globl _start\n"
+ " .type _start,@function\n"
+ "_start:\n"
+ " .set noreorder\n"
+ " bltzal $0, 0f\n"
+ " nop\n"
+ "0: .cpload $31\n"
+ " .set reorder\n"
+ " la $4, _DYNAMIC\n"
+ " sw $4, -0x7ff0($28)\n"
+ " move $4, $29\n"
+ " subu $29, 16\n"
+ " la $8, coff\n"
+ " .set noreorder\n"
+ " bltzal $8, coff\n"
+ "coff: subu $8, $31, $8\n"
+ " .set reorder\n"
+ " la $25, _dl_start\n"
+ " addu $25, $8\n"
+ " jalr $25\n"
+ " move $17, $2\n"
+ " lw $4, 0($29)\n"
+ " la $5, 4($29)\n"
+ " sll $6, $4, 2\n"
+ " addu $6, $6, $5\n"
+ " addu $6, $6, 4\n"
+ " move $25, $17\n"
+ " jr $25\n"
+ " .size _start,.-_start\n"
+ " .previous\n"
);
-
-#define DL_BOOT(X) static void __attribute_used__ _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)
+#define GET_ARGV(ARGVP, ARGS) ARGVP = (((unsigned long *) ARGS)+1)
/*
* Here is a macro to perform the GOT relocation. This is only
* used when bootstrapping the dynamic loader.
*/
-#define PERFORM_BOOTSTRAP_GOT(got, tpnt) \
+#define PERFORM_BOOTSTRAP_GOT(tpnt) \
do { \
Elf32_Sym *sym; \
Elf32_Addr i; \
@@ -115,7 +187,4 @@ do { \
* because the stack doesn't get properly restored otherwise. Got look
* at boot1_arch.h
*/
-#define START()
-
-
-
+#define START() return _dl_elf_main
diff --git a/ldso/ldso/powerpc/dl-startup.h b/ldso/ldso/powerpc/dl-startup.h
index 37d3cf0fd..8f67c3610 100644
--- a/ldso/ldso/powerpc/dl-startup.h
+++ b/ldso/ldso/powerpc/dl-startup.h
@@ -1,29 +1,26 @@
/* Any assmbly language/system dependent hacks needed to setup boot1.c so it
* will work as expected and cope with whatever platform specific wierdness is
- * needed for this architecture. */
+ * needed for this architecture.
+ * Copyright (C) 2005 by Joakim Tjernlund
+ */
-/* Overrive the default _dl_boot function, and replace it with a bit of asm.
- * Then call the real _dl_boot function, which is now named _dl_boot2. */
asm(
" .text\n"
- " .globl _dl_boot\n"
- " .type _dl_boot,@function\n"
- "_dl_boot:\n"
- " mr 3,1\n" /* Pass SP to _dl_boot2 in r3 */
- " addi 1,1,-16\n" /* Make room on stack for _dl_boot2 to store LR */
+ " .globl _start\n"
+ " .type _start,@function\n"
+ "_start:\n"
+ " mr 3,1\n" /* Pass SP to _dl_start in r3 */
+ " addi 1,1,-16\n" /* Make room on stack for _dl_start to store LR */
" li 4,0\n"
" stw 4,0(1)\n" /* Clear Stack frame */
- " bl _dl_boot2@local\n" /* Perform relocation */
+ " bl _dl_start@local\n" /* Perform relocation */
" addi 1,1,16\n" /* Restore SP */
" mtctr 3\n" /* Load applications entry point */
" bctr\n" /* Jump to entry point */
- " .size _dl_boot,.-_dl_boot\n"
+ " .size _start,.-_start\n"
" .previous\n"
);
-
-#define DL_BOOT(X) static void* __attribute_used__ _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
diff --git a/ldso/ldso/sh/dl-startup.h b/ldso/ldso/sh/dl-startup.h
index 429c0e6eb..d669b4d2a 100644
--- a/ldso/ldso/sh/dl-startup.h
+++ b/ldso/ldso/sh/dl-startup.h
@@ -2,24 +2,23 @@
* will work as expected and cope with whatever platform specific wierdness is
* needed for this architecture. */
-asm("" \
-" .text\n" \
-" .globl _dl_boot\n" \
-"_dl_boot:\n" \
-" mov r15, r4\n" \
-" mov.l .L_dl_boot2, r0\n" \
-" bsrf r0\n" \
-" add #4, r4\n" \
-".jmp_loc:\n" \
-" jmp @r0\n" \
-" mov #0, r4 !call _start with arg == 0\n" \
-".L_dl_boot2:\n" \
-" .long _dl_boot2-.jmp_loc\n" \
-" .previous\n" \
+asm(
+ " .globl _start\n"
+ " .type _start,@function\n"
+ "_start:\n"
+ " mov r15, r4\n"
+ " mov.l .L_dl_start, r0\n"
+ " bsrf r0\n"
+ " add #4, r4\n"
+ ".jmp_loc:\n"
+ " jmp @r0\n"
+ " mov #0, r4 !call _start with arg == 0\n"
+ ".L_dl_start:\n"
+ " .long _dl_start-.jmp_loc\n"
+ " .size _start,.-_start\n"
+ " .previous\n"
);
-#define DL_BOOT(X) static void* __attribute_used__ _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
diff --git a/ldso/ldso/sh/dl-sysdep.h b/ldso/ldso/sh/dl-sysdep.h
index b332cc1ac..0234fb7bf 100644
--- a/ldso/ldso/sh/dl-sysdep.h
+++ b/ldso/ldso/sh/dl-sysdep.h
@@ -120,8 +120,8 @@ elf_machine_load_address (void)
bra 2f\n\
sub r0,r2\n\
.align 2\n\
- 1: .long _dl_boot@GOT\n\
- 3: .long _dl_boot@GOTOFF\n\
+ 1: .long _dl_start@GOT\n\
+ 3: .long _dl_start@GOTOFF\n\
2: mov r2,%0"
: "=r" (addr) : : "r0", "r1", "r2");
return addr;
diff --git a/ldso/ldso/sparc/dl-startup.h b/ldso/ldso/sparc/dl-startup.h
index b0d6a4361..ce51aa244 100644
--- a/ldso/ldso/sparc/dl-startup.h
+++ b/ldso/ldso/sparc/dl-startup.h
@@ -3,9 +3,15 @@
* needed for this architecture. See arm/boot1_arch.h for an example of what
* can be done.
*/
-
-#define DL_BOOT(X) __attribute_used__ void _dl_boot (X)
-
+asm(
+ " .text\n"
+ " .globl _start\n"
+ " .type _start,@function\n"
+ "_start:\n"
+ " .set _start,_dl_start\n"
+ " .size _start,.-_start\n"
+ " .previous\n"
+);
/*
* Get a pointer to the argv array. On many platforms this can be just
@@ -56,7 +62,3 @@
"restore %%g0,%%g0,%%g0\n\t" \
: /*"=r" (status) */ : \
"r" (_dl_elf_main): "g1", "o0", "o1")
-
-
-
-