محمد نصیری
بنیانگذار انجمن تخصصی فناوری اطلاعات ایران ، هکر کلاه خاکستری ، کارشناس امنیت اطلاعات و ارتباطات

Shared Library چیست؟ بررسی مفهوم کتابخانه های اشتراکی در لینوکس

فایلهای کتابخانه یا Library ها در هر سیستم عاملی و برای تقریبا هر نرم افزاری وجود دارند ، در واقع اول بهتر است تعریفی از یک فایل کتابخانه یا Library داشته باشیم ، یک Library در واقع شامل یک سری کد کامپایل شده است که تمامی اشیاء یا Object های مورد نیاز برای اجرای یک نرم افزار را بصورت مجتمع داخل یک فایل نگهداری می کند. اگر شما یک نرم افزار را در نظر بگیرید ، این نرم افزار دارای یک سری Function ها یا توابع می باشد که هر کدام کاری انجام می دهند ، مثلا یکی ورودی و یکی خروجی چاپ می کند ، یکی وظیفه ذخیره داده را بر عهده دارد و ... همه اینها قرار نیست از ابتدا برنامه نویسی شوند.

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

یک برنامه نویس می تواند با استفاده از کتابخانه ها این کارها را انجام بدهد بدون اینکه نیاز به نوشتن همه آنها از ابتدا باشد ، برای مثال شما دیگر نیازی نیست که برنامه دریافت ورودی اطلاعات را دوباره از نو بنویسید بلکه کافیست از کتابخانه ای که وظیفه دریافت داده ها از ورودی را دارد آنها را دریافت کنید . اگر بخواهیم خیلی ساده درک مبحث کتابخانه ها را داشته باشیم شما می توانید ماژول ها را در نظر بگیرید ، یعنی هر ماژول یک کار را انجام می دهد و کتابخانه ها هم برای خودشان وظایفی بر عهده دارند.

یک کتابخانه ممکن است شامل یک یا چند تابع یا Function باشد که حاوی یک سری کد برای انجام یک سری کارها است ، اگر بخواهیم در سیستم عامل لینوکس مثال بزنیم شما می توانید کتابخانه ای به نام pthread را در لینوکس تصور کنید ، این کتابخانه زمانی استفاده و فراخوانی می شود که شما در برنامه خود بخواهید از توابع وابسته یا Related Function ها استفاده کنید ، بصورت کلی ما کتابخانه ها یا بهتر بگوییم کتابخانه های برنامه ها ( Program Library ) ها را به دو دسته زیر تقسیم بندی می کنیم :

  1. کتابخانه های اشتراکی یا Shared Library ها
  2. کتابخانه های ایستا یا Static Library ها
کاربرد Shared Library ها در لینوکس

Shared Library یا کتابخانه های اشتراکی چه هستند ؟

Share Library ها یا کتابخانه های اشتراکی در واقع Library هایی هستند که در هنگام اجرا شدن هر برنامه ای می توانند به آنها لینک شوند. در واقع آنها در اصطلاح فنی در زمان Run-Time یک برنامه می توانند به آن متصل شوند. در واقع آنها کدهایی هستند که هر زمان می توانند در حافظه سیستم Load شوند و شروع به کار کنند. زمانیکه اینگونه Library ها در حافظه Load شدند از آن به بعد می توانند بصورت همزمان در N برنامه مختلف مورد استفاده قرار بگیرند. خوب این چه مزیتی برای سیستم و منابع آن دارد ؟

دقت کنید که ممکن است برنامه شما و چند برنامه دیگر بخواهند بصورت همزمان از یک کتابخانه استفاده کنند ، اگر قرار باشد هر بار با فراخوانی یک نرم افزار یک کتابخانه در حافظه سیستم Load شوند حافظه زیادی اشغال می شود اما زمانیکه از Shared Library ها استفاده می کنیم فقط یکبار Library مورد نظر ما در حافظه Load می شود و از آن به بعد هر نرم افزاری که به Library مورد نظر نیاز داشته باشد به آن می تواند دسترسی پیدا کند. یکی از نکات بسیار خوب در خصوص Shared Library ها این است که برنامه نویس ها می توانند قابلیت ماژولار بودن یا ماژوله شدن را به Library ها بدهند.

آنها می توانند کد Library مورد نظر را تغییر بدهند بدون دغدغه اینکه بخواهند کل نرم افزارشان را Recompile کنند ، فرض کنید اگر نرم افزاری همانطور که گفته شد از Library به نام pthread استفاده کند ، ما آن را باز می کنیم ، تغیر می دهیم و بروز رسانی می کنیم و دست به نرم افزار نمی زنیم ، به محض اجرا شدن نرم افزار از Library بروز رسانی شده خودکار استفاده می شود ، نامگذاری یک Shared Library یا بهتر بگوییم نحوه دسترسی به Shared Library ها به شکلهای زیر انجام می شود :

  1. نامگذاری که دارای lib در اسم و پسوند so با استفاده از linker ها انجام می شود ، برای مثال libpthread.so
  2. نامگذاری Fully Qualified Name یا soname که دارای lib در اسم و پسوند so با استفاده از یک شماره نسخه یا version number است ، برای مثال libpthread.so.1
  3. نامگذاری Real Name یا نام واقعی که دارای lib در اسم و پسوند so می باشد علاوه بر شماره نسخه یا version number یک عدد دیگر هم در ادامه دارد که به عنوان Release Number شناخته می شود ، برای مثال libpthread.so.1.1

