Sembol tablosu nedir?


87

Birisi C ve C ++ bağlamında bir sembol tablosunun ne olduğunu açıklayabilir mi?

Yanıtlar:


81

Burada sembol tablolarının ortak ve ilişkili iki anlamı vardır.

İlk olarak, nesne dosyalarınızda sembol tablosu var. Genellikle, bir C veya C ++ derleyicisi, tek bir kaynak dosyasını .obj veya .o uzantılı bir nesne dosyasına derler. Bu, bağlayıcının çalışan bir uygulamaya veya paylaşılan kitaplığa işleyebileceği yürütülebilir kod ve veri koleksiyonunu içerir. Nesne dosyası, nesne dosyasındaki farklı öğeleri bağlayıcının anlayabileceği adlarla eşleştiren, içinde sembol tablosu olarak adlandırılan bir veri yapısına sahiptir. Kodunuzdan bir işlevi çağırırsanız, derleyici yordamın son adresini nesne dosyasına koymaz. Bunun yerine, koda bir yer tutucu değeri koyar ve bağlayıcıya işlediği tüm nesne dosyalarından çeşitli sembol tablolarındaki referansı aramasını ve son konumu oraya yapıştırmasını söyleyen bir not ekler.

İkinci olarak, paylaşılan bir kitaplıkta veya DLL'de sembol tablosu da vardır. Bu, bağlayıcı tarafından üretilir ve kitaplığın kullanıcıları tarafından görülebilen tüm işlevleri ve veri öğelerini adlandırmaya yarar. Bu, sistemin, bu adlara yönelik açık referansları kitaplığın belleğe yüklendiği konuma çözümleyerek çalışma zamanı bağlama yapmasına olanak tanır.

Daha fazlasını öğrenmek istiyorsanız, John Levine'in mükemmel kitabı "Linkers and Loaders" ı öneririm. bağlantı metni


Merhaba Ben, ikinci durumda, ihracat tablosuna mı başvuruyorsunuz? Yani, dışa aktarma tablosu, sembol tablosunun özel bir durumu mudur? Yoksa bunlar ilgisiz kavramlar mı?
Pooven

Selam. Herhangi bir nesne dosyasında bulunmadığına ancak onlardan kaynaklandığına inanıyorum. İkinci olarak, "son konum" derken neyi kastettiğinizi biraz daha açıklar mısınız? Kaynak kodda fiziksel adres veya kesinleşmiş göreli adres.
stdout

26

Kısaca, tür, kapsam ve boyut gibi meta veriler dahil olmak üzere bir değişkeni bellekteki adresine atadığınız adın eşleştirilmesidir. Derleyici tarafından kullanılır.

Bu genel olarak, sadece C [++] * değil. Teknik olarak, her zaman doğrudan bellek adresini içermez. Derleyicinin hangi dili, platformu vb. Hedeflediğine bağlıdır.


Adresin içeriğinden "her zaman doğrudan bellek adresi içermiyor" diyerek bahsetmeniz çok önemli olduğunu düşünüyorum.
stdout

13

Linux'ta şu komutu kullanabilirsiniz:

nm [nesne dosyası]

o nesne dosyasının sembol tablosunu listelemek için. Bu çıktıdan, daha sonra kullanımda olan bağlayıcı sembollerini karıştırılmış adlarından deşifre edebilirsiniz .


8

Sembol tablosu, bir program / birimdeki "semboller" listesidir. Semboller genellikle değişkenlerin veya işlevlerin isimleridir. Sembol tablosu, değişkenlerin veya fonksiyonların bellekte nerede konumlanacağını belirlemek için kullanılabilir.



0

Sembol tablosu, değişken isimleri, fonksiyon isimleri, nesneler, sınıflar, arayüzler vb. Gibi çeşitli varlıkların oluşumu hakkında bilgi depolamak için derleyiciler tarafından oluşturulan ve sürdürülen önemli bir veri yapısıdır.


Bağlayıcılar ve birleştiriciler aynı zamanda sembol tablolarıyla da ilgilenir (genellikle derleyiciden daha basittir).
Basile Starynkevitch
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.