Jak włączyć tylko używane symbole, gdy statycznie łączy się z gcc?

Wdrażam mały program skompilowany z gcc, 4.3.2-1.1 (Debian). Ten program zostanie wdrożony na szablonach maszyn wirtualnych, od Debain 5 do bleeding edge Fedora, Ubuntu, Slackware, Arch i innych.

Program zależy od niektórych symboli z bibliotek Xena, które są dostępne tylko w niestabilnym drzewie. Dlatego zainstalowanie bibliotek Xena za pośrednictwem odpowiednich menedżerów pakietów na szablonach maszyn wirtualnych nie rozwiązałoby mojego bezpośredniego problem.

Dopóki nie spakuję własnej wersji tych bibliotek, muszę statycznie połączyć plik wykonywalny.

Czy gcc 4.3 - x domyślnie zawiera tylko symbole, które są faktycznie używane podczas statycznego linkowania, czy jest inna flaga optymalizacji, którą powinienem przekazać linkerowi? Wiem, że statyczne linkowanie jest złe, robię to tylko jako tymczasowa Praca.

Author: Tim Post, 2011-03-15

1 answers

Ten problem jest związany nie tylko z gcc, ale także z ld(1).

Domyślnie gcc nie eliminuje martwego kodu, możesz to sprawdzić kompilując / łącząc plik wykonywalny, a następnie uruchamiając

objdump -d a.out

Który pokazuje wszystkie funkcje w Twoim pliku wykonywalnym.

Proste "googlowanie" daj ten link.

Aby usunąć nieużywane funkcje, musisz:
  • Skompiluj z "- fdata-sections", aby zachować dane w oddzielnych sekcjach danych i "- ffunction-sections " do przechowuj funkcje w oddzielnych sekcjach, dzięki czemu (Dane i funkcje) mogą być odrzucone, jeśli nie są używane.
  • Link z "--gc-sections " do usunięcia nieużywanych sekcji.
 19
Author: S.J.,
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
2015-09-13 18:46:28