libGL exported __glX* symbols (Was: glucose and xgl progress)
jrfonseca at tungstengraphics.com
Thu Sep 20 05:50:58 PDT 2007
On 9/19/07, Gabor Gombas <gombasg at sztaki.hu> wrote:
> On Wed, Sep 19, 2007 at 10:20:49AM +0000, José Fonseca wrote:
> > However, when loaded, references to __glXFreeContext *inside*
> > libglxgext.so are linked to the external __glXFreeContext in libGL.so:
> If you have multiple definitions for a symbol it is completely random
> which a given reference will resolve to.
> Now, the two underscores are a good hint that these are internal symbols
> and they should not be exported at all or if they have to, one of them
> must be renamed.
> > libtool's -export-dynamic flag is not being used. Using libtool's -module
> > flag doesn't change anything.
> Does this symbol have to be exported? If no, you should use libtool's
> --export-symbol feature to explicitely declare which symbols should be
> visible and which should not. In fact, it is always wise to use
> --export-symbol when creating shared libraries to prevent ABI breakage
> by accidentally exporting private symbols.
> If __glXFreeContext should be exported, then it should be decided which
> library owns this symbol, and the other must be modified not to export
> If it is the case that libGL.so exports __glXFreeContext but
> libglxgext.so wants to locally override it, and for some reason you
> absolutely cannot rename it, then you must use gcc's
> __visibility__((__protected__)) attribute when declaring __glXFreeContext
> in libglgxext.so, but that is not portable to non-ELF platforms and
> other compilers and also has run-time performance costs IIRC.
I agree in principle with your suggestions. But I'm not entitled to
decide if __glX* symbols
should or not be exported, nor to say what's the best way to accomplish it.
I know that __glX* functions came originally from SGI code. From there
derived copies appear on mesa (for libGL), and more than once in
xserver code -- I suppose always for indirect rendering purposes (in
places such as AIGLX, DMX, and Xgl). It is likely that other vendors
also ship libGL exporting those symbols.
But it would definitely make things simpler and less likely to break
if the __glX* symbols were not exported...
More information about the xorg