This is the mail archive of the
newlib@sourceware.org
mailing list for the newlib project.
Re: [PATCH] Fixes for i686-pc-linux-newlib
- From: Jeff Johnston <jjohnstn at redhat dot com>
- To: Paolo Bonzini <paolo dot bonzini at lu dot unisi dot ch>
- Cc: newlib at sourceware dot org
- Date: Tue, 10 Jan 2006 15:58:30 -0500
- Subject: Re: [PATCH] Fixes for i686-pc-linux-newlib
- References: <43BACB5D.7020501@lu.unisi.ch>
Paolo,
A number of issues with this patch. First of all, I usually build
x86-linux apps with -nostdlib and manually specify newlib's crt0.o.
This basic test fails with the patch below because _init and _fini
aren't defined in newlib (we don't supply crt[1/n/o] .o files at
present). Hacking past that initial problem, I ran into a problem
building a hello world program with -fprofile-arcs and -ftest-coverage.
These options drag in libgcov.a which was built with glibc headers and
it expects some magic symbols that aren't in newlib (e.g. stderr,
__errno_location, and __fxstat). I hacked past the link problem by
adding newlib symbols and linking in /usr/lib/crti.o but I eventually
ended up with a SIGSEGV.
Could you elaborate on how you built your application to get profile
data output? Can you verify that you actually have a newlib application
as opposed to one that is using glibc?
-- Jeff J.
Paolo Bonzini wrote:
The first hunk is a work around for the (in)famous INSTALL = ../ bug.
We can just pass down INSTALL as we detect it correctly in the toplevel
configure and in newlib's configure.
The second hunk is needed to invoke initialization and finalization
functions. I tested it by running a program compiled with gcc and with
profiling enabled. It creates the .gcda file correctly.
Can you apply them? I have no copyright on file, but these are small
enough to not require it.
2005-06-03 Paolo Bonzini <bonzini@gnu.org>
* Makefile.am (AM_MAKEFLAGS): Pass down INSTALL.
* libc/sys/linux/machine/i386/crt0.c (_start): Invoke _init and
_fini.
Paolo
------------------------------------------------------------------------
Index: Makefile.am
===================================================================
RCS file: /cvs/src/src/newlib/Makefile.am,v
retrieving revision 1.35
diff -u -p -r1.35 Makefile.am
--- Makefile.am 8 Sep 2005 22:45:49 -0000 1.35
+++ Makefile.am 3 Jan 2006 19:01:02 -0000
@@ -50,6 +50,7 @@ AM_MAKEFLAGS = \
"LD=$(LD)" \
"LIBCFLAGS=$(LIBCFLAGS)" \
"NM=$(NM)" \
+ "INSTALL=$(INSTALL)" \
"PICFLAG=$(PICFLAG)" \
"RANLIB=$(RANLIB)" \
"DESTDIR=$(DESTDIR)"
Index: libc/sys/linux/machine/i386/crt0.c
===================================================================
RCS file: /cvs/src/src/newlib/libc/sys/linux/machine/i386/crt0.c,v
retrieving revision 1.5
diff -u -p -r1.5 crt0.c
--- libc/sys/linux/machine/i386/crt0.c 10 Sep 2002 00:46:45 -0000 1.5
+++ libc/sys/linux/machine/i386/crt0.c 3 Jan 2006 19:01:04 -0000
@@ -16,6 +16,9 @@ extern char **environ;
extern int main(int argc,char **argv,char **envp);
+extern void _init (void);
+extern void _fini (void);
+
extern char _end;
extern char __bss_start;
@@ -41,5 +44,8 @@ void _start(int args)
* by this time by Linux. */
tzset(); /* initialize timezone info */
+
+ atexit (_fini);
+ _init ();
exit(main(argc,argv,environ));
}