2012-07-04 10 views

Odpowiedz

1

Oznacza to, że widoczność symbolu jest ukryta: https://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/CppRuntimeEnv/Articles/SymbolVisibility.html

Powody zmiany widoczności symboli należą:

  • Mniejsze ryzyko kolizji symboli.
  • Mniejsze pliki binarne.
  • Skrócony czas rozruchu, ponieważ dynamiczny linker nie musi przetwarzać tylu symboli.
  • Szanse dla bardziej efektywnego kodu, ponieważ kompilator wie, że symbol nie może być zmieniona poprzez system LD_PRELOAD typu.
  • Zapobieganie nawiązywaniu połączeń oprogramowania innej firmy z nieudokumentowanymi interfejsami API.

Aby uzyskać więcej informacji, zobacz http://www.gnu.org/software/gnulib/manual/html_node/Exported-Symbols-of-Shared-Libraries.html.

+0

używam bibliotek statycznie odwołuje mój plik wykonywalny. Problem polega na tym, że mam powyższy symbol zdefiniowany w dwóch różnych bibliotekach, zarówno ukrytych. Łączenie kończy się niepowodzeniem z powodu powtarzających się symboli. Kiedy dobrze cię zrozumiem, to nie powinno się zdarzyć, prawda? – MBober

+3

@MBober: Nie, poprawne jest, aby linker wygenerował błąd w tym scenariuszu. Należy pamiętać, że biblioteka statyczna jest w zasadzie archiwum plików obiektowych, które wszystkie stają się danymi wejściowymi do łącznika, gdy biblioteka statyczna jest połączona. Widoczność symbolu wpływa na wynik łącznika (biblioteki wykonywalnej lub dynamicznej), ale nadal będzie mieć linker występuje, gdy dwa lub więcej plików obiektów definiuje ten sam symbol. –

1

Link, który wyjaśnia visibility support (GCC)

z linku:

  • To bardzo znacząco poprawia czas ładowania swojego DSO (Dynamic Shared Object). Na przykład ogromna biblioteka oparta na szablonach C++, która została przetestowana (biblioteka powiązań TnFOX Boost.Python) ładuje się teraz w ciągu ośmiu sekund zamiast przez ponad sześć minut!

  • Pozwala to optymizatorowi produkować lepszy kod. Pośrednie podprogramy PLT (gdy trzeba wywołać wywołanie funkcji lub dostęp zmienny za pomocą globalnej tabeli przesunięć, np. W kodzie PIC) można całkowicie uniknąć, w ten sposób znacznie unikając przeciągnięcia rurociągu na nowoczesnych procesorach, a tym samym znacznie szybciej kodu. Ponadto, gdy większość symboli jest związana lokalnie, można je bezpiecznie usunąć (usunąć) całkowicie przez cały OSD. Daje to większą swobodę szczególnie inlinerowi, który nie musi już utrzymywać punktu wejścia wokół "na wszelki wypadek".

  • Zmniejsza rozmiar Twojego OSD o 5-20%. Format eksportowanych tablic symboli ELF jest dość przestrzenny, co daje pełną zniekształconą nazwę symbolu, która przy dużym obciążeniu szablonu może wynosić średnio około 1000 bajtów. Szablony C++ wypluwają ogromną ilość symboli, a typowa biblioteka C++ może łatwo przekroczyć 30 000 symboli, które wynoszą około 5-6Mb! Dlatego jeśli wyciśniesz 60-80% niepotrzebnych symboli, Twoje OSD może być mniejsze o megabajty!

  • Znacznie mniejsza szansa na kolizję symboli. Stare biada dwóch bibliotek wewnętrznie używających tego samego symbolu dla różnych rzeczy jest już za nami z tą łatką. Alleluja!

Chociaż biblioteka cytowany powyżej jest skrajny przypadek, nowe wsparcie widzialność zmniejszona eksportowany tablicę symboli z> 200000 symboli do mniej niż 18.000. Około 21Mb zostało również znokautowane!

usage sample and also potential pitfall przy użyciu atrybutu visibilty