So beschränken Sie die API, die in der gemeinsam genutzten Linux-Bibliothek in C-Sprache veröffentlicht werden soll

** Probleme mit der in der gemeinsam genutzten Bibliothek veröffentlichten API **

Ich hatte große Probleme beim Erstellen gemeinsam genutzter Bibliotheken. Mit zunehmender Größe der Bibliothek werden wir das Innere natürlich in Dateien aufteilen, die API in der Bibliothek definieren und entwickeln.

Zu dieser Zeit habe ich mich immer gefragt, ob es einen Weg gibt.

Wenn Sie es normal machen, wird es so sein. ** Die in der Bibliothek definierte Header-API ist auch in den APIs enthalten, die in der erstellten gemeinsam genutzten Bibliothek verfügbar sind. **

Der öffentliche Header wird angegeben. Wenn Sie jedoch den intern verwendeten Header zwangsweise lesen, wird diese API ebenfalls verwendet. Besonders wenn Sie eine Bibliothek auf Github veröffentlichen, ist es ein bisschen beschissen, unbeabsichtigte APIs verwenden zu können, wie Sie möchten.

Also habe ich es überprüft, ohne es zu erwarten.

** Sie können die in der gemeinsam genutzten Bibliothek veröffentlichten APIs einschränken! ** ** **

Es gibt nichts, was du nicht tun kannst, ja mit GNU! Es scheint also, dass Sie die Veröffentlichung mit vorhandenen Linux-Funktionen einschränken können.

Referenz: http://0xcc.net/blog/archives/000108.html

Angenommen, Sie haben einen öffentlichen Bibliotheksheader wie folgt: (Zuvor erstellte Zeitmessbibliothek)

timetestlog.h


void * timetestlog_init(char *delimiter, size_t maxloglen, unsigned long maxstoresize);
int timetestlog_store_printf(void * handle, const char *format, ...);
void timetestlog_exit(void * handle);

Als Bibliotheksersteller möchte ich, dass Sie nur diese API verwenden.

Angenommen, Sie haben diese API bei der Entwicklung dieser Bibliothek verwendet.

testfile.h


int testfunction(void);

** Normale Zusammenstellung **

Wenn Sie damit normal kompilieren, können Sie testfunction verwenden, wenn Sie testfile.h einschließen.

Sie können die veröffentlichte API mit dem Befehl nm -D oder objdump -t überprüfen. Wenn Sie sich das Ergebnis der Befehlsausführung ansehen, sehen Sie, dass die Testfunktion enthalten ist. Außerdem gibt es hier und da zusätzliche APIs

Linux env$ nm -D .libs/libtimelog.so | grep " T "
0000000000000dec T _fini
00000000000007d8 T _init
0000000000000dc0 T testfunction
0000000000000d90 T timetestlog_exit
0000000000000b10 T timetestlog_init
0000000000000c90 T timetestlog_store_printf
Linux env$ objdump -t .libs/libtimelog.so | grep " g"
0000000000000dc0 g     F .text  000000000000002c              testfunction
0000000000202068 g       .data  0000000000000000              _edata
0000000000000dec g     F .fini  0000000000000000              _fini
0000000000000c90 g     F .text  00000000000000fc              timetestlog_store_printf
0000000000000b10 g     F .text  000000000000017f              timetestlog_init
0000000000202070 g       .bss   0000000000000000              _end
0000000000202068 g       .bss   0000000000000000              __bss_start
0000000000000d90 g     F .text  0000000000000022              timetestlog_exit
00000000000007d8 g     F .init  0000000000000000              _init

** - API-Einschränkungen nach Versionsskript **

Verwenden Sie "--version-script", um die öffentliche API einzuschränken. Geben Sie die Konfigurationsdatei (in diesem Fall libtimelog.map) an, die das Versionsskript und die öffentliche API auf diese Weise definiert.

LDFLAGS+=-Wl,--version-script,libtimelog.map

Geben Sie in der Einstellungsdatei die API an, die Sie global verfügbar machen möchten, und geben Sie andere (*) in local an.

libtimelog.map


{
  global:
    timetestlog_init;
    timetestlog_store_printf;
    timetestlog_exit;
  local: *;
};

Hier ist die öffentliche API der Bibliothek, die durch Angabe der obigen Einstellungsdatei erstellt wurde. Sie können sehen, dass nur die minimale API verfügbar ist.

Linux env$ nm -D .libs/libtimelog.so | grep " T "
0000000000000cb0 T timetestlog_exit
0000000000000a30 T timetestlog_init
0000000000000bb0 T timetestlog_store_printf

Linux env$ objdump -t .libs/libtimelog.so | grep " g"
0000000000000bb0 g     F .text  00000000000000fc              timetestlog_store_printf
0000000000000a30 g     F .text  000000000000017f              timetestlog_init
0000000000000cb0 g     F .text  0000000000000022              timetestlog_exit

** Zusammenfassung **

Sie können die öffentliche API mit ** --version-script ** angeben. Bis jetzt war ich besorgt über die zu veröffentlichende API und habe tatsächlich die Dateien zusammengestellt, die ich trennen wollte. Jetzt können Sie ohne zu zögern eine Bibliothek mit Ihrer bevorzugten Dateistruktur erstellen.

Recommended Posts

