Hi. We're using use ELDK 3.0 with kernel linuxppc_2_4_devel from DENX CVS on a Lite5200 board. The problem arises linking a program with a library using fopen and the pthread lib dynamically. My program gets stucked when doing a fopen call. This doesn't happen if the linking is static (against .a). Here are an example library and program that show this problem:
* The main program is: // // cositas.cpp // #include <stdio.h> #include <pthread.h> void Polopos(char *fname); int main(int argc, char **argv) { pthread_t th; // Do things Polopos("/etc/AVMRecorder.conf"); return 0; } * The library it uses along with pthread lib is: // // acasitos.cpp // #include <stdio.h> void Polopos(char *foo) { fprintf(stderr, "Opening file %s...\n", foo); FILE* cositas = fopen(foo, "rt"); fprintf(stderr, "...file %s open\n", foo); fprintf(stderr, "Closing file %s...\n", foo); fclose(cositas); fprintf(stderr, "...file %s closed\n", foo); } * To build the shared lib I issue the following commands: @ /usr/local/ppc_82xx/bin/ppc_82xx-g++ -c -o acasitos.o -I/usr/local/ppc_82xx/local/include acasitos.cpp @ /usr/local/ppc_82xx/bin/ppc_82xx-ld -o libacasitos.so acasitos.o * And for the final binary: @ /usr/local/ppc_82xx/bin/ppc_82xx-g++ -o cositas -L. -I/usr/local/ppc_82xx/local/include -lpthread -lacasitos cositas.cpp * The output for the program is: Opening file /etc/AVMRecorder.conf... * The output of strace is: execve("./cositas", ["./cositas"], [/* 20 vars */]) = 0 uname({sys="Linux", node="localhost", ...}) = 0 brk(0) = 0x10011c68 open("/etc/ld.so.preload", O_RDONLY) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=11995, ...}) = 0 mmap(NULL, 11995, PROT_READ, MAP_PRIVATE, 3, 0) = 0x30015000 close(3) = 0 open("/lib/libpthread.so.0", O_RDONLY) = 3 read(3, "[EMAIL PROTECTED]"..., 1024) = 1024 fstat64(3, {st_mode=S_IFREG|0755, st_size=1416528, ...}) = 0 mmap(0xff8f000, 395776, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0xff8f000 mprotect(0xff9d000, 338432, PROT_NONE) = 0 mmap(0xff9f000, 69632, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0xff9f000 mmap(0xffb0000, 260608, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xffb0000 close(3) = 0 open("/usr/local/lib/libacasitos.so", O_RDONLY) = 3 read(3, "\177ELF\1\2\1\0\0\0\0\0\0\0\0\0\0\3\0\24\0\0\0\1\0\0\4"..., 1024) = 1024 fstat64(3, {st_mode=S_IFREG|0755, st_size=3141, ...}) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x30018000 mmap(0xff6e000, 67136, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0xff6e000 mprotect(0xff6f000, 63040, PROT_NONE) = 0 mmap(0xff7e000, 4096, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0xff7e000 close(3) = 0 open("/usr/lib/libstdc++.so.5", O_RDONLY) = 3 read(3, "\177ELF\1\2\1\0\0\0\0\0\0\0\0\0\0\3\0\24\0\0\0\1\0\4C\250"..., 1024) = 1024 fstat64(3, {st_mode=S_IFREG|0755, st_size=809956, ...}) = 0 mmap(0xfe82000, 898616, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0xfe82000 mprotect(0xff35000, 165432, PROT_NONE) = 0 mmap(0xff42000, 86016, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0xb0000) = 0xff42000 mmap(0xff57000, 26168, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xff57000 close(3) = 0 open("/lib/libm.so.6", O_RDONLY) = 3 read(3, "\177ELF\1\2\1\0\0\0\0\0\0\0\0\0\0\3\0\24\0\0\0\1\0\0\242"..., 1024) = 1024 fstat64(3, {st_mode=S_IFREG|0755, st_size=497740, ...}) = 0 mmap(0xfdec000, 545232, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0xfdec000 mprotect(0xfe5f000, 74192, PROT_NONE) = 0 mmap(0xfe6c000, 20480, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x70000) = 0xfe6c000 mmap(0xfe71000, 464, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xfe71000 close(3) = 0 open("/lib/libc.so.6", O_RDONLY) = 3 read(3, "\177ELF\1\2\1\0\0\0\0\0\0\0\0\0\0\3\0\24\0\0\0\1\0\1\300"..., 1024) = 1024 fstat64(3, {st_mode=S_IFREG|0755, st_size=1363888, ...}) = 0 mmap(0xfc8d000, 1370128, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0xfc8d000 mprotect(0xfdc4000, 96272, PROT_NONE) = 0 mmap(0xfdcd000, 49152, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0x130000) = 0xfdcd000 mmap(0xfdd9000, 10256, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xfdd9000 close(3) = 0 mprotect(0xfc8d000, 1273856, PROT_READ|PROT_WRITE) = 0 mprotect(0xfc8d000, 1273856, PROT_READ|PROT_EXEC) = 0 mprotect(0xff6e000, 4096, PROT_READ|PROT_WRITE) = 0 mprotect(0xff6e000, 4096, PROT_READ|PROT_EXEC) = 0 munmap(0x30015000, 11995) = 0 getpid() = 1212 rt_sigaction(SIGRTMIN, {0xff97690, [], 0}, NULL, 8) = 0 rt_sigaction(SIGRT_1, {0xff97548, [], 0}, NULL, 8) = 0 rt_sigaction(SIGRT_2, {0xff976c8, [], 0}, NULL, 8) = 0 rt_sigprocmask(SIG_BLOCK, [RTMIN], NULL, 8) = 0 _sysctl({{CTL_KERN, KERN_VERSION}, 2, 0x7ffff898, 33, (nil), 0}) = 0 brk(0) = 0x10011c68 brk(0x10012c68) = 0x10012c68 brk(0x10013000) = 0x10013000 write(2, "Opening file /etc/AVMRecorde"..., 42Opening file /etc/AVMRecorder.conf... ) = 42 rt_sigprocmask(SIG_SETMASK, NULL, [RTMIN], 8) = 0 rt_sigsuspend([] <unfinished ...> It remains in the last line until I Ctrl-C the program. Thanks in advance