summaryrefslogtreecommitdiff
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)
(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);