In gcc doc एक कारण section
प्रयोग करने के लिए दिया जाता है में एक चर डालने में बिंदु हो सकता है। यही कारण है to map to special hardware
है। लेकिन इस प्रतीत हो रहा है नहीं मेरे मामले।
वास्तव में क्या __attribute__ ((खंड ("स्टैक"))? के साथ "स्टैक" खंड
तो मैं एक साझा पुस्तकालय है कि हम अपने परियोजना पर उपयोग संशोधित करने के लिए एक कार्य दे दिया है। यह एक लिनक्स पुस्तकालय है। पुस्तकालय है कि मुझे puzzeles में चर घोषणाओं है। वे (मोटे तौर पर इस तरह दिखेगा):
static int my_var_1 __attribute__((section("STACK"))) = 0;
अद्यतन 1:
(
__attribute__((section("STACK")))
)
अद्यतन 2 को इस तरह से परिभाषित चर के एक दर्जन से अधिक कर रहे हैं:
my_var_1
एक निरंतर नहीं है।
my_var_1 = atoi(getenv("MY_VAR_1") ? getenv("MY_VAR_1") : "0");
पुस्तकालय में बाद में इसे इस तरह प्रयोग किया जाता है:
inline void do_something() __attribute__((always_inline));
inline void do_something()
{
if (my_var_1)
do_something_else();
}
क्या __attribute__((section("STACK")))
का उपयोग करने में बिंदु हो सकता है my_var_1
आरंभीकरण के दौरान कोड में बदला जा सकता है? मैं समझता हूं कि section
संकलक को विशेष खंड में एक चर डालने के लिए कहता है। हालांकि static int
को "स्टैक" सेक्शन में डालने में क्या बात हो सकती है?
अद्यतन 3
ये लाइनें
readelf -t my_lib.so
[23] .got.plt
PROGBITS 00000000002103f0 00000000000103f0 0
00000000000003a8 0000000000000008 0 8
[0000000000000003]: WRITE, ALLOC
[24] .data
PROGBITS 00000000002107a0 00000000000107a0 0
00000000000000b0 0000000000000000 0 16
[0000000000000003]: WRITE, ALLOC
[25] STACK
PROGBITS 0000000000210860 0000000000010860 0
00000000000860e0 0000000000000000 0 32
[0000000000000003]: WRITE, ALLOC
[26] .bss
NOBITS 0000000000296940 0000000000096940 0
0000000000000580 0000000000000000 0 32
[0000000000000003]: WRITE, ALLOC
अद्यतन 4
साझा लाइब्रेरी के लेखक से जानकारी प्राप्त करने प्रबंधित से उत्पादन से अंश हैं ।
__attribute__((section("STACK")))
जोड़ा गया था क्योंकि वह सोलारिस पर लाइब्रेरी बनाने में कामयाब नहीं था। फिर उसने यह कामकाज पाया। वैकल्पिक हल करने से पहले
my_var_1
की परिभाषा की तरह था:
int my_var_1 = 0;
और सब कुछ ठीक था। फिर वह इसे बदल के बाद से my_var_1
वास्तव में केवल इस अनुवाद इकाई में की जरूरत थी:
static int my_var_1 = 0;
और वह बदलाव के बाद वह सोलारिस पर पुस्तकालय का निर्माण नहीं हो सकी। तो उन्होंने __attribute__((section("STACK")))
जोड़ा और इससे किसी भी तरह मदद मिली।
क्या आपकी परियोजना सामान्य x86 मशीन पर चलती है, या यह चिप (एसओसी) पर एआरएम सिस्टम की तरह कुछ है? क्या आप एक लिंकर स्क्रिप्ट पा सकते हैं (एलडी द्वारा उपयोग किया जाता है, और इसलिए आमतौर पर ".ld" के साथ समाप्त होता है)? इससे स्पष्ट रूप से स्टैक अनुभाग को स्मृति के क्षेत्र में रखा जाएगा, इसलिए उस लिंकर स्क्रिप्ट को और कुछ सुराग मिलेगा। – gbulmer
कार्यक्रम सामान्य x64_86 सर्वर और एचपी-यूएक्स Itanium2 पर प्रयोग किया जाता है। कोई एआरएम सिस्टम नहीं। –
आपके प्रश्न के लिए मशीनों के बारे में जानकारी जोड़ने लायक हो सकता है। मैं कल्पना कर सकता हूं कि Itanium2 _might_ कुछ ट्रिगर करता है (मुझे इसके बारे में बहुत कम पता है, लेकिन यह अलग है :-) – gbulmer