2012-01-09 14 views
5

İşte sorun:GCC'de, tüm sembolleri vermeden paylaşılan bir kitaplık için tüm typeinfo sembollerini nasıl dışa aktarabilirim?

Sembolleri varsayılan olarak gizleyen bir paylaşılan kitaplığım var. Aslında, belirli bir dosyadaki bazı simgeleri dışa aktarmak, ancak kalanları gizlemek için -Xlinker --version-script = seçeneğini kullanır. Sorun şu ki, diğer paylaşılan kitaplıklarda tanımlanmış istisnaları yakalamaya çalışırsak, türbin bu paylaşılan kitaplık tarafından gizlendiği için sorunla karşılaşırız. Özel durum sınıflarını açıkça göremiyorum çünkü bunlar, denetimimin dışında bir açık kaynak kitaplığında tanımlanmışlardır. Ayrıca, bu kitaplık üzerinde çalışan birçok geliştiricinin var olduğu için sürüm komut dosyası simge dosyasında istisna sınıflarının typeinfo'larının mandallı adlarını açık bir şekilde listelemek istemiyorum ve bu programda bazı istisna sınıfları için bunu yapmayı unutmayacağım. geleceği.

Açık kaynak .hpp dosyalarından önce #pragma KİK görünürlük push (varsayılan) düğmesini kullanmayı denedim, ancak işe yaramadı - semboller görünmüyordu.

Ayrıca, typeinfo sembollerini dışa aktaran ve aynı zamanda ihraç edilmesini istemediğim tonlarca başka sembol ihraç eden -fvisibility-ms-compat kullanmayı da denedim. Kütüphanede hem C hem de C++ kodu var, bu yüzden sadece C++ için bu seçenekle nasıl çalışılacağını bilmiyorum.

Gerçekten ihtiyacım olan şey, tüm tipinfo sembollerini görünür kılacak, diğer sembolleri gizli bırakan (açıkça görülemedikçe) bir seçenektir. Böyle bir seçenek var mı?

+0

Belki de dinamik olarak bir "linker" betiği çıktılar. nm' ya da bunun gibi bir şey? Sadece bir tahmin. –

+0

Bu, gitmek için iyi bir yol olabilir. Bunu düşündüm ve ekstra komut dosyası çalışmalarını beğenmeme rağmen en iyi cevap bu olabilirdi. Önerin için teşekkürler! –

cevap

2

Sorunuza en doğrudan yanıt, ld seçeneği --dynamic-list-cpp-typeinfo'u denemektir. Bu seçenekle en iyi şansa sahip değildim, ama YMMV.

Hangi platform üzerinde çalıştığınızı söylemezsiniz. Görünüşe göre, -fvisibility-ms-compat denediğinden beri mingw kullanıyorsun; ama aslında Linux gibi bir ELF hedefinde olduğunuzu düşünerek, sembol betiklerinden _ZTI* ve _ZTN* sembol betiklerini dışa aktarmayı deneyin. (Muhtemelen Windows'da benzer bir şey yapabilirsiniz, ancak Visual C++ adlandırma gerçekten belgelenmediği sürece, kullanabileceğiniz herhangi bir konserve joker karakterinin farkında değilim.)

İlgili konular