سی میں لینکس ڈلوپن سسٹم

Sy My Lynks Lwpn Ss M



لائبریری فنکشن dlopen() C زبان میں بہت مفید فنکشن ہے۔ فنکشن ایک نیا کھولنے کے بعد لائبریری کو میموری میں لوڈ کرتا ہے۔ ہم اسے عام طور پر لائبریری کی علامتوں کو لوڈ کرنے کے لیے استعمال کرتے ہیں جو مرتب کے وقت نامعلوم ہیں۔ Dlopen() ایک فنکشن ہے جو ہمارے پروگراموں میں استعمال ہوتا ہے۔ DL لائبریری dlopen(، Dlfcn.h میں بیان کردہ) کو نافذ کرتی ہے۔ dlopen فنکشن کے لیے دو پیرامیٹرز درکار ہیں: لائبریری فائل کا نام اور پرچم۔ فائل کا نام ایک متحرک لائبریری ہے، اور یہ اس بات کی وضاحت کرتا ہے کہ آیا لائبریری کے انحصار کا فوراً حساب لیا جاتا ہے یا نہیں۔ dlopen() ایک 'ہینڈل' لوٹاتا ہے جسے ایک مبہم قدر سمجھا جانا چاہئے اور دیگر DL لائبریری آپریشنز اسے استعمال کرتے ہیں۔ اگر لوڈ کرنے کی کوشش ناکام ہو جاتی ہے تو، dlopen() NULL لوٹاتا ہے۔ لیکن dlopen() ایک ہی فائل ہینڈل کو واپس کرتا ہے اگر یہ ایک ہی لائبریری کو کئی بار لوڈ کرتا ہے۔

dlopen فنکشن کا استعمال کرتے ہوئے، کمپائلر ممکنہ غلطیوں کی جانچ نہیں کرتا کیونکہ وہ ان اقسام اور پروٹو ٹائپس سے بے خبر ہے جو ہم استعمال کر رہے ہیں۔ معیاری لوڈنگ کے لیے dlopen فنکشن کی تعیناتی اس کے ذریعے فروغ پاتی دکھائی نہیں دیتی، سوائے چند معمولی حالات کے۔ ویسے، یہ خود شناسی کو بہتر بنانے کا ایک طریقہ ہے۔ جب مشترکہ ماڈیول فی الحال کسی دوسرے پروگرام کے ذریعہ استعمال کیا جا رہا ہے، میموری لے آؤٹ کی اصلاح کو مشروط لوڈنگ میں خاص دلچسپی نہیں ہے۔ جب پہلے استعمال شدہ لائبریری لوڈ کی جاتی ہے تو میموری فوٹ پرنٹ میں اضافہ نہیں ہوتا ہے۔ کمپائلر مانیٹرنگ سے بچنا خطرناک ہے اور اس سے بگ رائٹنگ اچھی ہوتی ہے۔ مزید برآں، ہمارے پاس ممکنہ کمپائلر آپٹیمائزیشن کی کمی ہے۔

مثال 1:

اب، C زبان میں dlopen فنکشن کی فعالیت کو دیکھنے کے لیے درج ذیل مثال پر غور کریں۔ پہلے مرحلے میں، ہم کچھ C معیاری لائبریریوں کو لوڈ کرتے ہیں۔ یہاں، ہم نئی لائبریری 'dlfcn.h' لوڈ کرتے ہیں جو dlopen موڈ دلیل کی تعمیر کے دوران میکروز کی وضاحت کے لیے استعمال ہوتی ہے۔







پھر، ہم اپنے پروگرام 'gnu/lib-name.h' کے اندر ایک اور لائبریری متعارف کراتے ہیں۔ GNU libc کے ساتھ شامل مشترکہ لائبریری فائلیں صارف کے پروگراموں کے ذریعہ اس کی وضاحت کردہ میکرو کے مطابق پائی جاتی ہیں۔ GNU C لائبریری GNU اور GNU/Linux آپریٹنگ سسٹمز کے ساتھ ساتھ دوسرے لینکس پر مبنی نظاموں کی ایک وسیع رینج کے لیے بنیادی لائبریریاں پیش کرتی ہے۔ اس کے بعد، ہمارے پاس بنیادی طریقہ کار ہے. اس کے اندر، ہم void مطلوبہ الفاظ کے ساتھ پوائنٹر آبجیکٹ 'ہینڈل' کا اعلان کرتے ہیں۔ ہم ایک پوائنٹر سائن فنکشن کا اعلان کرتے ہیں جس میں ڈیٹا ٹائپ ڈبل ہوتا ہے۔ غلطی سے نمٹنے کے لیے پوائنٹر آبجیکٹ 'خرابی' کا ایک اور اعلان ہے۔



