Frage

Einige Plattformen Mandat, dass Sie eine Liste der in einer gemeinsam genutzten Bibliothek externer Symbole an den Linker bereitzustellen. Doch am meisten unixish Systeme, die nicht notwendig ist. Alle nicht-statischen Symbole werden standardmäßig verfügbar sein

Mein Verständnis ist, dass die GNU Toolchain optional Sichtbarkeit nur Symbole explizit deklariert beschränken können. Wie kann das GNU ld erreicht werden mit?

War es hilfreich?

Lösung

GNU ld kann das tun auf ELF-Plattformen.

Hier ist, wie es mit einer Linker Version Skript zu tun:

/* foo.c */
int foo() { return 42; }
int bar() { return foo() + 1; }
int baz() { return bar() - 1; }

gcc -fPIC -shared -o libfoo.so foo.c && nm -D libfoo.so | grep ' T '

Standardmäßig werden alle Symbole exportiert:

0000000000000718 T _fini
00000000000005b8 T _init
00000000000006b7 T bar
00000000000006c9 T baz
00000000000006ac T foo

Angenommen, Sie haben nur bar() und baz() exportieren möchten. Erstellen Sie eine "Version Skript" libfoo.version:

FOO {
  global: bar; baz; # explicitly list symbols to be exported
  local: *;         # hide everything else
};

Direkt an den Linker:

gcc -fPIC -shared -o libfoo.so foo.c -Wl,--version-script=libfoo.version

Beachten Sie exportierten Symbole:

nm -D libfoo.so | grep ' T '
00000000000005f7 T bar
0000000000000609 T baz

Andere Tipps

Ich denke, der einfachste Weg, dies zu tun, die -fvisibility=hidden zu gcc-Optionen erweitert und explizit Sichtbarkeit einiger Symbole machen Öffentlichkeit im Code (von __attribute__((visibility("default")))). Lesen Sie die Dokumentation hier .

Es kann ein Weg sein, dass Skripte von ld Linker zu erreichen, aber ich weiß nicht viel über sie.

Der Code erzeugt keine exportierten Funktionen aufrufen oder exportierte Globals zu verwenden ist weniger effizient als diejenigen, die nicht exportiert werden. Es gibt eine extra Dereferenzierungsebene beteiligt. Dies gilt für jede Funktion, die kann exportiert in Compile Zeit. gcc noch zusätzliche Indirektion für eine Funktion erzeugen, die später durch eine Linker Skript un-exportiert wird. So mit der Sichtbarkeit Attribute besseren Code als die Linker-Skript erzeugen.

Wenn Sie mit libtool, gibt es eine weitere Option, ähnlich wie Angestellt russische Antwort.

sein Beispiel verwenden, wäre es so etwas wie:

cat export.sym
bar
baz

Führen Sie dann libtool mit der folgenden Option:

libtool -export-symbols export.sym ...

Beachten Sie, dass bei der Verwendung von -export-Symbolen alle Symbole standardmäßig nicht exportiert werden, und nur diejenigen, die in export.sym exportieren. (So die „local: *“ Zeile in libfoo.version in diesem Ansatz tatsächlich implizit)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top