2013-03-10 13 views
7

I Anwendung, die eine Funktion f1 void f1()Deck Funktionen in C

Zusätzlich hat, habe ich eine Bibliothek, die unter Verwendung von I LD_PRELOAD Last.

Die Bibliothek enthält mehrere Codedateien und mehrere Header-Dateien und kompiliert diese in die .so-Datei.

Eine der Header-Dateien verwendet auch eine Funktion mit dem Namen f1 mit der gleichen Signatur wie oben. Die letzte f1 wird nur in der Bibliothek verwendet. (Ich kann es nicht in statische Methode ändern)

Das Problem ist, dass, wenn ich die Bibliothek laden (LD_PRELOAD) f1 aus der Bibliothek überschreibt f1 der Anwendung.

Gibt es eine Möglichkeit, f1 der Bibliothek zu konfigurieren, nur für die Bibliothek sichtbar zu sein?

+2

Gibt es einen Grund, warum Sie nicht einfach eine der Funktionsdeklarationen umbenennen können? Ich vermute, das ist in einer vorhandenen Codebasis, die möglicherweise warum nicht – Bojangles

Antwort

5

Wenn Sie die Header-Dateien überhaupt ändern können, stellen Sie die Funktion static es nur in dieser Zusammenstellung Einheit sichtbar zu machen, oder sie markieren mit __attribute__ ((visibility ("hidden"))) (GCC nur), um es nur in dieser Bibliothek sichtbar zu machen:

__attribute__ ((visibility ("hidden"))) void f1(); 
+0

Ist '__attribute__ ((Sichtbarkeit (" versteckt ")))' Makro, die durch statische ersetzen **? ** oder wie funktioniert es? –

+1

@GrijeshChauhan: Nein, dieses Attribut markiert ein Symbol als versteckte Sichtbarkeit. Es ist nur sichtbar * innerhalb dieser shared library * (ähnlich wie das Gegenteil von Win32 'DLLEXPORT'). Das versteckte Sichtbarkeitsattribut wird an den Linker übergeben und von diesem verstanden (im Gegensatz zu 'static', was ein Symbol im Grunde * für den Linker * unsichtbar macht). – nneonneo

+0

Schönen Dank !! .. –

3

Sie könnten auch Ihre Bibliothek mit -fvisibility=hidden kompilieren und explizite __attribute__ ((visibility ("default"))) für die wenigen Funktionen Ihrer Bibliothek verwenden, die sichtbar sein müssen.