2023-02-12

g++ linking libs instead of *.o containing static members leads to segfault

I observed segfaults if I used linking libraries instead of linking all the primary compiler output with g++. This problem occurs with libraries with classes with static members. And I don't find a solution with libs. What went wrong?

Simplified: I created two libraries called alpha and beta. Alpha contains a static member (race conditions were excluded). The library alpha depends on beta. And alpha and beta depend on a third library, the public library gamma (in my case Cairo).

The static member is defined as private within a class Alpha and access via getters and setters with mutex locks.

I compile my the source code for alpha

g++ -fPIC -DPIC `pkg-config --cflags gamma` alpha*.cpp -c
ar rcs alpha.a alpha*.o

and beta, respectively

g++ -fPIC -DPIC `pkg-config --cflags gamma` beta*.cpp -c
ar rcs beta.a beta*.o

Now, I want to use these libs (alpha, beta, and gamma) in my program delta. I tried two different ways to compile and link in two steps. First, compile and simply link the compiled objects:

g++ -fPIC -DPIC `pkg-config --cflags gamma` delta.cpp -c -o delta.o
g++ -fPIC -DPIC alpha*.o beta*.o delta.o `pkg-config --libs gamma` -o delta

This compiles, links and runs. Without any problems.

But if I want to use the .a libs instead and try:

g++ -fPIC -DPIC `pkg-config --cflags gamma` delta.cpp -c -o delta.o
g++ -fPIC -DPIC -lalpha -lbeta delta.o `pkg-config --libs gamma` -o delta

This compiles and links. But produces a segfault on running. During the very first access to the static member.



No comments:

Post a Comment