home *** CD-ROM | disk | FTP | other *** search
- Path: sparky!uunet!zephyr.ens.tek.com!uw-beaver!news.u.washington.edu!milton.u.washington.edu!kenney
- From: kenney@milton.u.washington.edu (Michael Kenney)
- Newsgroups: comp.os.linux
- Subject: Strange gcc problem/bug
- Message-ID: <1992Jul24.145038.29755@u.washington.edu>
- Date: 24 Jul 92 14:50:38 GMT
- Sender: news@u.washington.edu (USENET News System)
- Reply-To: kenney@u.washington.edu
- Organization: University of Washington, Seattle
- Lines: 125
-
-
- Fellow Linux users,
-
- I think I have run across a bug in gcc v2.2.2.
-
- Consider the following bit of code (the getuname function is from the
- getty_ps package):
-
- ---------------------------------------
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <sys/param.h>
- /*
- ** getuname() - retrieve the system's node name
- **
- ** Returns pointer to name or a zero-length string if not found.
- */
- char *
- getuname()
- {
- struct utsname uts;
- static char name[80];
- int r;
- name[0] = '\0';
- if (uname(&uts) != -1)
- (void) strcpy(name, uts.nodename);
- return(name);
- }
-
- main(ac, av)
- unsigned ac;
- char **av;
- {
- printf("hostname = %s\n",getuname());
- }
- -------------------------------------------------------------------------
-
- When I compile the above program, I get the following output:
-
- /lib/libc2.2.2
-
- If I use static linking, I get no output at all. What really makes things
- interesting is; if I make "uts" static in getuname, everything works fine.
-
- Here's the assembler output for getuname (uts local):
-
- --------------------------------------------------------------------------
- .file "testname.c"
- gcc2_compiled.:
- .lcomm _name.6,80
- .text
- .align 2
- .globl _getuname
- _getuname:
- pushl %ebp
- movl %esp,%ebp
- subl $276,%esp
- movb $0,_name.6
- leal -272(%ebp),%eax
- pushl %eax
- call _uname
- addl $4,%esp
- movl %eax,%eax
- cmpl $-1,%eax
- je L7
- leal -207(%ebp),%eax
- pushl %eax
- pushl $_name.6
- call _strcpy
- addl $8,%esp
- L7:
- movl $_name.6,%eax
- jmp L6
- .align 2,0x90
- L6:
- leave
- ret
- ---------------------------------------------------------------------------
-
- Now here's the case for static uts:
-
- ----------------------------------------------------------------------------
- .file "testname.c"
- gcc2_compiled.:
- .lcomm _uts.6,272
- .lcomm _name.7,80
- .text
- .align 2
- .globl _getuname
- _getuname:
- pushl %ebp
- movl %esp,%ebp
- subl $4,%esp
- movb $0,_name.7
- pushl $_uts.6
- call _uname
- addl $4,%esp
- movl %eax,%eax
- cmpl $-1,%eax
- je L7
- pushl $_uts.6+65
- pushl $_name.7
- call _strcpy
- addl $8,%esp
- L7:
- movl $_name.7,%eax
- jmp L6
- .align 2,0x90
- L6:
- leave
- ret
- ----------------------------------------------------------------------------
-
- Anybody know what's going on here? I'm not that familiar with Minix
- assembler, does "leave" clean up the stack properly before returning?
- I was slogging through this fairly late last night so there may be something
- obvious that I am missing :-).
-
- Mike
-
- ----------
- Mike Kenney
- UW Applied Physics Lab
- mikek@apl.washington.edu
-