The following shell script indicates the problem.
-------------------------------snip here-----------------------------
#! /bin/sh
mkdir /tmp/t.$$ || exit 3
cd /tmp/t.$$ || exit 3
cat >main.c <<'EOF'
#include <stdio.h>
#include <dlfcn.h>
int main(void)
{
void *handle, *sym;
char *error;
puts("calling dlopen");
handle = dlopen("./dyn.so", RTLD_NOW);
if (!handle) {
printf("%s\n", dlerror());
return 1;
}
puts("calling dlsym");
sym = dlsym(handle, "sym");
if ((error = dlerror()) != 0) {
printf("%s\n", error);
return 1;
}
puts("calling sym");
((void (*)(void))sym)();
puts("done");
return 0;
}
EOF
cat >dyn.c <<'EOF'
#include <stdio.h>
void sym(void)
{
puts("in sym");
}
EOF
[ -n "$SHFLAGS" ] || SHFLAGS="-fPIC -shared"
[ -n "$CC" ] || CC=gcc
set -x
$CC $CFLAGS $SHFLAGS dyn.c -o dyn.so
$CC $CFLAGS main.c -o main -ldl
./main || exit $?
cd /tmp
rm -rf t.$$
-------------------------------snip here-----------------------------
This script works just fine with binutils 2.12.1. When I try it with
binutils 2.13, I get the following output:
$ sh -x test-dynload
+ mkdir /tmp/t.3027
+ cd /tmp/t.3027
+ cat
+ cat
+ [ -n ]
SHFLAGS=-fPIC -shared
+ [ -n ]
CC=gcc
+ set -x
+ gcc -fPIC -shared dyn.c -o dyn.so
+ gcc main.c -o main -ldl
+ ./main
calling dlopen
Segmentation Fault - core dumped
+ exit 139
Here is a more detailed report:
$ CC='gcc -v' sh -x test-dynload
+ mkdir /tmp/t.3042
+ cd /tmp/t.3042
+ cat
+ cat
+ [ -n ]
SHFLAGS=-fPIC -shared
+ [ -n gcc -v ]
+ set -x
+ gcc -v -fPIC -shared dyn.c -o dyn.so
Reading specs from /usr/gnu/lib/gcc-lib/sparc-sun-solaris2.8/3.2/specs
Configured with: /scratch/build-gcc487/gcc-3.2/configure --prefix=/usr/gnu
--with-ld=/usr/gnu/bin/ld --with-as=/usr/gnu/bin/as --with-gnu-as --with-gnu-ld
--with-local-prefix=/usr/gnu --enable-libgcj
Thread model: posix
gcc version 3.2
/usr/gnu/lib/gcc-lib/sparc-sun-solaris2.8/3.2/cc1 -lang-c -v -D__GNUC__=3
-D__GNUC_MINOR__=2 -D__GNUC_PATCHLEVEL__=0 -D__GXX_ABI_VERSION=102 -Dsparc
-Dsun -Dunix -D__svr4__ -D__SVR4 -D__PRAGMA_REDEFINE_EXTNAME -D__sparc__
-D__sun__ -D__unix__ -D__svr4__ -D__SVR4 -D__PRAGMA_REDEFINE_EXTNAME -D__sparc
-D__sun -D__unix -Asystem=unix -Asystem=svr4 -D__NO_INLINE__
-D__STDC_HOSTED__=1 -D__SIZE_TYPE__=unsigned int -D__PTRDIFF_TYPE__=int
-D__WCHAR_TYPE__=long int -D__WINT_TYPE__=long int -D__GCC_NEW_VARARGS__
-Acpu=sparc -Amachine=sparc dyn.c -quiet -dumpbase dyn.c -version -fPIC -o
/var/tmp//cc7WbdCs.s
GNU CPP version 3.2 (cpplib) (sparc ELF)
GNU C version 3.2 (sparc-sun-solaris2.8)
compiled by GNU C version 3.2.
ignoring nonexistent directory "/usr/gnu/sparc-sun-solaris2.8/include"
ignoring duplicate directory "/usr/gnu/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/gnu/include
/usr/gnu/lib/gcc-lib/sparc-sun-solaris2.8/3.2/include
/usr/include
End of search list.
/usr/gnu/bin/as -V -Qy -s -K PIC -o /var/tmp//ccOLQtaT.o /var/tmp//cc7WbdCs.s
GNU assembler version 2.13 (sparc-sun-solaris2.8) using BFD version 2.13
/usr/gnu/lib/gcc-lib/sparc-sun-solaris2.8/3.2/collect2 -V -G -dy -z text -Y
P,/usr/ccs/lib:/usr/lib -Qy -o dyn.so
/usr/gnu/lib/gcc-lib/sparc-sun-solaris2.8/3.2/crti.o /usr/ccs/lib/values-Xa.o
/usr/gnu/lib/gcc-lib/sparc-sun-solaris2.8/3.2/crtbegin.o
-L/usr/gnu/lib/gcc-lib/sparc-sun-solaris2.8/3.2
-L/usr/gnu/lib/gcc-lib/sparc-sun-solaris2.8/3.2/../../../../sparc-sun-solaris2.8/lib
-L/usr/ccs/bin -L/usr/ccs/lib
-L/usr/gnu/lib/gcc-lib/sparc-sun-solaris2.8/3.2/../../.. /var/tmp//ccOLQtaT.o
-lgcc_s -lgcc_s /usr/gnu/lib/gcc-lib/sparc-sun-solaris2.8/3.2/crtend.o
/usr/gnu/lib/gcc-lib/sparc-sun-solaris2.8/3.2/crtn.o
GNU ld version 2.13
Supported emulations:
elf32_sparc
elf64_sparc
+ gcc -v main.c -o main -ldl
Reading specs from /usr/gnu/lib/gcc-lib/sparc-sun-solaris2.8/3.2/specs
Configured with: /scratch/build-gcc487/gcc-3.2/configure --prefix=/usr/gnu
--with-ld=/usr/gnu/bin/ld --with-as=/usr/gnu/bin/as --with-gnu-as --with-gnu-ld
--with-local-prefix=/usr/gnu --enable-libgcj
Thread model: posix
gcc version 3.2
/usr/gnu/lib/gcc-lib/sparc-sun-solaris2.8/3.2/cc1 -lang-c -v -D__GNUC__=3
-D__GNUC_MINOR__=2 -D__GNUC_PATCHLEVEL__=0 -D__GXX_ABI_VERSION=102 -Dsparc
-Dsun -Dunix -D__svr4__ -D__SVR4 -D__PRAGMA_REDEFINE_EXTNAME -D__sparc__
-D__sun__ -D__unix__ -D__svr4__ -D__SVR4 -D__PRAGMA_REDEFINE_EXTNAME -D__sparc
-D__sun -D__unix -Asystem=unix -Asystem=svr4 -D__NO_INLINE__
-D__STDC_HOSTED__=1 -D__SIZE_TYPE__=unsigned int -D__PTRDIFF_TYPE__=int
-D__WCHAR_TYPE__=long int -D__WINT_TYPE__=long int -D__GCC_NEW_VARARGS__
-Acpu=sparc -Amachine=sparc main.c -quiet -dumpbase main.c -version -o
/var/tmp//ccWRaICW.s
GNU CPP version 3.2 (cpplib) (sparc ELF)
GNU C version 3.2 (sparc-sun-solaris2.8)
compiled by GNU C version 3.2.
ignoring nonexistent directory "/usr/gnu/sparc-sun-solaris2.8/include"
ignoring duplicate directory "/usr/gnu/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/gnu/include
/usr/gnu/lib/gcc-lib/sparc-sun-solaris2.8/3.2/include
/usr/include
End of search list.
/usr/gnu/bin/as -V -Qy -s -o /var/tmp//ccW2yqXV.o /var/tmp//ccWRaICW.s
GNU assembler version 2.13 (sparc-sun-solaris2.8) using BFD version 2.13
/usr/gnu/lib/gcc-lib/sparc-sun-solaris2.8/3.2/collect2 -V -Y
P,/usr/ccs/lib:/usr/lib -Qy -o main
/usr/gnu/lib/gcc-lib/sparc-sun-solaris2.8/3.2/crt1.o
/usr/gnu/lib/gcc-lib/sparc-sun-solaris2.8/3.2/crti.o /usr/ccs/lib/values-Xa.o
/usr/gnu/lib/gcc-lib/sparc-sun-solaris2.8/3.2/crtbegin.o
-L/usr/gnu/lib/gcc-lib/sparc-sun-solaris2.8/3.2
-L/usr/gnu/lib/gcc-lib/sparc-sun-solaris2.8/3.2/../../../../sparc-sun-solaris2.8/lib
-L/usr/ccs/bin -L/usr/ccs/lib
-L/usr/gnu/lib/gcc-lib/sparc-sun-solaris2.8/3.2/../../.. /var/tmp//ccW2yqXV.o
-ldl -lgcc -lgcc_eh -lc -lgcc -lgcc_eh -lc
/usr/gnu/lib/gcc-lib/sparc-sun-solaris2.8/3.2/crtend.o
/usr/gnu/lib/gcc-lib/sparc-sun-solaris2.8/3.2/crtn.o
GNU ld version 2.13
Supported emulations:
elf32_sparc
elf64_sparc
+ ./main
calling dlopen
Segmentation Fault - core dumped
+ exit 139