Vulnerability Development mailing list archives
Re: get SP on Solaris (SPARC) with GCC 3.3.2
From: Inode <inode () mediaservice net>
Date: Tue, 13 Jan 2004 21:35:47 +0100
On my box the problem seem to be another... (gdb) disass get_sp Dump of assembler code for function get_sp: 0x00010dd8 <get_sp+0>: mov %sp, %i0 0x00010ddc <get_sp+4>: retl 0x00010de0 <get_sp+8>: nop End of assembler dump. (gdb) but doesn't work...Another way to get SP (maybe more simple) it's get the ARGV[0] of out program... work fine, but now I would try to undestand why with gcc 3.3.2 doesn't work this function...
Inode Jonathon Giffin ha scritto:
My reply is based on my experimentation on my machine; results elsewhere may differ. I don't know why, but 3.3.2 (with no optimization) inserts an extra assembly instruction into get_sp: save %sp, -112, %sp mov %sp,%i0 mov %g1, %i0 ret restore The return value gets overwritten with whatever is in %g1. This need not be the current pc. The 3.2 compiler does not insert the extra mov instruction, so you get the behavior that you expected. For code that works with both compilers and no optimization, use: unsigned long get_sp (void) { __asm__("mov %sp,%g1"); __asm__("mov %g1,%i0"); } If you compile with -O (optimization), then 3.3.2 will not insert the extra mov instruction and you can use unsigned long get_sp (void) { __asm__("mov %sp,%o0"); } with both compilers. Note that the mov destination must be OUTPUT register 0 because optimization will produce a leaf function. Thanks, Jon
Current thread:
- get SP on Solaris (SPARC) with GCC 3.3.2 Inode (Jan 13)
- Re: get SP on Solaris (SPARC) with GCC 3.3.2 Jonathon Giffin (Jan 13)
- Re: get SP on Solaris (SPARC) with GCC 3.3.2 Inode (Jan 13)
- Re: get SP on Solaris (SPARC) with GCC 3.3.2 Jonathon Giffin (Jan 13)
- Re: get SP on Solaris (SPARC) with GCC 3.3.2 Inode (Jan 13)
- Re: get SP on Solaris (SPARC) with GCC 3.3.2 Jonathon Giffin (Jan 13)