2012-03-13 38 views
11

Okuma this article on PLT (Process Linkage Table) and GOT (Global Offset Table). PLT'nin amacı bana açık olsa da, hala GOT konusunda kafam karışık. Makaleden anladığım şey, GOT'un yalnızca paylaşılan bir kitaplıkta extern olarak bildirilen değişkenler için gerekli olmasıdır. Paylaşılan bir kütüphane kodunda static olarak bildirilen global değişkenler için gerekli değildir.Proses Bağlantı Tablosu ve Global Ofset Tablosu

Anlayışım doğru mu, yoksa noktayı tamamen özlüyorum.

cevap

16

Belki de sizin karmaşanızın anlamı extern. Varsayılan bağlantı extern olduğundan, static anahtar sözcüğü dışında işlev kapsamı dışında bildirilen herhangi bir değişken extern'dur.

GOT'un gerekmesinin nedeni, paylaşılan kitaplık oluşturulduğu sırada paylaşılan kitaplık kodu tarafından erişilen değişkenlerin adresinin bilinmemesidir. Bu, kütüphanenin yükleneceği yük adresine (tanım kitaplığın kendisinde ise) veya değişkenin tanımlandığı üçüncü taraf koduna (tanım başka bir yerde ise) bağlıdır. Bu nedenle, adresi kodda satır içi tutmak yerine, derleyici, paylaşılan kitaplığın GOT'unu okumak için kod oluşturur ve sonra adresi çalışma zamanında GOT'tan yükler.

değişken aynı paylaşılan kütüphane içinde tanımlanacak bilinen (bu static var ya da hidden veya protected görüş kullanılan öznitelik, çünkü her iki) daha sonra kütüphane kod adres göre sabitlenebilir ise Paylaşılan kitaplık dosyasının oluşturulduğu saat. Bu durumda, GOT üzerinden bir arama yapmak yerine, derleyici, değişkene program-karşı-göreli adresleme ile erişmek için kod üretir. Bu, hem çalışma zamanında hem de yükleme zamanında daha az pahalıdır (çünkü tüm sembol arama ve yeniden yerleştirme işlemi yükleme zamanında atlanabilir).

+0

Gcc, statik değişkenler için GOT aracılığıyla arama yapmaya nasıl zorlanır? –

+0

Doğru yolu düşünemiyorum; neden buna ihtiyacınız var? –

+0

Bir ARM işlemciye konum bağımsız bir uygulama olarak başvurumu yapmaya çalışıyorum ve her şey statik değişkenler dışında iyi çalışıyor. Sorun, .text bölümünün ve .data/.bss bölümlerinin farklı yer değiştirme ofsetlerine sahip olmasıdır, bu nedenle GOT aracılığıyla erişim sırasında statik değişkenlere pc-relatif erişim çalışmaz. –