Jaka jest różnica między poleceniem" gcc-s "a poleceniem" strip"?

Zastanawiam się jaka jest różnica między tymi dwoma:

  • gcc -s: Usuń wszystkie informacje o tabeli symboli i relokacji z pliku wykonywalnego.

  • strip: Odrzuć symbole z plików obiektowych.

Czy mają to samo znaczenie?

Którego z nich używasz:

  • zmniejszyć rozmiar pliku wykonywalnego?
  • Przyspieszyć jego działanie?
Author: Dan Hook, 2009-08-29

4 answers

gcc jako kompilator / linker, jego opcja -s jest wykonywana podczas kompilacji i linkowania . Nie jest również konfigurowalny - ma zestaw informacji, które usuwa, nie więcej nie mniej.

strip jest czymś, co można uruchomić na pliku obiektowym, który jest już skompilowany. Posiada również wiele opcji wiersza poleceń, których możesz użyć do skonfigurowania, które informacje zostaną usunięte. Na przykład -g usuwa tylko informacje o debugowaniu, które dodaje gcc -g.

Uwaga to strip nie jest poleceniem bash, chociaż możesz uruchamiać je z powłoki bash. Jest to polecenie całkowicie niezależne od Basha, część pakietu GNU binary utilities suite.

 48
Author: Cascabel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-28 20:42:09

Przyjęta odpowiedź jest bardzo dobra, ale tylko w celu uzupełnienia dalszych pytań(a także jako punkt odniesienia dla każdego, kto tu się kończy).

Jaki jest odpowiednik GCC-s pod względem paska z niektórymi opcjami?

Obie robią to samo, całkowicie usuwając tabelę symboli. Jednak, jak zauważył @JimLewis pasek pozwala na lepszą kontrolę. Na przykład, w obiekcie relokowalnym, strip --strip-unneeded nie usunie swoich symboli globalnych. Jednak strip lub strip --strip-all usuną pełna tabela symboli.

Którego z nich używasz, aby zmniejszyć rozmiar pliku wykonywalnego i przyspieszyć jego działanie

Tabela symboli jest nierozdzielalną sekcją binarną. Oznacza to, że nigdy nie zostanie załadowany do pamięci RAM. Przechowuje informacje, które mogą być przydatne do debugowania rzekomych, na przykład, aby wydrukować stacktrace w przypadku awarii. Przypadek, w którym usunięcie tabeli symboli miałoby sens, byłby scenariuszem, w którym masz poważne ograniczenia pojemności pamięci masowej (w tym zakresie, gcc -Os -s lub make CXXFLAGS="-Os -s" ... jest użyteczne, ponieważ spowoduje to mniejsze wolniejsze binarne, które są również usuwane w celu dalszego zmniejszenia rozmiaru). Nie sądzę, aby usunięcie tabeli symboli skutkowało wzrostem prędkości z powodów komentowanych.

Na koniec polecam ten link o usuwaniu obiektów współdzielonych: http://www.technovelty.org/linux/stripping-shared-libraries.html

 35
Author: Diego Pino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-20 15:27:14

"gcc -s" usuwa Informacje o relokacji wraz z tabelą symboli, która nie jest wykonywana przez "strip". Należy pamiętać, że usunięcie informacji o relokacji miałoby pewien wpływ na randomizacja układu przestrzeni adresowej. Zobacz ten link.

 10
Author: Khaled,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:04

Robią podobne rzeczy, ale strip pozwala na drobniejszą kontrolę nad tym, co zostaje usunięte z akta.

 5
Author: Jim Lewis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-28 20:41:49