So beschränken Sie die API, die in der gemeinsam genutzten Linux-Bibliothek in C-Sprache veröffentlicht werden soll
Verwendung der C-Bibliothek in Python
So entfernen Sie die "Tags müssen ein Array von Hashes sein." Fehler in Qiita API
Von der Einführung der GoogleCloudPlatform Natural Language API bis zur Verwendung
Richtlinien für die Reinkarnation in der Welt der Linux-Programmierentwicklung (C / C ++ - Sprache)
[C-Sprache] Verwendung der Krypta-Funktion unter Linux [Passwort-Hashing]
So steuern Sie Multiprozesse ausschließlich in C-Sprache
[C-Sprache] Achten Sie auf die Kombination aus Puffer-API und nicht pufferndem Systemaufruf
[C-Sprache] [Linux] Ruft den Wert der Umgebungsvariablen ab
linux / c> link> Ruft das Ausführungsergebnis des Shell-Befehls im C-Programm ab.> Mir wurde beigebracht, wie man popen () verwendet.
So finden Sie die optimale Anzahl von Clustern für k-means
So debuggen Sie eine Standard-Python-Bibliothek in Visual Studio
[Linux] [C / C ++] Zusammenfassung, wie man pid, ppid, tid bekommt
Ich habe versucht, die Zeit und die Zeit der C-Sprache zu veranschaulichen
Eine Einführung in die moderne Socket-API zum Erlernen in C.
Hinweise zur Verwendung von Marshmallow in der Schemabibliothek
[Linux] [C / C ++] So ermitteln Sie den Wert der Rücksprungadresse einer Funktion und den Funktionsnamen des Aufrufers
So zeigen Sie eine bestimmte Dateispalte unter Linux an (awk)
So bestimmen Sie die Existenz eines Selenelements in Python
Einführung in die in C Language Part 1 Server Edition erlernte Socket-API
Wie Sie die interne Struktur eines Objekts in Python kennen
So ändern Sie die Farbe nur der mit Tkinter gedrückten Taste
So überprüfen Sie die Speichergröße einer Variablen in Python
Verwendung von Python Kivy (Referenz) -Ich habe die Kivy-Sprache der API-Referenz übersetzt-
So überprüfen Sie die Speichergröße eines Wörterbuchs in Python
So geben Sie das Ausgabeergebnis des Linux-Befehls man in eine Datei aus
So ermitteln Sie die Scheitelpunktkoordinaten eines Features in ArcPy
So verpacken Sie C in Python
[Anfängernotiz] So legen Sie den Lesepfad der Bibliothek in Python fest
Eine Geschichte über den Versuch, den Testprozess eines 20 Jahre alten Systems in C zu verbessern
Annäherungserklärung für Anfänger, um in Kaggle Titanic_3 unter den besten 1,5% (0,83732) zu sein
[C-Sprache] Ich möchte Zufallszahlen im angegebenen Bereich generieren
[Linux] Ein Befehl zum Abrufen einer Liste der in der Vergangenheit ausgeführten Befehle
So vergleichen Sie, ob der Inhalt der Objekte in scipy.sparse.csr_matrix identisch ist
Annäherungserklärung für Anfänger, um in Kaggle Titanic_1 unter den besten 1,5% (0,83732) zu sein
Was ist eine C-Sprachbibliothek? Welche Informationen sind für die Öffentlichkeit zugänglich?
Annäherungserklärung für Anfänger, um in Kaggle Titanic_2 unter den besten 1,5% (0,83732) zu sein
[Verständnis in 3 Minuten] Der Beginn von Linux
So überprüfen Sie die Version von Django
Implementieren Sie einen Teil des Prozesses in C ++
Verwendung von Google Test in C-Sprache
[Linux] Verwendung des Befehls echo
So bedienen Sie Linux von der Konsole aus
So übergeben Sie das Ergebnis der Ausführung eines Shell-Befehls in einer Liste in Python
So übergeben Sie den Pfad zu der mit pyenv und virtualenv mit PyCharm erstellten Bibliothek
Wie man eine Benutzergruppe mit Slack-Benachrichtigung erwähnt, wie man die ID einer Benutzergruppe überprüft
Sie werden in 100 Tagen Ingenieur - 29. Tag - Python - Grundlagen der Python-Sprache 5
So identifizieren Sie die Zugriffsquelle in der generischen Klassenansicht von Django eindeutig
Sie werden in 100 Tagen Ingenieur - 26. Tag - Python - Grundlagen der Python-Sprache 3
So zählen Sie die Anzahl der Elemente in Django und geben sie in die Vorlage aus
Ein Memorandum zur Ausführung des Befehls! Sudo magic in Jupyter Notebook
So ermitteln Sie den Koeffizienten der ungefähren Kurve, die in Python durch die Scheitelpunkte verläuft
Sie werden in 100 Tagen Ingenieur - Tag 32 - Python - Grundlagen der Python-Sprache 7
So ändern Sie das Erscheinungsbild nicht ausgewählter Fremdschlüsselfelder in Djangos Modellformular
So stellen Sie die Schriftbreite des in pyenv eingegebenen Jupyter-Notizbuchs gleich
Sie werden in 100 Tagen Ingenieur - 28. Tag - Python - Grundlagen der Python-Sprache 4