fs:0
sorunuzu yanıtlamak için: x86_64 ABI, fs:0
'un "fs
" un kendisi tarafından "noktaya getirilen" adresini içermesini gerektirir. Yani, fs:-4
, fs:0 - 4
'da depolanan değeri yükler. Bu özellik gereklidir, çünkü çekirdek kodundan geçmeden fs
numaralı adresi kolayca gösteremezsiniz. fs:0
adresinde saklanan adresin bulunması, iş parçacığı yerel depolama ile çalışmayı çok daha verimli hale getirir. ama %gs
ile aynı yapar
f:
movq %fs:0, %rax
leaq -4(%rax), %rax
retq
g:
movl %fs:-4, %eax
retq
i686 için
static __thread int test = 0;
int *f(void) {
return &test;
}
int g(void) {
return test;
}
derler: Bir iş parçacığı yerel değişkenin adresini alırken
Sen eylem görebilirsiniz. Aarch64 üzerinde bu gerekli değildir, çünkü adres tls kaydının kendisinden okunabilir.
FS, windows iş parçacığı bilgisini işaret etmek için x86 üzerinde win32 tarafından kullanılır - şarap sadece bunu eşleştiriyor. –