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
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. –
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). –