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).
Gcc, statik değişkenler için GOT aracılığıyla arama yapmaya nasıl zorlanır? –
Doğru yolu düşünemiyorum; neden buna ihtiyacınız var? –
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. –