Site icon تلاش نت

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

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

 

مقدمه

واژه «کتابخانه» (Library) در برنامه نویسی بسیار پرکاربرد است و هر گاه سخن از برنامه نویسی به میان می‌آید، اصطلاح کتابخانه هم شنیده می‌شود. اما ممکن است تا کنون تعریف دقیقی از چیستی کتابخانه در ذهن وجود نداشته باشد. کتابخانه یکی از مفاهیم و اجزای بسیار مهم در برنامه نویسی به حساب می‌آید و شناخت دقیق آن برای هر فرد فعال در حوزه برنامه نویسی ضرورت دارد. می‌توان به صورت کلی گفت که کتابخانه در برنامه نویسی مجموعه‌ای از کدهای از قبل نوشته شده است که برنامه نویسان برای بهینه‌سازی کدهای خود از آن‌ها استفاده می‌کنند.

 

 

چرا باید از کتابخانه ها استفاده کنیم؟

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

در  ادامه مقاله به «مفهوم کتابخانه ها در لینوکس» پرداخته شده است.

 

انواع کتابخانه های لینوکس

کتابخانه های سرور مجازی و سیستم عامل لینوکس به طور کلی به دو دسته تقسیم می شوند:

کتابخانه‌های پویا یا Shared Libraries (Dynamic Libraries) و کتابخانه های ثابت یا (Static Libraries)

وجود کتابخانه های ثابت در زمان کامپایل یک برنامه ضروری است اما مشکل عمده آن ها این است که برای هر برنامه ای نیاز به کامپایل دارند. به زبانی ساده تر هر برنامه ای به صورت مستقل نیازمند اجرا و بارگیری در حافظه دارد. در واقع کاربرد بیشتر این کتابخانه ها زمانی مشخص می شود که برنامه ای کوچک و با توابع کم مورد بررسی باشد. اما برای برنامه های بزرگ از کتابخانه های پویا استفاده می شود که از این پس راجع به آن صحبت می کنیم.

ممکن است که برنامه های متعدد از تعداد زیادی کتابخانه استفاده کنند، در این صورت نیازمند یک کتابخانه به اشتراک گذاشته شده هستند. همان طور که از نام آن ها پیداست، این کتابخانه ها قابلیت اشتراک گذاری توابع را برای برنامه های مختلف دارا هستند. در واقع این نوع کتابخانه ها نیاز به استفاده مداوم ندارند و تنها یک بار بارگذاری می شوند و پس از آن برنامه های مختلف قابلیت استفاده از توابع و کدهای آنها را دارند.

انواع کتابخانه ها در لینوکس

 

در لینوکس کتابخانه های پویا را با فرمت so. (مخفف Shared Object) بر اساس معماری ۳۲ یا ۶۴ بیتی سیستم عامل، درون یکی از دایرکتوری های /usr/lib یا /usr/lib64 قرار دارند. این کتابخانه ها را می توان از دو راه استفاده کرد:

  1. (Dynamic linking) زمانی که برنامه لینک شده در حال انجام است, لینوکس می تواند این کتابخانه را در زمان اجرای برنامه های دیگر بارگذاری کند.
  2. (Dynamic loading) با دو گزینه load و Unload این کتابخانه ها می توانند به صورت کاملا پویا عمل کنند و زمانی که یک برنامه نیازمند یک تابع است آن را بارگذاری و در اختیار آن قرار دهند. روش کاملا پویا روشی رایج برای برنامه هایی مانند مرورگرهاست که قابلیت پشتیبانی از افزونه ها را دارند.

منطور از برنامه یک فرایند است که در حافظه قرار گرفته است و به همراه آن نیز فایل های کتابخانه اشتراکی نیز در حافظه قرار می گیرند. این فایل ها معادل فایل های dll. در ویندوز و فایل dylib.‌ در سیستم عامل مکینتاش هستند. کتابخانه های استاتیک بر خلاف کتابخانه های اشتراکی در زمان کامپایل به فایل های Object‌ پیوند داده می شوند. این فایل ها دارای پسوند a. هستند که به صورت فایل های Object معمولی هستند.

 

 

