From Bugzilla Helper: User-Agent: Mozilla/4.77 [en] (X11; U; SunOS 5.8 sun4u) Description of problem: Dynamic libs which include a reference to stat() will fail to resolve symbol if linked on RH7.1. The standard libc /usr/lib/libc.so is a text file that contains this line: GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a ) and the stat function is found in the static lib. But for some reason if linked using a 7.1 linker the symbol fails to resolve. If linked on 7.0 or 6.2 it resolves fine. Version-Release number of selected component (if applicable): How reproducible: Always Steps to Reproduce: 1. See below for source files main.cxx st.c 2. gcc -c main.cxx 3. gcc -c st.c 4. /usr/bin/ld -v -shared -fPIC -o libtest.so st.o 5. gcc main.o libtest.so 6. setenv LD_LIBRARY_PATH . 7. ./a.out /tmp Actual Results: mylanta[2] gcc -c main.cxx mylanta[3] gcc -c st.c mylanta[4] /usr/bin/ld -v -shared -fPIC -o libtest.so st.o GNU ld version 2.10.91 (with BFD 2.10.91.0.2) mylanta[5] gcc main.o libtest.so setenv LD_LIBRARY_PATH . mylanta[6] ./a.out /tmp ./a.out: error while loading shared libraries: ./libtest.so: undefined symbol: stat Expected Results: Filesystem /tmp uses blocks of size 4096 Additional info: --------- main.cxx ---------- #include <stdio.h> #include <stdlib.h> extern "C" int print_stats( char *); main (int argc, char ** argv ) { if (argc>1) for (int i=1; i<argc; i++) print_stats( argv[i] ); else printf("Missing argument\n"); exit(0); } -------- st.c --------- #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <stdio.h> int print_stats(char *filename ) { struct stat buffer; if (stat( filename, &buffer )==0) printf("Filesystem %s uses blocks of size %ld\n", filename, buffer.st_blksize); else printf("Error stating %s\n", filename); return 0; } ---------
You should never use ld -shared to link shared library, that's what gcc -shared is for. It takes care of all necessary libs, options and objects.