اس کے بعد، ہم dlopen فنکشن کو 'ہینڈل' آبجیکٹ کے اندر داخل کرتے ہیں۔ dlopen دو دلائل لیتا ہے: LIBM_SO اور 'RTLD_LAZY'۔ یہاں، 'LIBM_SO' لائبریری فائل کا نام ہے جو کہ ریاضی کے فنکشنز جیسے مثلثی فنکشن فراہم کرتا ہے۔ اس مشترکہ لائبریری کی ضرورت ہے کیونکہ ہم سائن فنکشن استعمال کرتے ہیں۔ 'RTLD_LAZY' ایک اور دلیل ہے جو dlopen فنکشن کو کہتے ہیں۔ جب کسی علامت کا پہلی بار حوالہ دیا جاتا ہے، تو اس کے نفاذ کے ذریعے متعین وقت میں جگہ بدلنا ضروری ہے۔



چونکہ ایک عمل قابل عمل آبجیکٹ فائل میں ہر علامت کا حوالہ نہیں دے سکتا، اس لیے RTLD LAZY کی وضاحت کرنے سے عمل درآمد پر کارکردگی کو بڑھانا چاہیے جو متحرک علامت بائنڈنگ کو فعال کرتی ہے۔ اگلا، جب ہینڈل آبجیکٹ dlopen فنکشن کو انجام دینے میں ناکام ہوجاتا ہے تو ہمارے پاس غلطی سے نمٹنے کے لیے if-else شرط ہے۔ ہم غلطی کو صاف کرنے کے لئے dlerror کہتے ہیں۔





dlerror() فنکشن ایک غیر ختم شدہ سٹرنگ فراہم کرتا ہے جو انسانی پڑھنے کے قابل ہے اور حالیہ خرابی کی رپورٹنگ کی وضاحت کرتا ہے جو آخری dlerror کال کے بعد سے dlopen API کالوں میں سے ایک پر کال کی وجہ سے ہوئی ہے۔ پھر، ہم فنکشن کو اس طرح کاسٹ کرتے ہیں: '(*void**)(&sine)= dlsym(ہینڈل، sin)'۔ جیسا کہ یہ عجیب بات ہے، کاسٹنگ آئی ایس او سی کی تعمیل کرتی ہے جو مرتب کرنے والے کی طرف سے وارننگ سے گریز کرتی ہے۔ ہم dlsym فنکشن کو استعمال کرتے ہیں جو ایک علامت کا راستہ حاصل کرتا ہے جو ایک ڈائنامک لنک ماڈیول کے اندر مخصوص ہوتا ہے جو dlopen() فنکشن کے ذریعے قابل رسائی ہے۔

اس کے علاوہ، ہم معیاری غلطی کے لیے اگر dlerror() NULL نہ ہونے کی صورت میں پیدا ہوتا ہے تو پھر سے if-else آپریشن کرتے ہیں۔ اس کے بعد، ہمارے پاس ایک پرنٹ ایف اسٹیٹمنٹ ہے جہاں ہم گنتی کی جانے والی سائن ویلیو کی وضاحت کرتے ہیں۔ آخری مرحلے میں، ہم اس مشترکہ آبجیکٹ کو dlopen() کے ذریعے لوٹائے گئے ہینڈل کے لیے dlclose کا استعمال کرکے بند کرتے ہیں۔



# شامل کریں
# شامل کریں
#include
#include

int
مرکزی ( int argc ، چار ** argv )
{
باطل * ہینڈل ;
دگنا ( * ان کا ) ( دگنا ) ;
چار * غلطی ;

ہینڈل = dlopen ( LIBM_SO ، RTLD_LAZY ) ;
اگر ( ! ہینڈل ) {
fprintf ( stderr ، '%s \n ' ، dlerror ( ) ) ;
باہر نکلیں ( EXIT_FAILURE ) ;
}
dlerror ( ) ;

* ( باطل ** ) ( اور ان کا ) = dlsym ( ہینڈل ، 'بغیر' ) ;

اگر ( ( غلطی = dlerror ( ) ) != خالی ) {
fprintf ( stderr ، '%s \n ' ، غلطی ) ;
باہر نکلیں ( EXIT_FAILURE ) ;
}

printf ( '%f \n ' ، ( * ان کا ) ( 4.0 ) ) ;
dlclose ( ہینڈل ) ;
باہر نکلیں ( EXIT_SUCCESS ) ;
}

ہم C compilation کمانڈ کے ساتھ -ldl آپشن استعمال کرتے ہیں کیونکہ یہ dlopen لنکڈ انٹرفیس کے لیے لائبریری ہے اور اس کی ضرورت ہے۔ جب dlopen فائل پر عمل درآمد کیا جاتا ہے، تو یہ پہلے سے دی گئی قدر کی سائن ویلیو دکھاتا ہے۔

