2013-03-11 10 views
11

Czasami, gdy robię nm na pliku .so (na przykład libstdC++. So.6), nie ma symboli i muszę użyć nm --dynamic. Ale dla innych plików .so, widzę symbole bez - dynamicznego.Kiedy używać --dynamiczna opcja w nm

Doc mówi:

wyświetlić dynamiczne symbole zamiast normalne symbole. Ma to znaczenie tylko w przypadku obiektów dynamicznych, takich jak niektóre typy bibliotek współużytkowanych.

Ale to jest mylące ... jakie "rodzaje" bibliotek współdzielonych potrzebują - dynamiczne? Jak to się określa? Podczas kompilacji biblioteki? Myślałem, że wszystkie udostępnione biblioteki są dynamiczne (mam na myśli, mogą być ładowane dynamicznie w czasie wykonywania), ale wydaje się, że moje zrozumienie nie jest całkiem w porządku.

Odpowiedz

11

Może się zdarzyć, że jeśli symbol nie zostanie wyeksportowany z udostępnionej biblioteki, zostanie zmieniony na normal symbol table zamiast na dynamic symbol table.

Istnieje wiele rodzajów symboli w plikach ELF.

  • Symbole część Normal Symbol table. Jest to wynik z zaledwie nm libabc.so lub objdump --syms libabc.so. Te symbole są używane tylko podczas łączenia statycznego.

  • Symbole część Dynamic Symbol table. Jest to wynik z nm --dynamic libabc.so lub objdump --dynamic-syms libabc.so. Tablica dynamicznych symboli jest używana przez łącznik/moduł ładujący w czasie wykonywania, który łączy symbole między plikiem ELF, który je odsyła, a plikiem ELF, który je definiuje. Jest również używany przez static linker, jednocześnie łącząc bibliotekę współdzieloną z aplikacją, która tego wymaga. Jest to komponent, który pomaga w wyświetlaniu wszystkich undefined symbol errors podczas łączenia.

  • Hidden symbols - są to symbole, które zostały oznaczone za pomocą _attribute_ ((visibility("hidden"))). Symbole te nie są eksportowane na zewnątrz i mogą być używane tylko w bibliotece. Widoczność jest sprawdzana podczas etapu łączenia, a zatem jest wymuszana tylko dla bibliotek współdzielonych. Domyślna widoczność to public, tj. Symbole są eksportowane, chyba że określono inaczej. Zachowanie można zmodyfikować za pomocą -fvisibility=default|internal|hidden|protected.

ustawić domyślny symbol ELF widoczność obrazu do określonych Option wszystkich symboli zostanie zaznaczone to chyba nadpisane ciągu kod. Korzystanie z tej funkcji może znacznie poprawić łączenie i czasów ładowania bibliotek obiektów współdzielonych, wygenerować bardziej zoptymalizowany kod , zapewnić prawie doskonały eksport API i zapobiec konfliktom symboli. Zaleca się używanie go w dowolnych udostępnionych obiektach, które rozpowszechniasz. Pomimo nazewnictwa, domyślnie zawsze oznacza publiczny, tj; można łączyć ze spoza obiektu udostępnionego. Zabezpieczone i wewnętrzne są praktycznie bezużyteczne w używaniu w świecie rzeczywistym, więc inna powszechnie używana opcja będzie ukryta. Wartość domyślna, jeśli nie podano wartości niewidoczności, jest domyślna, tj. Powoduje, że każdy symbol jest publiczny, co powoduje takie samo zachowanie, jak w poprzednich wersjach GCC.

Przegląd tych technik, ich zalet i sposobu korzystania z nich to pod adresem http://gcc.gnu.org/wiki/Visibility.

Aby odpowiedzieć na pytanie, kiedy należy użyć opcji nm--dynamic byłoby, gdy chcemy wymienić wszystkie symbole eksportowanych przez biblioteki dzielonej, a tylko te, które są dostępne dla obrazów którego odnosi ELF im.

+0

"Widoczność jest sprawdzana podczas etapu łączenia, a zatem jest wymuszana tylko dla bibliotek współdzielonych." Jaka jest w tym logika? Chyba miałeś zamiar powiedzieć "krok dynamicznego łączenia" w prawo? –

+0

@ Hot.PxL - Jedna biblioteka współużytkowana może odnosić się do symboli wyeksportowanych z innych bibliotek współdzielonych (co jest dość powszechne). Chodziło mi o to, że widoczność symboli ma sens tylko dla bibliotek współdzielonych, a nie dla bibliotek statycznych. IIUC, ta kontrola jest wykonywana zarówno przez linker statyczny, jak i dynamiczny linker. Ale nie mogłem znaleźć odpowiedniego źródła, aby to potwierdzić. Udostępnij, jeśli znajdziesz. – Tuxdude

Powiązane problemy