2015-01-18 21 views
8

Çok sayıda işlev içeren büyük bir .a arşivine bağlanan bir yürütülebilir program var. Yürütülebilir dosya sadece bu arşivdeki işlevlerin küçük bir kısmını kullanır, ancak bazı nedenlerden dolayı her şeyi çeker ve çok büyük olur.
Şüphelem, yürütülebilir programın bir şekilde kullandığı bazı işlevlerin, olmaması gereken bir şeyden kaynaklandığını ve bunun her şeyin çekilmesine neden olduğunu gösteriyor.
gcc'nin hangi referansın belirli bir sembolün yürütülebilir dosyaya eklenmesine neden olduğunu söylemesi mümkün mü? Bu başka neden olabilir?GCC: bir nesne dosyasının neden atılmadığını nasıl bulabilirim

Hiçbir etkisi olmadan --gc-sections kullanmayı denedim.
Ben nesne dosyaları Ben atmak değil işlevlerini isterken öyle beri -ffunction-sections ve -fdata-sections ilgilenmiyorum hiçbir etkisi
ile yürütülebilir yerel tüm semboller yapmak --version-script kullanarak denedim.
Diğer cevaplar söz -why_live ama bu sadece darwin için uygulanacak görünüyor ve bunu bir bağlantı iz yazdırmaya neden linker için -M geçmek linux x86_64

+2

Kullandığınız işlevlerin kütüphanede başka bir şey kullanmadığını biliyor musunuz? Bildiğiniz gibi zincirlenebilir, başka bir dört fonksiyon kullanan başka bir fonksiyon kullanırsınız. –

+0

Linker'ın komut satırında listelediğiniz nesne dosyalarına 'nm -g 'uygulayıp ne yaptığını simüle edebilirsiniz. Nesne dosyaları, endişe duyduğunuz arşiv kitaplığından çıkarılır ve neyin nereden geldiğini görür. Acı verici olacak, ama yapılabilirdi. Tanımlanmış ve tanımlanmamış global referansları bilmeniz gerekir. C++ kodu varsa, biraz fazla bir şey olabilir (isimler uzun olacaktır, ancak dize eşleştirme hala ana gereksinimdir). –

cevap

4

Kullanım -Wl,-M içindeyim. Bu, bir arşivden bağlanan her nesne dosyası için nedenleri (veya en azından ilk bulunan nedeni) gösterecektir.

+0

Bu, kötü çapraz referansı bulmama yardımcı olmak için çalıştı. Teşekkürler! – shoosh

İlgili konular