اگر شما تغییری در کدهای یک shared library انجام بدهید که نحوی که دیگر این shared library جدید با shared library قدیمی هماهنگی نداشته باشد شما شماره نسخه یا version number آن را تغییر داده اید و یک نسخه جدید از shared library ایجاد کرده اید. برای مثال اگر یک function یا تابع بصورت کامل از سیستم حذف شود قطعا یک نسخه جدید از آن Library برای اجرای تابع مورد نیاز خواهد بود. آن عدد کوچک در انتهای نام و بعد از نسخه در واقع به این معناست که Shared Library شما مشکل یا Bug داشته است و یک سری تغییرات بر روی آن ایجاد شده است اما این تغییرات باعث نمی شود که بصورت کلی این Library با نسخه های قبلی آن هماهنگ نباشد و Compatibility با نسخه های قبلی همچنان پابرجاست. برای مثال یک Bug fix ساده نمی تواند کارایی کل Shared Library را با محصولات قبلی دچار اختلال و مشکل کند بنابراین یک عدد صرفا به انتهای آن به نشانه برطرف شدن باگهای مربوطه اضافه خواه شد اما نسخه تغییری نخواهد کرد.

چرا این همه اسامی برای یک Shared Library در سیستم عامل لینوکس وجود دارد ؟

خوب جواب این سئوال ساده هست ، با داشتن ساختار نامگذاری مشخص و سلسله مراتبی قابلیت این رو در سیستم عامل داریم که از نسخه های مختلف یک Library همزمان بتونیم استفاده کنیم. در واقع امکان وجود همزمان چندین نسخه از Library ها با این ساختار نامگذاری متنوع وجود دارد. با اینکار برنامه ای که نیاز به دسترسی به فایل های Library دارد دیگر نیازی ندارد که به دنبال آخرین نسخه از Library مورد نظرش بگردد چون بصورت خودکار سیستم آخرین نسخه از Library مورد نظر را برایش در حافظه Load خواهد کرد.

زمانیکه آخرین نسخه از Library مورد نظر بر روی سیستم نصب شود ، تمامی برنامه ها بصورت خودکار به آخرین نسخه Link می شوند. اسمی که توسط linker استفاده می شود معمولا یک symbolic link سات که به Fully Qualified soname اشاره می کند و باعث می شود از نظر برنامه اسم ظاهری تغییری نکند. در مقاله بعدی در خصوص محل قرارگیری Shared Library ها و استفاده از سدتور idconfig صحبت خواهیم کرد.بصورت استاندارد سه محل ذخیره سازی پیشفرض برای نگهداری Library ها در فایل سیستم لینوکس وجود دارد که به ترتیب محل های زیر می باشند :

/lib
/usr/lib
/usr/local/lib

خوب ما استانداردی که برای فایل ها در لینوکس در نظر میگیریم استانداردی به نام HFS یا Filesystem Hierarchy Standard است. بر اساس این استاندارد هر library که در هنگام startup سیستم . boot سیستم عامل اجرا شود و یا در دایرکتوری root فایل سیستم قرار بگیرد در مسیر //lib سیستم عامل قرار خواهد گرفت. این در حالی است که کلیه library هایی که بصورت داخلی توسط سیستم مورد استفاده قرار می گیرند در پوشه //usr//lib ذخیره می شوند. این library ها برای استفاده مستقیم توسط کاربران و shell script ها طراحی نشده اند. یک محل سوم نیز برای ذخیره سازی Library ها به شکل //usr//local//lib وجود دارد که بصورت استاندارد در FHS تعریف نشده است. اگر چنین مسیری را در سیستم عامل مشاهده کردید این دایرکتوری در توزیع های لینوکس های استاندارد وجود ندارد ، اینها Library های غیراستانداردی هستند که خودشان دانلود و در این مسیر نصب شده اند و بسیار محتمل است که دارای باگ و مشکل باشند. ITPRO باشید

نویسنده : محمد نصیری

منبع : انجمن تخصصی فناوری اطلاعات ایران

هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد


محمد نصیری
محمد نصیری

بنیانگذار انجمن تخصصی فناوری اطلاعات ایران ، هکر کلاه خاکستری ، کارشناس امنیت اطلاعات و ارتباطات

محمد نصیری هستم ، هکر قانونمند و کارشناس امنیت سایبری ، سابقه همکاری با بیش از 50 سازمان دولتی ، خصوصی ، نظامی و انتظامی در قالب مشاور ، مدرس و مدیر پروژه ، مدرس دوره های تخصص شبکه ، امنیت ، هک و نفوذ ، در حال حاضر در ایران دیگه رسما فعالیتی غیر از مشاوره انجام نمیدم و مقیم کشور ترکیه هستم ، عاشق آموزش و تدریس هستم و به همین دلیل دوره های آموزشی که ضبط می کنم در دنیا بی نظیر هستند.

نظرات