>Submitter-Id: net >Originator: >Organization: GNU hackers >Confidential: no >Synopsis: two function pointers to the same function are not equal >Severity: non-critical >Priority: low >Category: c >Class: wrong-code >Release: 3.0.4 (Debian testing/unstable) >Environment: System: Linux spe170 2.4.17-64 #1 Sat Mar 16 17:31:44 MST 2002 parisc64 unknown Architecture: parisc64
<machine, os, target, libraries (multiple lines)> host: hppa-unknown-linux-gnu build: hppa-unknown-linux-gnu target: hppa-unknown-linux-gnu configured with: ../src/configure -v --enable-languages=c,c++,f77,proto,objc --prefix=/usr --infodir=/share/info --mandir=/share/man --enable-shared --with-gnu-as --with-gnu-ld --with-system-zlib --enable-long-long --enable-nls --without-included-gettext --disable-checking --enable-threads=posix --with-cpp-install-dir=bin hppa-linux gcc version 3.0.4 (generates 32-bit code) as, ld version 2.12.90.0.1 20020307 Debian/GNU Linux glibc-2.2.5 >Description: Two function pointers to a function residing in a shared library, one fetched from inside the library and the other from outside the library, compare as different, i.e. == returns false. >How-To-Repeat: $ cat <<EOF > main.c #include <stdio.h> extern int shared_func (); extern int (* shared_func_p ()) (); int main() { int ret = 0; if (shared_func != shared_func_p ()) { printf ("Function address: %p != Function address from DSO: %p\n", shared_func, shared_func_p ()); ret = 1; } return ret; } EOF $ cat <<EOF > shared.c int shared_func () { return 42; } int (* shared_func_p ()) () { return shared_func; } EOF $ gcc -Wall -O -c main.c $ gcc -Wall -O -fPIC -c shared.c $ gcc -o foo main.o libfoo.so $ env LD_LIBRARY_PATH=. ./foo Function address: 0x2091a != Function address from DSO: 0x400273ae >Fix: Generate different code for the comparison of function pointers. See http://gcc.gnu.org/ml/gcc/2003-06/msg01283.html