dpkg-shlibdeps(1) dpkg suite dpkg-shlibdeps(1)

dpkg-shlibdeps - تولیدکننده وابستگی‌های کتابخانه اشتراکی

dpkg-shlibdeps [گزینه...] [-e] فایل‌اجرایی [گزینه...]

دستور dpkg-shlibdeps وابستگی‌های کتابخانه‌های اشتراکی را برای فایل‌های اجرایی مشخص‌شده در آرگومان‌هایش محاسبه می‌کند. وابستگی‌ها به فایل متغیرهای جایگزینی debian/substvars با نام متغیرهای shlibs:dependency-field اضافه می‌شوند که در آن dependency-field نام فیلد وابستگی است. هر متغیر دیگری که با shlibs: آغاز شود از فایل حذف می‌گردد.

دستور dpkg-shlibdeps دو منبع اطلاعاتی ممکن برای تولید اطلاعات وابستگی دارد: یا فایل‌های symbols یا فایل‌های shlibs. برای هر باینری که توسط dpkg-shlibdeps تحلیل می‌شود، فهرستی از کتابخانه‌هایی که باینری به آن‌ها پیوند (link) خورده است پیدا می‌شود. سپس برای هر کتابخانه، فایل symbols یا فایل shlibs بررسی می‌شود (اگر فایل نخست وجود نداشته باشد یا اگر debian/shlibs.local حاوی وابستگی مربوطه باشد). انتظار می‌رود هر دو فایل توسط بستهٔ کتابخانه ارائه شوند و بنابراین باید به‌صورت /var/lib/dpkg/info/package.symbols یا /var/lib/dpkg/info/package.shlibs در دسترس باشند. نام بسته در دو مرحله شناسایی می‌شود: یافتن فایل کتابخانه روی سیستم (جستجو در همان دایرکتوری‌هایی که ld.so استفاده می‌کند)، و سپس استفاده از dpkg -S library-file جهت جستجوی بسته‌ای که کتابخانه را ارائه می‌دهد.

فایل‌های symbols با ارائه حداقل وابستگی برای هر نمادی (symbol) که کتابخانه صادر می‌کند (export)، اطلاعات وابستگی دقیق‌تری را در بر دارند. اسکریپت تلاش می‌کند فایل symbols مرتبط با یک بستهٔ کتابخانه را در مکان‌های زیر پیدا کند (اولین تطابق استفاده می‌شود):

اطلاعات کتابخانه اشتراکی تولیدشده توسط فرایند ساخت جاری که dpkg-shlibdeps را نیز فراخوانی کرده است. آن‌ها توسط dpkg-gensymbols(1) تولید می‌شوند. آن‌ها تنها در صورتی استفاده می‌شوند که کتابخانه در درخت ساخت یک بسته یافت شود. فایل symbols در آن درخت ساخت بر فایل‌های symbols سایر بسته‌های باینری اولویت دارد.
/etc/dpkg/symbols/package.symbols.arch
/etc/dpkg/symbols/package.symbols
اطلاعات بازنویسی وابستگی کتابخانه اشتراکی برای کل سیستم. arch معماری سیستم جاری است (که از طریق dpkg-architecture -qDEB_HOST_ARCH به دست می‌آید).
خروجی دستور “dpkg-query --control-path package symbols”
اطلاعات وابستگی کتابخانه اشتراکی ارائه‌شده توسط بسته. مگر اینکه توسط --admindir بازنویسی شود، این فایل‌ها در /var/lib/dpkg قرار دارند.

هنگام پویش نمادهای استفاده‌شده توسط تمام باینری‌ها، dpkg-shlibdeps (بزرگ‌ترین) حداقل نسخهٔ مورد نیاز برای هر کتابخانه را به خاطر می‌سپارد. در پایان فرایند، قادر است حداقل وابستگی را برای هر کتابخانهٔ استفاده‌شده بنویسد (به شرطی که اطلاعات فایل‌های symbols دقیق باشند).

به‌عنوان یک اقدام احتیاطی، یک فایل symbols می‌تواند یک فیلد فرااطلاعاتی Build-Depends-Package یا Build-Depends-Packages ارائه دهد و dpkg-shlibdeps حداقل نسخه مورد نیاز توسط بستهٔ متناظر را در فیلد Build-Depends استخراج کرده و در صورتی که این نسخه بالاتر از حداقل نسخهٔ محاسبه‌شده از طریق پویش نمادها باشد، از آن استفاده خواهد کرد.

فایل‌های shlibs مستقیماً یک کتابخانه را به یک وابستگی مرتبط می‌کنند (بدون بررسی نمادها). بنابراین اغلب سخت‌گیرانه‌تر از نیاز واقعی است، اما بسیار ایمن بوده و مدیریت آن آسان است.

وابستگی‌های یک کتابخانه در چندین مکان جستجو می‌شوند. اولین فایلی که اطلاعات کتابخانهٔ مورد نظر را ارائه دهد استفاده می‌شود:

اطلاعات بازنویسی وابستگی کتابخانه اشتراکی محلی بسته.
/etc/dpkg/shlibs.override
اطلاعات بازنویسی وابستگی کتابخانه اشتراکی برای کل سیستم.
اطلاعات کتابخانه اشتراکی تولیدشده توسط فرایند ساخت جاری که dpkg-shlibdeps را نیز فراخوانی کرده است. آن‌ها تنها در صورتی استفاده می‌شوند که کتابخانه در درخت ساخت یک بسته یافت شود. فایل shlibs در آن درخت ساخت بر فایل‌های shlibs سایر بسته‌های باینری اولویت دارد.
خروجی دستور “dpkg-query --control-path package shlibs”
اطلاعات وابستگی کتابخانه اشتراکی ارائه‌شده توسط بسته. مگر اینکه توسط --admindir بازنویسی شود، این فایل‌ها در /var/lib/dpkg قرار دارند.
/etc/dpkg/shlibs.default
اطلاعات پیش‌فرض وابستگی کتابخانه اشتراکی برای کل سیستم.

وابستگی‌های استخراج‌شده سپس مستقیماً استفاده می‌شوند (مگر اینکه به دلیل شناسایی به‌عنوان تکراری یا ضعیف‌تر بودن از وابستگی دیگر فیلتر شوند).

دستور dpkg-shlibdeps آرگومان‌های غیرگزینه‌ای را به‌عنوان نام فایل‌های اجرایی تفسیر می‌کند، درست مانند اینکه با -eexecutable مشخص شده باشند.

شامل کردن وابستگی‌های متناسب با کتابخانه‌های اشتراکی مورد نیاز برای executable. این گزینه می‌تواند چندین بار استفاده شود.
افزودن directory به ابتدای فهرست دایرکتوری‌ها جهت جستجوی کتابخانه‌های اشتراکی اختصاصی (از dpkg 1.17.0). این گزینه می‌تواند چندین بار استفاده شود.

نکته: به‌جای تنظیم LD_LIBRARY_PATH از این گزینه استفاده کنید، زیرا آن متغیر محیطی برای کنترل پیونددهنده زمان اجرا استفاده می‌شود و سوءاستفاده از آن جهت تنظیم مسیرهای کتابخانه اشتراکی در زمان ساخت، مثلاً در کامپایل متقابل (cross-compiling) می‌تواند مشکل‌ساز شود.

افزودن وابستگی‌ها به فیلد وابستگی فایل کنترل dependency-field. (وابستگی‌های این فیلد در متغیر shlibs:dependency-field قرار می‌گیرند.)

گزینهٔ -ddependency-field روی تمام فایل‌های اجرایی پس از این گزینه اعمال می‌شود تا زمانی که گزینهٔ -ddependency-field بعدی ظاهر گردد. مقدار پیش‌فرض dependency-field برابر با Depends است.

اگر مدخل وابستگی یکسانی (یا مجموعه‌ای از گزینه‌های جایگزین) در بیش از یکی از نام‌های فیلد وابستگی شناخته‌شده شامل Pre-Depends، Depends، Recommends، Enhances یا Suggests ظاهر شود، dpkg-shlibdeps به‌طور خودکار وابستگی را از تمام فیلدها به‌جز فیلدی که نشان‌دهندهٔ مهم‌ترین وابستگی‌ها است، حذف می‌کند.

تعریف نام بسته.

در صورت مشخص شدن، نام بسته برای تغییر مقادیر پیش‌فرض بر اساس فرااطلاعات بستهٔ باینری در debian/control استفاده خواهد شد.

اگر بسته Essential: yes باشد، فیلد وابستگی پیش‌فرض Pre-Depends خواهد بود، در غیر این صورت Depends. نوع بسته پیش‌فرض از فیلد Package-Type تنظیم می‌شود. بسته به مجموعه بسته‌های مستثنی‌شده توسط -x اضافه می‌شود.

این گزینه از dpkg 1.22.7 پشتیبانی می‌شود.

آغاز متغیرهای جایگزینی با varname-prefix: به‌جای shlibs:. به همین ترتیب، هر متغیر جایگزینی موجود که با varname-prefix: (به‌جای shlibs:) آغاز شود، از فایل متغیرهای جایگزینی حذف می‌گردد.
چاپ تنظیمات متغیرهای جایگزینی در خروجی استاندارد (یا در صورت مشخص شدن، در filename، از dpkg 1.17.2)، به‌جای افزوده شدن به فایل متغیرهای جایگزینی (به‌طور پیش‌فرض debian/substvars).
اولویت دادن به اطلاعات وابستگی کتابخانه اشتراکی برچسب‌خورده برای نوع بسته داده‌شده. اگر هیچ اطلاعات برچسب‌خورده‌ای موجود نباشد، به اطلاعات بدون برچسب بازمی‌گردد. نوع بستهٔ پیش‌فرض deb است. اطلاعات وابستگی کتابخانه اشتراکی برای یک نوع مشخص، با اضافه کردن نام نوع، یک دونقطه و فاصله خالی در ابتدای آن برچسب‌گذاری می‌شود.
خواندن اطلاعات بازنویسی وابستگی کتابخانه اشتراکی از local-shlibs-file به‌جای debian/shlibs.local.
نوشتن متغیرهای جایگزینی در substvars-file؛ پیش‌فرض debian/substvars است.
فعال کردن حالت پرگو (از dpkg 1.14.8). پیام‌های متعددی برای توضیح کارهایی که dpkg-shlibdeps انجام می‌دهد نمایش داده می‌شود.
مستثنی کردن بسته از وابستگی‌های تولیدشده (از dpkg 1.14.8). این گزینه برای جلوگیری از خودوابستگی (self-dependencies) در بسته‌هایی که باینری‌های ELF (فایل‌های اجرایی یا افزونه‌های کتابخانه) ارائه می‌دهند و از کتابخانه‌ای موجود در همان بسته استفاده می‌کنند مفید است. این گزینه می‌تواند چندین بار برای مستثنی کردن چند بسته استفاده شود.
هنگام تلاش برای یافتن یک کتابخانه، ابتدا package-build-dir را بررسی می‌کند (از dpkg 1.14.15). این مورد زمانی مفید است که بستهٔ منبع، چندین نگارش (flavor) مختلف از یک کتابخانه یکسان را می‌سازد و می‌خواهید اطمینان حاصل کنید که وابستگی را از یک بسته باینری مشخص دریافت می‌کنید. می‌توانید از این گزینه چندین بار استفاده کنید: دایرکتوری‌ها به همان ترتیب قبل از دایرکتوری‌های سایر بسته‌های باینری امتحان خواهند شد.
هنگام جستجوی فایل‌های shlibs، symbols و کتابخانه‌های اشتراکی، package-build-dir نادیده گرفته می‌شود (از dpkg 1.18.5). می‌توانید چندین بار از این گزینه استفاده کنید.
در صورتی که اطلاعات وابستگی برای یک کتابخانه اشتراکی یافت نشود، با شکست متوقف نمی‌شود (از dpkg 1.14.8). استفاده از این گزینه توصیه نمی‌شود؛ تمام کتابخانه‌ها باید اطلاعات وابستگی ارائه دهند (چه با فایل‌های shlibs، چه با فایل‌های symbols)، حتی اگر هنوز توسط بسته‌های دیگر استفاده نشده باشند.
انتخاب مجموعه‌ای از هشدارها که می‌توانند توسط dpkg-shlibdeps صادر شوند (از dpkg 1.14.17).

هشدارها را می‌توان از طریق فهرستی از نام‌های نمادین جداشده با کاما (از dpkg 1.22.12)، یا از روی یک value که یک فیلد بیتی را برای این هشدارها مشخص می‌کند، انتخاب کرد.

هشدار “نماد sym استفاده‌شده توسط binary در هیچ‌یک از کتابخانه‌ها یافت نشد” را انتخاب می‌کند.

به‌طور پیش‌فرض فعال است.

هشدار “بسته می‌تواند از یک وابستگی بیهوده اجتناب کند” را انتخاب می‌کند.

به‌طور پیش‌فرض فعال است.

هشدار “binary نباید به library پیوند داده شود” را انتخاب می‌کند.
تغییر مکان پایگاه‌دادهٔ dpkg (از dpkg 1.14.0). مکان پیش‌فرض /var/lib/dpkg است.
-?, --help
نمایش پیام راهنمای نحوه استفاده و خروج.
نمایش نسخه و خروج.

معماری میزبان را تنظیم می‌کند. این مورد روی اشیاء و فایل‌های symbols که جستجو می‌شوند و مسیرهای جستجوی پیش‌فرض آن‌ها تأثیر می‌گذارد.
حالت رنگ را تنظیم می‌کند (از dpkg 1.18.5). مقادیر پذیرفته‌شده در حال حاضر عبارتند از: auto (پیش‌فرض)، always و never.
در صورت تنظیم، برای تصمیم‌گیری در مورد فعال‌سازی پشتیبانی از زبان بومی (Native Language Support)، که به عنوان پشتیبانی بین‌المللی‌سازی (یا i18n) نیز شناخته می‌شود، استفاده خواهد شد (از dpkg 1.19.0). مقادیر پذیرفته‌شده عبارتند از: 0 و 1 (پیش‌فرض).

از آنجایی که dpkg-shlibdeps مجموعه نمادهای استفاده‌شده توسط هر باینری در بستهٔ تولیدشده را تحلیل می‌کند، می‌تواند در چندین مورد هشدار صادر کند. این هشدارها شما را از مواردی که در بسته قابل بهبود است مطلع می‌کنند. در بیشتر موارد، این بهینه‌سازی‌ها مستقیماً مربوط به سورس‌های بالادستی (upstream) است. به ترتیب اهمیت کاهشی، هشدارهای مختلفی که ممکن است با آن‌ها مواجه شوید در ادامه آمده است:

نماد مشخص‌شده در کتابخانه‌هایی که به باینری پیوند خورده‌اند یافت نشد. به احتمال زیاد binary یک کتابخانه است و باید در طول فرایند ساخت به یک کتابخانهٔ اضافی پیوند داده شود (گزینهٔ -llibrary در پیونددهنده).
نماد مشخص‌شده در کتابخانه‌هایی که به باینری پیوند خورده‌اند یافت نشد. به احتمال زیاد binary یک افزونه (plugin) است و نماد احتمالاً توسط برنامه‌ای که این افزونه را بارگیری می‌کند فراهم می‌شود. از نظر تئوری یک افزونه هیچ SONAME ندارد، اما این باینری دارای یک SONAME است و به همین دلیل نمی‌تواند به وضوح به عنوان افزونه شناسایی شود. با این حال، قرار گرفتن باینری در یک دایرکتوری غیرعمومی نشانهٔ قوی بر این است که یک کتابخانهٔ اشتراکی عادی نیست. اگر این باینری واقعاً یک افزونه است، این هشدار را نادیده بگیرید. اما همیشه این احتمال وجود دارد که یک کتابخانه واقعی باشد و برنامه‌هایی که به آن پیوند خورده‌اند از RPATH استفاده می‌کنند تا بارگذار پویا (dynamic loader) آن را پیدا کند. در این صورت، کتابخانه معیوب است و باید اصلاح شود.
هیچ‌یک از فایل‌های باینری که به library پیوند خورده‌اند از نمادهای ارائه‌شده توسط این کتابخانه استفاده نمی‌کنند. با اصلاح تمام فایل‌های باینری، می‌توانید از وابستگی مرتبط با این کتابخانه اجتناب کنید (مگر اینکه همین وابستگی توسط کتابخانهٔ دیگری که واقعاً استفاده می‌شود نیز تولید شده باشد).
دقیقاً مشابه هشدار بالا، اما برای چندین باینری.
فایل binary به کتابخانه‌ای پیوند خورده است که به آن نیازی ندارد. این یک مشکل اساسی نیست، اما پیوند ندادن این کتابخانه به این باینری می‌تواند بهبودهای جزئی در عملکرد زمان بارگیری باینری ایجاد کند. این هشدار همان اطلاعات هشدار قبلی را بررسی می‌کند، اما به‌جای بررسی سراسری روی تمام باینری‌های تحلیل‌شده، این بررسی را برای هر باینری به‌صورت جداگانه انجام می‌دهد.

دستور dpkg-shlibdeps در صورتی که نتواند کتابخانه عمومی مورد استفاده توسط یک باینری را پیدا کند یا اگر این کتابخانه فاقد اطلاعات وابستگی مرتبط باشد (چه فایل shlibs و چه فایل symbols)، با شکست مواجه می‌شود. یک کتابخانه عمومی دارای SONAME بوده و شماره نسخه دارد (libsomething.so.X). یک کتابخانه اختصاصی (مانند یک افزونه) نباید دارای SONAME باشد و نیازی به نسخه ندارد.

فایل binary از کتابخانه‌ای به نام library-soname استفاده می‌کند اما dpkg-shlibdeps نتوانسته است این کتابخانه را پیدا کند. dpkg-shlibdeps فهرستی از دایرکتوری‌ها را برای بررسی به شرح زیر ایجاد می‌کند: دایرکتوری‌های فهرست‌شده در RPATH باینری، دایرکتوری‌های اضافه‌شده با گزینهٔ -l، دایرکتوری‌های فهرست‌شده در متغیر محیطی LD_LIBRARY_PATH، دایرکتوری‌های معماری چندگانه (cross multiarch مانند /lib/arm64-linux-gnu و /usr/lib/arm64-linux-gnu)، دایرکتوری‌های عمومی استاندارد (/lib و /usr/lib)، دایرکتوری‌های فهرست‌شده در /etc/ld.so.conf و دایرکتوری‌های قدیمی multilib (مانند /lib32، /usr/lib32، /lib64 و /usr/lib64). سپس این دایرکتوری‌ها را در درخت ساخت بستهٔ باینریِ در حال تحلیل، در درخت ساخت بسته‌های مشخص‌شده با گزینهٔ خط فرمان -S، در درخت ساخت سایر بسته‌هایی که حاوی فایل DEBIAN/shlibs یا DEBIAN/symbols هستند و در نهایت در دایرکتوری ریشه (root) بررسی می‌کند. اگر کتابخانه در هیچ‌یک از این دایرکتوری‌ها یافت نشود، این خطا صادر می‌گردد.

اگر کتابخانهٔ یافت‌نشده در یک دایرکتوری اختصاصی از همان بسته باشد، باید آن دایرکتوری را با -l اضافه کنید. اگر در بستهٔ باینری دیگری قرار دارد که در حال ساخت است، باید مطمئن شوید که فایل shlibs/symbols این بسته قبلاً ایجاد شده است و اگر آن هم در دایرکتوری اختصاصی است، -l حاوی دایرکتوری مناسب باشد.

کتابخانهٔ مورد نیاز برای binary توسط dpkg-shlibdeps در library-file یافت شده است، اما dpkg-shlibdeps نتوانسته است هیچ اطلاعات وابستگی برای آن کتابخانه پیدا کند. برای یافتن وابستگی، تلاش کرده است با کمک dpkg -S library-file کتابخانه را به یک بستهٔ دبیان نگاشت کند. سپس فایل‌های shlibs و symbols مربوطه را در /var/lib/dpkg/info/ و در درخت‌های ساخت بسته‌های مختلف (debian/*/DEBIAN/) بررسی کرده است.

این شکست می‌تواند ناشی از یک فایل shlibs یا symbols نامعتبر یا ناموجود در بستهٔ کتابخانه باشد. همچنین ممکن است زمانی رخ دهد که کتابخانه در همان بستهٔ منبع ساخته می‌شود و فایل‌های shlibs هنوز ایجاد نشده‌اند (که در این صورت باید debian/rules را اصلاح کنید تا پیش از فراخوانی dpkg-shlibdeps فایل‌های shlibs را بسازد). یک RPATH نادرست نیز می‌تواند منجر به یافتن کتابخانه تحت یک نام غیرکانونی شود (مثال: /usr/lib/openoffice.org/../lib/libssl.so.0.9.8 به‌جای /usr/lib/libssl.so.0.9.8) که به هیچ بسته‌ای مرتبط نیست. dpkg-shlibdeps با تلاش برای بازگشت به یک نام کانونی (با استفاده از realpath(3)) سعی می‌کند این مشکل را دور بزند، اما این روش ممکن است همیشه کارساز نباشد. همیشه بهتر است RPATH باینری را پاکسازی کنید تا از بروز مشکلات جلوگیری شود.

فراخوانی dpkg-shlibdeps در حالت پرگو (-v) اطلاعات بسیار بیشتری در مورد مکان‌هایی که برای یافتن اطلاعات وابستگی تلاش کرده است ارائه می‌دهد. اگر علت بروز این خطا را متوجه نمی‌شوید، این گزینه می‌تواند مفید باشد.

deb-substvars(5)، deb-shlibs(5)، deb-symbols(5)، dpkg-gensymbols(1).

2026-03-06 1.23.7-dirty