Shared Library: Exportierte Symbole begrenzen

Post Reply
Message
Author
ElBlues
Posts: 127
Joined: 25. Mar 2008 12:50
Contact:

Shared Library: Exportierte Symbole begrenzen

#1 Post by ElBlues »

Hi,

ich habe hier ein Problem mit einer Shared Library (.so).

Diese nutzt intern (aber in einem separaten Modul, so dass ich "static" nicht als lösung verwenden kann) verschiedene Symbole. Diese Symbole sind für die Schnittstelle komplett uninteressant, werden aber dennoch nach außen sichtbar, da sie ja beim Linken der Lib benötigt werden.

Leider kollidieren genau diese Symbole jetzt mit anderen Symbolen, welche in dem Programm benutzt werden, das diese Lib verwendet.

Wie kann ich das verhindern? Gibt es z.B. irgend welche Statements, mit denen ich verhindern kann, dass die Lib diese Symbole exportiert, obwohl die nach außen hin gar nicht benötigt werden?

Ach ja, umbenennen ist leider keine Option :-(
http://www.kaufkauf.net - nie wieder Einkäufe vergessen!

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#2 Post by Janka »

Schau dir das hier genauer an: http://people.redhat.com/~drepper/, Kapitel 2.2
Im Prinzip läuft es auf

Code: Select all

int libfunc(int) __attribute__ ((visibility ("hidden")));
hinaus.

Alternativ kannst du auch libtool benutzen und die unnötigen Symbole nachträglich mit der Option "-export-symbols" rauswerfen.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

ElBlues
Posts: 127
Joined: 25. Mar 2008 12:50
Contact:

#3 Post by ElBlues »

libtool klingt nach einer coolen Lösung - Danke!
http://www.kaufkauf.net - nie wieder Einkäufe vergessen!

ElBlues
Posts: 127
Joined: 25. Mar 2008 12:50
Contact:

#4 Post by ElBlues »

So, scheinbar stelle ich mich zu doof an...

Bisher habe ich in meinem Makefile mit folgendem Statement die Library erzeugt:

Code: Select all

g++ -shared   -o ../libmylib.so libmylib.o -pthread -ldl
Das hat problemlos geklappt und mit eine libmylib.so erzeugt. Das ganze mit libtools sieht so aus:

Code: Select all

libtool --mode=link g++ -shared   -o ../libmylib.so libmylib.o -pthread -ldl -export-symbols-regex mylib_
Allerdings will er mir jetzt keine Shared Library mehr bauen sondern ein executable, der Linker beschwert sich über eine fehlende main(). Was geht denn da schief?
http://www.kaufkauf.net - nie wieder Einkäufe vergessen!

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#5 Post by Janka »

Libtool erkennt am Namen des Ziels, ob es eine Shared Library werden soll. Diese müssen libXXXXX.so heißen. Alternativ kannst du den Schalter "-module" benutzen, der hat allerdings noch ein paar Nebenwirkungen.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

Post Reply