” زمانی که یک برنامه اجرا می‌شود کتابخانه‌ های مرتبط با آن در صورتی که از قبل بارگیری نشده باشند توسط مفسر (Interpreter) بارگیری می‌شوند. “

 

 

مثال لیست کردن فایل

به عنوان مثال در ادامه ما برنامه باینری ls که به منظور لیست کردن فایل استفاده می‌شود را مورد بررسی قرار می‌دهیم.

 

[root@server lib64]# file /bin/ls

bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically/ linked (uses shared libs), for GNU/Linux 2.6.18, strippe

 

 

همانطور که مشاهده می‌کنید این فایل یک فایل باینری و قابل اجرا است که توسط ELF یا Executable Linking Format  مدیریت می‌شود و به صورت پویا لینک شده است.

Interpreter ELF وظیفه اجرای کتابخانه‌ های یک برنامه را دارد؛ هر فایل اجرایی شامل یک header است که مشخصات کتابخانه‌ها و کدهای استفاده‌ شده و نقطه شروع (Start Point) را مشخص می کند.

مفسر مربوط به فراخوانی کتابخانه‌ ها که در تصویر زیر مشاهده می‌شود، ld-linux-x86-64.so.2 است که به فایل ld-2.12.so لینک شده است.

مفسر مربوط به فراخوانی کتابخانه‌ ها

 

این فایل که خود به صورت کتابخانه‌ای از توابع و کلاس‌ها است به صورت ایستا لینک شده است، زمانی که یک کتابخانه پویا به صورت لینک شده نیاز است، هسته لینوکس این لینک را اجرا و مقدار‌دهی می‌کند تا بتواند کتابخانه‌ های مرتبط با یک برنامه را لود کند.

 

[root@server lib64]# ldd /lib64/ld-2.12.so

 statically linked

 

 

زمانی که کار اجرای بارگیری کتابخانه‌ها انجام شد، جابجایی صورت گرفته در مرحله قبل به حالت اولیه بازگشته و کنترل برای اجرا به برنامه داده می‌شود و هنگام خروج از یک برنامه این وظیفه لینکر است تا سیگنال‌های مربوط به توقف اجرای یک کتابخانه را به CPU ارسال کند.

علی‌رغم این روند که به صورت کاملا خودکار و توسط یک هدایتگر (لینکر) انجام می‌شود، می‌توان مدیریت اجرای یک کتابخانه را به برنامه داد. از این رو برنامه می‌تواند مشخص کند کدام کتابخانه نیاز به بارگیری دارد. در این مرحله برنامه کتابخانه را به عنوان یک فایل اجرایی اجرا می‌کند تا بتواند از توابع داخل آن استفاده کند؛ در این مرحله ازAPI  هایی که مرتبط با بارگیری و بارگذاری  یک کتابخانه هستند استفاده خواهد شد.

از API های مهم می‌توان به موارد زیر اشاره کرد:

 

dlopen         Makes an object file accessible to a program

dlsym           Obtains the address of a symbol within a dlopened object file

dlerror         Returns a string error of the last error that occurred

dlclose         Closes an object file

 

 

سخن پایانی

کتابخانه یکی از مفاهیم و اجزای بسیار مهم در برنامه نویسی به حساب می‌آید و شناخت دقیق آن برای هر فرد فعال در حوزه برنامه نویسی ضرورت دارد. می‌توان به صورت کلی گفت که کتابخانه در برنامه نویسی مجموعه‌ای از کدهای از قبل نوشته شده است که برنامه نویسان برای بهینه‌سازی کدهای خود از آن‌ ها استفاده می‌کنند. در این مقاله متوجه شدیم که کتابخانه ها در لینوکس چه مفهومی دارند و همچنین به چند دسته تقسیم و چه کابردی دارند.

” با تلاش نت همراه باشید “

5/5 - (12 votes)