From: Randolph Chung <randolph@tausq.org>
To: parisc-linux@lists.parisc-linux.org
Subject: [parisc-linux] more on canonicalize_funcptr_for_compare
Date: Tue, 13 May 2003 22:52:25 -0700 [thread overview]
Message-ID: <20030514055225.GJ548@tausq.org> (raw)
The latest glibc on hppa (2.3.1-17) was compiled with a gcc-3.2 which
has the __canonicalize_funcptr_for_compare patch backported from gcc-3.3
... with this new version, some programs will die on startup (e.g. vim).
I traced to a segfault in __canonicalize_funcptr_for_compare.
The testcase below illustrates the problem:
=====
typedef void (*func_t)(void);
#define N ((func_t)2)
void foo(void) {};
int main(int argc, char **argv)
{
return (foo == N);
}
=====
this program segfaults when run with:
(gdb) run
Starting program: /home/tausq/sig
Program received signal SIGSEGV, Segmentation fault.
0x00010530 in __canonicalize_funcptr_for_compare ()
(gdb) bt
#0 0x00010530 in __canonicalize_funcptr_for_compare ()
#1 0x000104bc in main (argc=1, argv=0xfaf001b8) at sig.c:9
it seems like the 2 in the constant (N) confuses the comparision
routine. If I change it to 1, everything is ok.... I don't really
understand this tho, because the code for __c_f_f_c has something like:
if ((int) fptr == -1 || (unsigned int) fptr < 4096 || !((int) fptr & 2))
return (unsigned int) fptr;
so, why doesn't that match the second || case and exit? (gdb
disassmbly shows that the code tries to dereference the fptr argument
and segfaults)
randolph
--
Randolph Chung
Debian GNU/Linux Developer, hppa/ia64 ports
http://www.tausq.org/
next reply other threads:[~2003-05-14 5:48 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-05-14 5:52 Randolph Chung [this message]
2003-05-14 13:46 ` [parisc-linux] more on canonicalize_funcptr_for_compare Matthew Wilcox
2003-05-14 16:43 ` John David Anglin
2003-05-14 15:04 ` Randolph Chung
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20030514055225.GJ548@tausq.org \
--to=randolph@tausq.org \
--cc=parisc-linux@lists.parisc-linux.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox