I'm having a problem statically linking a big c++ application on
Centos4. I can make it work on Centos5 and that's great. I just need
to figure out a way to reproduce the problem on a small test case.
The specific problem is that when I throw an exception, I get a
segfault. It only happens on Centos4, and only on ia-32 machines. In
an act of desparation I disassembled the bit of code that's
segfaulting and got this:
(gdb) disass
Dump of assembler code for function _ZN14__gnu_internal10get_globalEv:
0x08579614 <...get_globalEv+0>: call 0x8577c3e <__i686.get_pc_thunk.cx>
0x08579619 <...get_globalEv+5>: add $0x3b31c7,%ecx
0x0857961f <...get_globalEv+11>: push %ebp
0x08579620 <...get_globalEv+12>: mov $0xfffffff8,%eax
0x08579626 <...get_globalEv+18>: mov %esp,%ebp
0x08579628 <...get_globalEv+20>: pop %ebp
0x08579629 <...get_globalEv+21>: add %gs:0x0,%eax <<<--- dies here! <<<
0x08579630 <...get_globalEv+28>: ret
0x08579631 <...get_globalEv+29>: nop
End of assembler dump.
When it dies, %gs is 0 which looks tls related.
Only problem is that when I write tiny test programs to reproduce
this, they work fine. %gs is nonzero and everybody is happy. But on my
big hulking app, I can throw and catch an exception immediately on
entry to main and it segfaults faithfully.
Relevant compiler flags are these:
g++ -c -o whatever.o -O0 -ggdb -Wno-deprecated -Werror -fPIC
-Dmanything -Imanydirs whatever.cpp
g++ -o whatever -static -static-libgcc many.o -Lmanydirs -lpthread
-lanotherlib -lzlib -lesmtp -lnsl -lrpcsvc -lcrypt -lacl -ldl -lrt
-landmanymore
So I'm looking for some guidance on what things I could try to isolate
this in a smaller app.
--
Darrin