Schwache Symbol-Aliasnamen unter OS X, ähnlich denen unter Linux, oder ein ähnliches Äquivalent?

Lesezeit: 3 Minuten

Was ich mache

Wenn ich gemeinsam genutzte Bibliotheken für Linux schreibe, achte ich eher auf Verschiebungen, Symbolsichtbarkeit, GOT/PLT usw.

Gegebenenfalls versuche ich zu vermeiden, PLT-Stubs aufzurufen, wenn Funktionen aus derselben Bibliothek sich gegenseitig aufrufen. Nehmen wir zum Beispiel an, ein gemeinsam genutztes Objekt stellt zwei öffentliche Funktionen bereit – foo() und bar() (Jedes davon kann vom Benutzer aufgerufen werden). Das bar() Funktion ruft aber auch auf foo(). Was ich in diesem Fall also mache, ist Folgendes:

  1. Definieren _foo() und _bar() Funktionen mit privater Sichtbarkeit.
  2. Definieren foo() und bar() schwache Aliase für _foo() und _bar() beziehungsweise.

Auf diese Weise verwendet der Code in Shared Object niemals schwache Symbole. Es ruft nur lokale Funktionen direkt auf. Wann zum Beispiel _bar() aufgerufen wird, ruft es _foo() direkt.

Aber die Benutzer sind sich dessen nicht bewusst _* Funktionen und verwenden Sie immer entsprechende schwache Aliase.

Wie ich es mache

Unter Linux wird dies durch die Verwendung des folgenden Konstrukts erreicht:

extern __typeof (_NAME) NAME __attribute__(weak, alias("_NAME"));

Das Problem

Leider funktioniert dies nicht für OS X. Ich habe keine tiefen Kenntnisse von OS X oder seinen Binärformaten, also habe ich ein bisschen herumgestöbert und ein paar Beispiele für schwache Funktionen gefunden (wie diese), aber diese funktionieren nicht ganz genauso wie Sie ein schwaches Symbol haben können, aber kein schwaches Symbol, das ein Alias ​​für die lokale Funktion von DSO ist.

Mögliche Lösung…

Im Moment habe ich diese Funktion (die mithilfe von Makros implementiert wird) nur deaktiviert, sodass alle Symbole global sind und standardmäßig sichtbar sind. Der einzige Weg, den ich mir vorstellen kann, um dasselbe zu erreichen, ist, alle zu haben _foo Funktionen mit privater Sichtbarkeit und haben entsprechende foo Funktionen mit standardmäßiger Sichtbarkeit und Aufrufen ihrer “versteckten” Gegenstücke.

Ein besserer Weg?

Dafür muss jedoch ein großer Teil des Codes geändert werden. Daher würde ich es vorziehen, nicht dorthin zu gehen, es sei denn, es geht wirklich nicht anders.

Was ist also die naheste OS X-Alternative oder der einfachste Weg, um die gleiche Semantik/das gleiche Verhalten zu erhalten?

  • Ist es Ihr Ziel, einfach den Overhead des Aufrufs über PLT-Stubs zu vermeiden, wenn Sie ein Symbol innerhalb derselben Bibliothek aufrufen? Haben Sie bestätigt, dass der Linker dies nicht bereits für Sie erledigt?

    – bdsch

    20. September 2013 um 9:54 Uhr

  • Meines Wissens nach ist das, was Sie suchen, das Standardverhalten für gemeinsam genutzte Bibliotheken unter OS X. Die einzige Dokumentation, die ich gefunden habe, die dies annähernd explizit macht, ist die ld Manpage-Abschnitt über die -interposable_list Streit. Es besagt, dass Aufrufe von Symbolen innerhalb eines Moduls direkte Aufrufe sind, es sei denn, dieses Symbol ist als interponierbar markiert, in diesem Fall würde es über einen Dyld-Stub erfolgen.

    – bdsch

    20. September 2013 um 18:32 Uhr

  • Das solltest du lesen: glandium.org/blog/?p=2764

    – aet

    6. März 2014 um 2:42 Uhr

  • Klingt für mich nach verfrühter Optimierung.

    – jcoffland

    17. April 2014 um 23:19 Uhr

  • @NigelNquande Nein, diese Seite ist nicht für die Programmierung auf Codeebene gedacht, es sei denn, es handelt sich um Automator, Applescript usw. Meistens nur Hilfe bei der Mac-Nutzung. Quelle: Ihre 2-Minuten-Tour sagt dies.

    – sudo

    27. Mai 2014 um 3:41 Uhr

Benutzeravatar von Rob_vH
Rob_vH

Unter OS X sind Aufrufe innerhalb der Bibliothek automatisch direkte Aufrufe und gehen nicht über den dyld-Stub. Der Beweis dafür ist, dass Sie, wenn Sie in der Lage sein möchten, alternative Funktionen zum Bedienen eines Anrufs einzufügen, interposable verwenden müssen, um den indirekten Zugriff auf die Symbole zu erzwingen und die Ausführung des Anrufs durch die Dyld-Stubs zu erzwingen. Andernfalls sind Ortsgespräche standardmäßig direkt und verursachen keinen Overhead für das Durchlaufen von dyld.

Somit ist Ihre Optimierung unter Linux bereits das Standardverhalten und der Alias ​​wird nicht benötigt.

Wenn Sie dies jedoch nur tun möchten, um Ihren plattformkompatiblen Code zu vereinfachen, können Sie immer noch die Aliase erstellen. Sie müssen nur “weak_import” oder “weak” (wenn Sie koaleszieren möchten) als Attributnamen verwenden.

extern typeof (_NAME) NAME __Attribut(weak_import, alias(“_NAME”));

Apple-Referenz zu schwacher Verlinkung: Markierungssymbole für schwache Verknüpfungen

Apple-Referenz zur Mach-O-Laufzeitbindung: Umfang und Behandlung von Symboldefinitionen

1413810cookie-checkSchwache Symbol-Aliasnamen unter OS X, ähnlich denen unter Linux, oder ein ähnliches Äquivalent?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy