[Mesa-dev] [Bug 59879] New: reducing symbol visibility of shared objects / static libstdc++

bugzilla-daemon at freedesktop.org bugzilla-daemon at freedesktop.org
Fri Jan 25 17:29:59 PST 2013


https://bugs.freedesktop.org/show_bug.cgi?id=59879

          Priority: medium
            Bug ID: 59879
          Assignee: mesa-dev at lists.freedesktop.org
           Summary: reducing symbol visibility of shared objects / static
                    libstdc++
          Severity: normal
    Classification: Unclassified
                OS: Linux (All)
          Reporter: liquid.acid at gmx.net
          Hardware: x86-64 (AMD64)
            Status: NEW
           Version: unspecified
         Component: Mesa core
           Product: Mesa

Hello,

this is sort of cleaned up report of bug #37637.

To quickly summarize what happens there: Build r600g with the llvm compiler
backend and try starting ut2003. Segfault happens since apparantly ut's engine
has a version of libstdc++ built in, which now clashes with the libstdc++
shared lib which either r600_dri.so or LLVM (when build as shared) loads. This
is independent of preloading order. When the symbols from the system libstdc++
take preference, then the game engine crashes. When the game engine symbols
take preference, the r600g driver initialization crashes.

The fix for the problem: Since we can't modify the ut2003 binary, we have to
hide the "duplicate" symbols somehow.

This means:
- build r600g with static llvm
- build r600 with static libstdc++
- only make those symbols in r600_dri.so visible which are necessary

Building r600g with static llvm is trivial. The symbol visibility can be
properly handled by ld:
http://sourceware.org/binutils/docs-2.21/ld/VERSION.html#VERSION

My current dri-symbols.map:
{
  global: __dri*; dri*; _glapi*;
  local: *;
};

This hides everything except for the symbols matching __dri*, dri* and _glapi*.
This can be potentially reduced even further. However it's not clear to me what
the loader code in libGL really needs.

This version-script'ing can be properly put into autotools language:
http://www.gnu.org/software/gnulib/manual/html_node/LD-Version-Scripts.html

----------------------------


What I'm struggling with is properly telling autotools to build a shared lib
with static libstdc++. The gcc manpage mentions an option called
"-static-libstdc++", but it doesn't seem to have any effect.

Let's look at the critical calls (I've shortened them somewhat):

OK, we're in src/gallium/targets/dri-r600. The last libtool call that the
Makefile executes is the following one:

bin/sh ../../../../libtool  --tag=CXX   --mode=link g++  -g -O2 -Wall
-fno-strict-aliasing -fno-builtin-memcmp  -module -avoid-version -shared
-no-undefined
-Wl,--version-script=../../../../src/gallium/targets/dri-symbols.map
-L/usr/lib64/llvm  -lpthread -lffi -ldl -lm   -o r600_dri.la -rpath
/usr/local/lib/dri target.lo utils.lo dri_util.lo xmlconfig.lo <libtool files>
-ldrm   -lexpat -lm -lrt -lpthread -ldl -ldrm   -ldrm_radeon   <llvm libs>


libtool itself produces this call from it:

g++ -fPIC -DPIC -shared -nostdlib <some object files> -Wl,--whole-archive <the
archives> -Wl,--no-whole-archive  -L/usr/lib64/llvm <llvm libs part 1> -lexpat
-lrt -lpthread -ldl -ldrm -ldrm_radeon <llvm libs part 2>
-L/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.2
-L/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.2/../../../../lib64 -L/lib/../lib64
-L/usr/lib/../lib64
-L/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.2/../../../../x86_64-pc-linux-gnu/lib
-L/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.2/../../.. -lstdc++ -lm -lc -lgcc_s
<more object files> -O2
-Wl,--version-script=../../../../src/gallium/targets/dri-symbols.map
-Wl,-soname -Wl,r600_dri.so -o .libs/r600_dri.so

Notice the "-lstdc++", dynamic linking to libstdc++. What I'd like libtool (and
eventually autotools) to produce is the following:

g++ -fPIC -DPIC -shared -nostdlib <some object files> -Wl,-Bstatic -lstdc++
-Wl,-Bdynamic -Wl,--whole-archive <the archives> -Wl,--no-whole-archive 
-L/usr/lib64/llvm <llvm libs part 1> -lexpat -lrt -lpthread -ldl -ldrm
-ldrm_radeon <llvm libs part 2> -L/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.2
-L/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.2/../../../../lib64 -L/lib/../lib64
-L/usr/lib/../lib64
-L/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.2/../../../../x86_64-pc-linux-gnu/lib
-L/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.2/../../.. -lm -lc -lgcc_s <more object
files> -O2 -Wl,--version-script=../../../../src/gallium/targets/dri-symbols.map
-Wl,-soname -Wl,r600_dri.so -o .libs/r600_dri.so

This is just removing "-lstdc++" and replacing it by "-Wl,-Bstatic -lstdc++
-Wl,-Bdynamic" at a different position (!). Putting it in front of the archive
assembly seems to be critical.

This links fine (no warnings, etc.) and produces a .so that is loaded properly
by libGL's loader and (more importantly) works fine with ut2003.

However it is still a mystery to me how to makes this clear to either libtool
or autotools.

Greets,
Tobias

-- 
You are receiving this mail because:
You are the assignee for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20130126/bf5dfae4/attachment-0001.html>


More information about the mesa-dev mailing list