مثال 2:

اب، ہم dlopen فنکشن کو استعمال کرنے کی ایک اور مثال لیتے ہیں۔ ہم dlopen کوڈ کے نفاذ کے لیے تمام مطلوبہ C لائبریریوں کے ساتھ اپنے پروگرام کو لوڈ کرتے ہیں۔ پھر، ہم اپنے پروگرام کو مرکزی طریقہ کے اندر شروع کرتے ہیں۔ یہاں، ہم متغیر 'src' کے اعلان کے ساتھ سٹرنگ کی وضاحت کرتے ہیں۔ اس کے بعد ہم پوائنٹر متغیرات 'strlen'، 'handle' اور 'error' کا اعلان کرتے ہیں۔

اگلا، ہم ہینڈل متغیر کو کال کرتے ہیں اور dlopen فنکشن کو تعینات کرتے ہیں۔ dlopen فنکشن سٹرنگ ہینڈلنگ فنکشنز کے لیے مشترکہ لائبریری 'libstr.so' اور فلیگ 'RTLD_LAZY' کو داخل کرتا ہے جو پہلے ہی پچھلی مثال میں ظاہر ہو چکا ہے۔ ہم dlopen فنکشن کے ذریعے پیدا ہونے والی غلطی کو صاف کرنے کے لیے 'error' متغیر کے اندر dlerror فنکشن کا استعمال کرتے ہیں۔ غلطیوں کی جانچ کرنے کے لیے if-else کا استعمال کیا جاتا ہے۔

پھر، ہم dlsym فنکشن کا استعمال کرتے ہوئے strlen فنکشن کا ایڈریس حاصل کرتے ہیں اور ایسا کرتے وقت غلطیوں کی تصدیق کرتے ہیں۔ اس کے بعد، ہم دی گئی سٹرنگ کی لمبائی واپس کرنے کے لیے strnlen فنکشن کو کال کرنے کے لیے printf فنکشن کا استعمال کرتے ہیں۔ آخر میں، ہم مشترکہ لائبریری کو dlclose فنکشن کے ساتھ بند کر دیتے ہیں۔

# شامل کریں
# شامل کریں
#include
#include
int مرکزی ( باطل )
{
چار * src = 'ہیلو لینکس' ;
int ( * strlen ) ( const چار * ) ;
باطل * ہینڈل ;
چار * غلطی ;


ہینڈل = dlopen ( './libstr.so' ، RTLD_LAZY ) ;
غلطی = dlerror ( ) ;
اگر ( ! ہینڈل || غلطی != خالی ) { printf ( 'لائبریری کو لوڈ کرنے کی کوشش ناکام! \n %s \n ' ، غلطی ) ;
واپسی - 1 ; }

strlen = dlsym ( ہینڈل ، 'strlen' ) ;
غلطی = dlerror ( ) ;
اگر ( ! strlen || غلطی == خالی ) { printf ( '%s \n ' ، غلطی ) ; واپسی - 1 ; }

printf ( 'سٹرنگ کی لمبائی ہے:%d \n ' ، strlen ( src ) ) ;
dlclose ( ہینڈل ) ;
واپسی 0 ;
}

ہم دیئے گئے پروگرام کے عمل کے لیے درج ذیل کمانڈ استعمال کرتے ہیں۔ یہاں، -lstr جھنڈا سٹرنگ کی لمبائی کے فنکشن کے لیے استعمال ہوتا ہے اور ldl کو dlopen لائبریری فائل کے لیے استعمال کیا جاتا ہے۔ مرتب شدہ پروگرام سٹرنگ کی لمبائی دیتا ہے جیسا کہ شیل میں دکھایا گیا ہے:

نتیجہ

اس مضمون میں C زبان کے dlopen فنکشن کے بارے میں معلومات فراہم کی گئی ہیں۔ ہمارے پاس ڈلوپین فنکشن کا مختصر تعارف ہے۔ پھر، ہم نے دو مثالیں نافذ کیں۔ فنکشن ایک شناخت کنندہ واپس کرتا ہے جو کھلی ہوئی لائبریری کی وضاحت کرتا ہے۔ کھولی ہوئی لائبریری کے اندر موجود فنکشنز کے ایڈریس کا تعین پھر اس شناخت کنندہ اور dlsym فنکشن کا استعمال کرتے ہوئے کیا جاتا ہے۔ لائبریری کے اندر ایک فنکشن کا پتہ جو پہلے ہی dlopen کے استعمال سے کھولا گیا ہے dlsym فنکشن کا استعمال کرتے ہوئے پایا جا سکتا ہے۔