2008-09-16 20 views
5

Linux/Gcc/LD - Toolchain.Usuń C++ - STL/Zwiększ symbole debugowania (... lub nie twórz ich)

Chciałbym usunąć symbole STL/doładowania debugowania z bibliotek i plik wykonywalny, z dwóch powodów:

  1. Linking staje się bardzo powolny dla dużych programów
  2. Debugowanie skacze do stl/kod doładowania, co jest denerwujące

Dla 1. połączenia przyrostowego byłaby duża poprawa, ale AFAIK ld nie obsługuje łączenia przyrostowego. W dzienniku dr.dobb z 1999 r. Istnieje obejście "pseudo-przyrostowego powiązania" (nie w sieci, ale w wersji archive.org (chodzi o to, aby umieścić wszystko w bibliotece dynamicznej, a wszystkie zaktualizowane pliki obiektów w drugiej, która jest ładowana po pierwsze), ale to nie jest ogólne rozwiązanie:

Dla 2. istnieje skrypt here, ale a) nie działał on dla mnie (nie usuwał symboli), b) jest bardzo wolny, ponieważ działa na końcu rury, podczas gdy skuteczniejsze byłoby wcześniejsze usunięcie symboli.

Oczywiście inne symbole debugowania powinny pozostać na swoim miejscu.

Odpowiedz

-1

Z którego kompilatora korzystasz? Na przykład, jeśli dobrze rozumiem twoje pytanie, jest to kwestia trywialna w MS Visual Studio.

+0

powiedzieć mu, jak to zrobić. – gbjbaanb

+0

Może to być trywialne, ale jest dużo pisania ... Okazuje się, że nie jest w VS. – hatcat

1

Prawdopodobnie nie chcesz usunąć symboli debugowania z bibliotek współdzielonych, ponieważ może to być potrzebne w pewnym momencie.

Jeśli używasz GDB lub DDD do debugowania, możesz być w stanie uciec z usuwaniem plików źródłowych Boost ze ścieżki źródłowej, aby nie można było śledzić funkcji. (Lub po prostu nie wnikaj w nie, prześledź!)

Możesz usunąć opcję kompilacji programu za pomocą symboli debugowania, co przyspieszy czas połączenia.

Podobnie jak w scenariuszu, do którego linkujesz, możesz sprawdzić program paska ("pasek roboczy"), aby usunąć wszystkie lub niektóre symbole.

1

Możesz użyć paska. strip --strip-unneeded --strip-debug libfoo.so

Dlaczego jednak po prostu nie tworzysz debugowania?

2

O ile mi wiadomo, nie ma prawdziwej opcji robienia tego, co chcesz w gcc. Głównym problemem jest to, że cały kod, który chcesz usunąć symbole debugowania jest zdefiniowany w nagłówkach.

Poza tym możliwe byłoby zbudowanie biblioteki w oddzielny sposób, usunięcie jej i połączenie z wersją pozbawioną obrazu.

Ale tylko pobieranie symboli debugowania z niektórych części jednostki kompilacji, podczas budowania i łączenia (dla pożądanego przyspieszenia czasu łącza) nie jest możliwe w gcc, o ile wiem.

3

Pasek GNU przyjmuje argumenty regex do --strip-symbols = Symbole STL i boost są zniekształcone przez nazwę z powodu przestrzeni nazw, w których się znajdują.W tej chwili nie mam binutils GCC, ale wystarczy rzucić okiem na nazwę "mangring" używaną dla przestrzeni nazw i skonstruować wyrażenie "symbole z przestrzeni nazw X" i przekazać je do --strip-symbols =

+0

To niewiele pomaga. Nie wszystkie funkcje generowane z szablonów otrzymują własne symbole. Wypróbuj to za pomocą prostego programu, który używa std :: vector. –

+0

@ n.m .: Biorąc pod uwagę, że pytanie dotyczy symboli _removing_, przypuszczam, że nie ma powodu, aby rozważać funkcje, które nie stały się symbolami na początek! – MSalters

+0

Przepraszam, mam na myśli tylko drugą część pytania o debugowanie. Napisanie symboli nie przeszkodzi gdb w wejściu do funkcji, które nie mają symboli! –

1

Ta odpowiedź dostarcza pewne szczegóły, które musiałem wykonać, aby odpowiedź MSaltersów działała na usuwanie symboli STL.

Nazwy symboli STL są zniekształcone. Sztuką jest znalezienie wyrażenia regularnego, które obejmuje te nazwy. Spojrzałem tych symboli z GNU Binutils:

> nm --debug-syms <objectfile> 

I w zasadzie szukało funkcji STL, jak resize. Jeśli jest to trudne, wyjście staje się czytelny, gdy za pomocą następującego polecenia:

> nm --debug-syms --demangle <objectfile> 

Spójrz numer wiersza zawierającego wywołanie funkcji STL, a następnie spójrz w górę to zniekształcone nazwisko na tej samej linii numer używając pierwszym warunkiem polecenia. To pozwoliło mi zobaczyć, że wszystkie nazwy STL symbol zaczęło się _ZNSt [0-9] + lub _ZSt [0-9] + itp

Aby umożliwić GNU Strip aby usunąć te symbole użyłem:

> strip --wildcard    \ 
    --strip-symbol='_ZNKSt*' \ 
    --strip-symbol='_ZNSt*'  \ 
    --strip-symbol='_ZSt*'  \ 
    --strip-symbol='_ZNSa*'  \ 
    <objectfile> 

Użyłem tych poleceń bezpośrednio na skompilowanym/połączonym pliku binarnym. Zweryfikowałem usunięcie tych symboli przez porównanie wyjścia nm przed i po usunięciu (zapisałem dane wyjściowe do plików i użyłem vimdiff). Opcja --wildcard pozwala na użycie wyrażeń regularnych. Chociaż oczekiwałbym, że [0-9] * oznacza 0 do nieskończonej ilości liczb, tutaj faktycznie oznacza to 1 liczbę, po której następuje nieskończona ilość niczego (do końca linii).

Jeśli szukasz nie wkraczać do kodu STL ten może być osiągnięty przez skip file komendzie GDB, tak jak zrobił here.

Mam nadzieję, że pomoże

Powiązane problemy