From a23e19e7e8a2e229505928829facc71ff29c99c1 Mon Sep 17 00:00:00 2001 From: Rob Savoye Date: Tue, 2 Apr 2002 23:01:18 +0000 Subject: [PATCH] Trying yet again to check this in. --- lib/libgloss.exp | 4 +--- testglue.c | 34 +++++++++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/lib/libgloss.exp b/lib/libgloss.exp index 26335a7..3c637bc 100644 --- a/lib/libgloss.exp +++ b/lib/libgloss.exp @@ -823,10 +823,8 @@ proc build_wrapper { gluefile } { set flags ""; if [target_info exists is_vxworks] { set flags "additional_flags=-DVXWORKS"; - set result "-Wl,-wrap,exit -Wl,-wrap,main -Wl,-wrap,abort"; - } else { - set result "-Wl,-wrap,exit -Wl,-wrap,_exit -Wl,-wrap,main -Wl,-wrap,abort"; } + set result "-Wl,-wrap,exit -Wl,-wrap,main -Wl,-wrap,abort"; } if [target_info exists wrap_compile_flags] { lappend flags "additional_flags=[target_info wrap_compile_flags]"; diff --git a/testglue.c b/testglue.c index 3d2b272..55a7f92 100644 --- a/testglue.c +++ b/testglue.c @@ -12,7 +12,8 @@ because currently GNU ld doesn't deal well with a.out targets and the -wrap option. When GNU ld is fixed, this should definitely be removed. Note that we actually wrap __exit, not _exit on a target - that has UNDERSCORES defined. */ + that has UNDERSCORES defined. On non-UNDERSCORE targets, we + wrap _exit separately; it's actually a different function. */ #ifdef WRAP_M68K_AOUT #define REAL_EXIT(code) asm ( "trap %0" : : "i" (0) ); @@ -29,9 +30,13 @@ #define ORIG_MAIN _wrap__main #else #define REAL_EXIT __real_exit +#ifndef VXWORKS +#define REAL__EXIT __real__exit +#endif #define REAL_MAIN __real_main #define REAL_ABORT __real_abort #define ORIG_EXIT __wrap_exit +#define ORIG__EXIT __wrap__exit #define ORIG_ABORT __wrap_abort #define ORIG_MAIN __wrap_main #endif @@ -42,7 +47,11 @@ extern void REAL_EXIT (); extern void REAL_ABORT (); extern int REAL_MAIN (int argc, char **argv, char **envp); #endif +#ifdef REAL__EXIT +extern void REAL__EXIT (); +#endif +static int done_exit_message = 0; int ___constval = 1; #ifdef VXWORKS @@ -81,10 +90,33 @@ ORIG_EXIT (code) ptr = write_int (code, buf + strlen(buf)); *(ptr++) = '\n'; write (1, buf, ptr-buf); + done_exit_message = 1; REAL_EXIT (code); while (___constval); } +#ifdef ORIG__EXIT +void +ORIG__EXIT (code) + int code; +{ + char buf[30]; + char *ptr; + + /* Since exit may call _exit, we need to avoid a second message. */ + if (! done_exit_message) + { + strcpy (buf, "\n*** EXIT code "); + ptr = write_int (code, buf + strlen(buf)); + *(ptr++) = '\n'; + write (1, buf, ptr-buf); + } + + REAL__EXIT (code); + while (___constval); +} +#endif + void ORIG_ABORT () { -- 2.7.4