2014-04-10 4 views
5

पर लाइब्रेरी द्वारा उपयोग किए गए थ्रेड स्थानीय स्टोरेज मॉडल को निर्धारित करने का कोई तरीका है क्या लिनक्स पर साझा लाइब्रेरी के टीएलएस मॉडल से पूछताछ करने का कोई तरीका है? (उदाहरण के लिए ldd या कुछ अन्य उपकरण का उपयोग)।क्या लिनक्स

मुझे "प्रारंभिक-निष्पादन" मॉडल के साथ बहुत से पुस्तकालयों को लोड करने में समस्या हो रही है और यह सुनिश्चित करना चाहते हैं कि तीसरे पक्ष के libs इस मॉडल का उपयोग किस प्रकार करते हैं (इसलिए मैं कुछ स्लॉट मुक्त कर सकता हूं जैसे स्थिर रूप से लिंक करके)।

यह एक त्रुटि में परिणाम है:

dlopen: cannot load any more object with static TLS 

this question देखते हैं।

उत्तर

7

मैं अपने आप को इस त्रुटि का सामना किया, और जब यह जांच कर रही है, मैं एक mailing list post with this info पर आया था: /usr/include/elf.h को देखते हुए

If you link a shared object containing IE-model access relocs, the object will have the DF_STATIC_TLS flag set. By the spec, this means that dlopen might refuse to load it.

, हमने:

/* Values of `d_un.d_val' in the DT_FLAGS entry. */ 
... 
#define DF_STATIC_TLS 0x00000010  /* Module uses the static TLS model */ 

तो तुम अगर DF_STATIC_TLS परीक्षण की आवश्यकता साझा पुस्तकालय की DT_FLAGS प्रविष्टि में सेट है।

बातें परीक्षण करने के लिए, मैं धागा स्थानीय भंडारण का उपयोग कर कोड का एक सरल टुकड़ा बनाया:

static __thread int foo; 
void set_foo(int new) { 
    foo = new; 
} 

मैं तो इसे दो बार संकलित दो अलग धागा स्थानीय भंडारण मॉडल के साथ:

gcc -ftls-model=initial-exec -fPIC -c tls.c -o tls-initial-exec.o 
gcc -shared tls-initial-exec.o -o tls-initial-exec.so 

gcc -ftls-model=global-dynamic -fPIC -c tls.c -o tls-global-dynamic.o 
gcc -shared tls-global-dynamic.o -o tls-global-dynamic.so 

और यह सुनिश्चित करें पर्याप्त, मैं readelf का उपयोग कर दो पुस्तकालयों के बीच एक अंतर देख सकता हूं:

$ readelf --dynamic tls-initial-exec.so 

Dynamic section at offset 0xe00 contains 25 entries: 
    Tag  Type       Name/Value 
... 
0x000000000000001e (FLAGS)    STATIC_TLS 

tls-global-dynamic.so संस्करण में DT_FLAGS प्रविष्टि नहीं थी, संभवतः क्योंकि इसमें कोई झंडे सेट नहीं थे। तो प्रभावित पुस्तकालयों को खोजने के लिए readelf और grep का उपयोग करके स्क्रिप्ट बनाने के लिए यह काफी आसान होना चाहिए।

+1

बहुत बहुत धन्यवाद! बहुत बढ़िया जवाब। मुझे 'readelf -l लाइब्रेरी भी मिली grep टीएलएस 'उपयोगी। यह इंगित करता है कि क्या कोई थ्रेड लोकेशन स्टोरेज है या नहीं। यह टीएलएस के साथ कुछ भी पता चला है जो एक डीटीवी स्लॉट का उपयोग करता है (और बाद में लोड करने से STATIC_TLS ऑब्जेक्ट्स को अवरुद्ध कर सकता है), लेकिन यदि आप पहले STATIC_TLS ऑब्जेक्ट्स लोड करते हैं, तो गैर-इंटियल-निष्पादित लोग किसी अन्य विधि का उपयोग करते हैं और स्लॉट नहीं लेते हैं। – robince