2015-01-18 38 views
8

Mam plik wykonywalny, który łączy się z dużym archiwum .a zawierającym wiele funkcji. Plik wykonywalny wykorzystuje tylko niewielką część funkcji w tym archiwum, ale z jakiegoś powodu wyciąga z niego wszystko i kończy jako bardzo duży.
Podejrzewam, że niektóre funkcje, z których korzysta plik wykonywalny, odwołują się do czegoś, co nie powinno, i powoduje, że wszystko inne jest ciągnięte.
Czy jest możliwe, aby gcc mi powiedzieć, co odwołanie powoduje dodanie konkretnego symbolu w pliku wykonywalnym? Dlaczego jeszcze to się stało?GCC: jak znaleźć powód, dla którego plik obiektu nie jest odrzucany

Próbowałem już używać --gc-sections bez efektu.
Próbowałem za pomocą --version-script aby wszystkie symbole w pliku wykonywalnego lokalny bez efektu
nie jestem zainteresowany -ffunction-sections i -fdata-sections ponieważ jest natomiast pliki obiektowe chcę wyrzucić, a nie funkcje.
Inne odpowiedzi wspomnieć -why_live ale wydają się być realizowane tylko przez Darwina i jestem w Linux x86_64

+2

Czy wiesz, że używane funkcje nie używają niczego innego w bibliotece? Może być przykuty, wiesz, używasz jednej funkcji, która wykorzystuje dwie inne funkcje, która używa kolejnych czterech itd. –

+0

Możesz symulować to, co linker robi, stosując 'nm -g' do plików obiektów wymienionych w linii poleceń, a następnie do pliki obiektowe wyodrębnione z biblioteki archiwum, o które się martwisz i zobacz, skąd pochodzi. To będzie bolesne, ale można to zrobić. Musisz znać zdefiniowane i niezdefiniowane odniesienia globalne. Jeśli istnieje kod w C++, może to być trochę bzdurne (nazwy będą długie, ale dopasowywanie ciągów jest nadal głównym wymaganiem). –

Odpowiedz

4

Korzystanie -Wl,-M przekazać -M z łącznikiem, powodując jej wydrukować ślad łącza. Spowoduje to wyświetlenie powodów (lub przynajmniej pierwszego znalezionego powodu) dla każdego pliku obiektów, który zostanie połączony z archiwum.

+0

Pomogło mi to znaleźć złe referencje. Dzięki! – shoosh