This is the mail archive of the
libc-alpha@sources.redhat.com
mailing list for the glibc project.
RE: Question sprof on multiple shared libraries
- To: Alberto Lutgardo <alutgard at brocade dot com>, "'libc-alpha at sourceware dot cygnus dot com'" <libc-alpha at sourceware dot cygnus dot com>
- Subject: RE: Question sprof on multiple shared libraries
- From: Vince Guan <vguan at brocade dot com>
- Date: Tue, 10 Apr 2001 17:59:11 -0700
- Cc: Les Smith <lessmith at brocade dot com>, Grant Erickson <gerickso at brocade dot com>
Alberto,
Please be mindful that it's not a good idea to expose other brocade
employee's email addressed to the outside due to competitive reasons.
You can put them under "bcc:" if you you really want to copy them.
-Vince
> -----Original Message-----
> From: Alberto Lutgardo
> Sent: Tuesday, April 10, 2001 1:59 PM
> To: 'libc-alpha@sourceware.cygnus.com'
> Cc: Les Smith; Grant Erickson; Vince Guan
> Subject: Question sprof on multiple shared libraries
>
> I have a little program that calls two routines. Each routine
> is defined on a separate shared library. I am enclosing the
> program at the end of the message.
> Questions:
>
> 1) can sprof support multiple shared libraries?
> if so,
> * what is the syntax for generating the profile(s) file
> (LD_PROFILE=????)
> * what is the syntax for sprof
> 2) I was able to produce two profile files by executing the
> program twice.
> * LD_PROFILE=libhello.so
> * ./usehello
> * sprof libhello.so libhello.so.profile
> * LD_PROFILE=libreadname.so
> * ./usehello
> * sprof libreadname.so libreadname.so.profile
> 3) However, the output for step 2 does not represent what I
> was expecting for libreadname.so
>
>
> ================== output for libhello.so ====================
> Flat profile:
>
> Each sample counts as 0.01 seconds.
> % cumulative self self total
> time seconds seconds calls us/call us/call name
> 0.00 0.00 0.00 1 0.00 print_hello
>
> index % time self children called name
>
> 0.00 0.00 0/0 <UNKNOWN>
> [0] 0.0 0.00 0.00 0 atexit@@GLIBC_2.0 [0]
> 0.00 0.00 1/1 print_hello [1]
> 0.00 0.00 0/0
> atexit@@GLIBC_2.0 [0]
> -----------------------------------------------
> 0.00 0.00 1/1 <UNKNOWN>
> [1] 0.0 0.00 0.00 1 print_hello [1]
> -----------------------------------------------
>
> ===================== output from libreadname.so ====================
>
> Flat profile:
>
> Each sample counts as 0.01 seconds.
> % cumulative self self total
> time seconds seconds calls us/call us/call name
>
> index % time self children called name
>
> 0.00 0.00 0/0 <UNKNOWN>
> [0] 0.0 0.00 0.00 0 atexit@@GLIBC_2.0 [0]
> 0.00 0.00 0/0
> atexit@@GLIBC_2.0 [0]
> -----------------------------------------------
>
> 4) I am enclosing makefile and source files of the sample program
>
> I am enclosing the steps that I have followed:
>
> 1) make
> cc -c usehello.c -o usehello.o
> cc -fPIC -Wall -c libhello.c
> cc -fPIC -Wall -c libreadname.c
> cc -shared -Wl,-soname,libreadname.so -o ./libreadname.so
> libreadname.o
> cc -shared -Wl,-soname,libhello.so -o ./libhello.so libhello.o
> cc -o usehello usehello.o -L. -lhello -L. -lreadname
> 2) LD_PROFILE=libhello.so,libreadname.so
> 3) ./usehello
> The program execute normally but it does not generate the
> profile file on /var/tmp
> 4) I get the errors for the following commands
> sprof libhello.so,libreadname.so libhello.so.profile
> I get the following error:
> sprof: failed to load shared object
> `libhello.so,libreadname.so': No
> such file or directory
>
> OR
>
> sprof libhello.so libhello.so.profile
> I get the following error:
> sprof: cannot load profiling data: No such file or directory
>
> 5) I understand the second error - There were no profile file
> on /var/tmp
>
> I am also enclosing the sample program
>
>
> =========================== Makefile
> ==================================
>
> #
> # -Wall - Produces warning about questionable coding practice
> # -Wl - pass the option list to the linker
> # -fPIC - emit position-independent code, suitable for
> dynamic linking,
> # even if branches need large displacements.
> # -shared - for SUN machines
> #
> LIBDIR = .
>
> usehello: usehello.o libhello.so libreadname.so
> cc -o usehello usehello.o -L$(LIBDIR) -lhello
> -L$(LIBDIR) -lreadname
>
> usehello.o: usehello.c
> cc -c usehello.c -o usehello.o
>
> libhello.so: libhello.o libreadname.so
> cc -shared -Wl,-soname,$@ -o $(LIBDIR)/libhello.so libhello.o
>
> libreadname.so: libreadname.o
> cc -shared -Wl,-soname,$@ -o $(LIBDIR)/libreadname.so
> libreadname.o
>
> libreadname.o: libreadname.c
> cc -fPIC -Wall -c libreadname.c
>
> libhello.o: libhello.c
> cc -fPIC -Wall -c libhello.c
>
> clean:
> rm $(LIBDIR)/libhello.so
> rm $(LIBDIR)/libreadname.so
> rm -rf *.o
>
> ================================= libhello.c
> ==========================
> #include <stdio.h>
>
> void print_hello(char *s)
> {
> printf("Hello %s\n", s);
> }
>
> ================================ libreadname.c
> =========================
>
> #include <stdio.h>
>
> char b[512];
>
> char *read_name(void)
> {
>
> printf("enter name: ");
> b[0] = '\0';
> if (fgets(b, sizeof (b), stdin) == NULL || b[0] == '\n') {
> return (NULL);
> }
> printf("\n");
> return ((char *)&b[0]);
>
> }
>
> =============================== usehello.c
> =============================
>
> #include "libhello.h"
> #include "libreadname.h"
>
> int main(void)
> {
> int i;
> char *buffer;
>
> buffer = read_name();
> for (i=0; i < 100; i++) {
> print_hello(buffer);
> }
> return(0);
> }
>
> ============================== libhello.h
> ==============================
> extern void print_hello(char *s);
>
> ============================== libreadname.h
> ==========================
>
> extern char *read_name(void);
>
>
>
>
>