about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1996-01-24 01:34:10 +0000
committerRoland McGrath <roland@gnu.org>1996-01-24 01:34:10 +0000
commitfd86137937b2be15f18c6564f39aa51fd0c48b00 (patch)
treedc7bfce2017d697a0d04ddd170f27840151fdf64
parent1d8dc4293f772369e2da018ba5f1bf6e67967f3a (diff)
downloadglibc-fd86137937b2be15f18c6564f39aa51fd0c48b00.tar.gz
glibc-fd86137937b2be15f18c6564f39aa51fd0c48b00.tar.xz
glibc-fd86137937b2be15f18c6564f39aa51fd0c48b00.zip
(dl_main): Support additional args in --list mode for debugging: look them up as symbol names and print values.
-rw-r--r--csu/initfini.c10
-rw-r--r--elf/rtld.c21
-rw-r--r--misc/getttyent.c3
3 files changed, 30 insertions, 4 deletions
diff --git a/csu/initfini.c b/csu/initfini.c
index a3c3b3b7bc..e1bf2b8284 100644
--- a/csu/initfini.c
+++ b/csu/initfini.c
@@ -59,6 +59,7 @@ cp crti.s-new crtn.s-new");
 
 /* Append the .init prologue to crti.s-new.  */
 asm ("cat >> crti.s-new <<\\EOF.crti.init");
+
 SECTION (".init")
 void
 _init (void)
@@ -69,10 +70,13 @@ _init (void)
      gcrt1.o to reference a symbol which would be defined by some library
      module which has a constructor; but then user code's constructors
      would come first, and not be profiled.  */
-  extern void __gmon_start__ (void) __attribute__ ((weak));
+  extern volatile void __gmon_start__ (void) __attribute__ ((weak));
+  /* This volatile variable is necessary to avoid GCC optimizing
+     out the test.  */
+  register volatile void (*g) (void) = &__gmon_start__;
   weak_symbol (__gmon_start__)
-  if (&__gmon_start__)
-    __gmon_start__ ();
+  if (g)
+    (*g) ();
 
   /* End the here document containing the .init prologue code.
      Then fetch the .section directive just written and append that
diff --git a/elf/rtld.c b/elf/rtld.c
index 070febc59f..aa004f325e 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -300,6 +300,8 @@ of this helper program; chances are you did not intend to run this program.\n",
 	     functions we call below for output may no longer work properly
 	     after relocation.  */
 
+	  int i;
+
 	  if (! _dl_loaded->l_info[DT_NEEDED])
 	    _dl_sysdep_message ("\t", "statically linked\n", NULL);
 	  else
@@ -314,6 +316,25 @@ of this helper program; chances are you did not intend to run this program.\n",
 				    " (0x", bp, ")\n", NULL);
 	      }
 
+	  for (i = 1; i < _dl_argc; ++i)
+	    {
+	      const Elf32_Sym *ref = NULL;
+	      Elf32_Addr loadbase = _dl_lookup_symbol (_dl_argv[i], &ref,
+						       _dl_loaded, "argument",
+						       1);
+	      char buf[20], *bp;
+	      buf[sizeof buf - 1] = '\0';
+	      bp = _itoa (ref->st_value, &buf[sizeof buf - 1], 16, 0);
+	      while (&buf[sizeof buf - 1] - bp < sizeof loadbase * 2)
+		*--bp = '0';
+	      _dl_sysdep_message (_dl_argv[i], " found at 0x", bp, NULL);
+	      buf[sizeof buf - 1] = '\0';
+	      bp = _itoa (loadbase, &buf[sizeof buf - 1], 16, 0);
+	      while (&buf[sizeof buf - 1] - bp < sizeof loadbase * 2)
+		*--bp = '0';
+	      _dl_sysdep_message (" in object at 0x", bp, "\n", NULL);
+	    }
+
 	  _exit (0);
 	}
 
diff --git a/misc/getttyent.c b/misc/getttyent.c
index f9b1e0d854..777108ff70 100644
--- a/misc/getttyent.c
+++ b/misc/getttyent.c
@@ -57,6 +57,8 @@ getttynam(tty)
 	return (t);
 }
 
+static char *skip __P((char *)), *value __P((char *));
+
 struct ttyent *
 getttyent()
 {
@@ -65,7 +67,6 @@ getttyent()
 	register char *p;
 #define	MAXLINELENGTH	100
 	static char line[MAXLINELENGTH];
-	static char *skip(), *value();
 
 	if (!tf && !setttyent())
 		return (NULL);