Browse Source

Add __libc_stack_end to ld.so. The libc.a version remains to do.
sjhill, feel free to comment :)

Joakim Tjernlund 20 years ago
parent
commit
16045684fd
1 changed files with 7 additions and 2 deletions
  1. 7 2
      ldso/ldso/dl-startup.c

+ 7 - 2
ldso/ldso/dl-startup.c

@@ -97,8 +97,8 @@
 /* Static declarations */
 /* Static declarations */
 int (*_dl_elf_main) (int, char **, char **);
 int (*_dl_elf_main) (int, char **, char **);
 
 
-
+static void* __rtld_stack_end; /* Points to argc on stack, e.g *((long *)__rtld_stackend) == argc */
-
+strong_alias(__rtld_stack_end, __libc_stack_end); /* Exported version of __rtld_stack_end */
 
 
 /* When we enter this piece of code, the program stack looks like this:
 /* When we enter this piece of code, the program stack looks like this:
         argc            argument counter (integer)
         argc            argument counter (integer)
@@ -290,6 +290,11 @@ static void * __attribute_used__ _dl_start(unsigned long args)
 	   free to start using global variables, since these things have all been
 	   free to start using global variables, since these things have all been
 	   fixed up by now.  Still no function calls outside of this library ,
 	   fixed up by now.  Still no function calls outside of this library ,
 	   since the dynamic resolver is not yet ready. */
 	   since the dynamic resolver is not yet ready. */
+
+	__rtld_stack_end = (void *)args; /* Needs to be after ld.so self relocation */
+	if (*((long *)__rtld_stack_end) != argc) {
+		SEND_STDERR_DEBUG("__rtld_stack_end doesn't point to argc!");
+	}
 	_dl_get_ready_to_run(tpnt, load_addr, auxvt, envp, argv);
 	_dl_get_ready_to_run(tpnt, load_addr, auxvt, envp, argv);