.\" Man page generated from reStructuredText .\" by the Docutils 0.22.4 manpage writer. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "ABIDIFF" "1" "1 مه 2026" "" "Libabigail" .SH "نام (NAME)" abidiff \- مقایسه واسط‌های باینری کاربردی (ABI) فایل‌های ELF .sp دستور abidiff واسط‌های باینری کاربردی (ABI) دو کتابخانه مشترک با فرمت ELF \% را با یکدیگر مقایسه می‌کند. این ابزار گزارش معناداری حاوی توصیف تفاوت‌های میان دو ABI تولید می‌کند. .sp این ابزار همچنین می‌تواند نمایش‌های متنی ABI دو فایل باینری ELF (تولیدشده توسط \fBabidw\fP) یا یک فایل باینری ELF را در برابر نمایش متنی یک فایل باینری ELF دیگر مقایسه کند. .sp جهت ارائه یک گزارش جامع از تغییرات ABI میان دو کتابخانه مشترک ورودی که شامل تغییرات مربوط به زیرنوع‌های توابع و متغیرها باشد، \fBabidiff\fP به‌طور پیش‌فرض از اطلاعات اشکال‌زدایی با فرمت DWARF \% (در صورت وجود) استفاده می‌کند؛ در غیر این صورت، واسط‌ها را با استفاده از اطلاعات اشکال‌زدایی در فرمت‌های CTF \% یا BTF \% (در صورت وجود) مقایسه می‌کند. در نهایت، اگر هیچ اطلاعات اشکال‌زدایی در این فرمت‌ها یافت نشود، فقط نمادهای ELF \% را در نظر می‌گیرد و اضافه یا حذف شدن آن‌ها را گزارش می‌کند. .sp این ابزار از کتابخانه libabigail برای تحلیل باینری و همچنین اطلاعات اشکال‌زدایی وابسته به آن استفاده می‌کند. در ادامه نحوه عملکرد کلی آن شرح داده شده است. .sp هنگامی که دستور اجرا می‌شود، فایل باینری و اطلاعات اشکال‌زدایی وابسته به آن خوانده و تحلیل می‌شوند. برای این منظور، libabigail به‌طور پیش‌فرض توضیحات مربوط به انواعی را تحلیل می‌کند که از طریق واسط‌های (توابع و متغیرها) قابل مشاهده در بیرون از واحد ترجمه (Translation Unit) خود در دسترس هستند. پس از اتمام این تحلیل، یک پیکره واسط باینری کاربردی (ABI Corpus) با در نظر گرفتن زیرمجموعه‌ای از انواع در دسترس از واسط‌های مرتبط با نمادهای ELF \% که توسط فایل باینری تعریف و صادر (Export) شده‌اند ساخته می‌شود. این پیکره نهایی ABI همان چیزی است که libabigail آن را به عنوان نماینده ABI باینری تحلیل‌شده در نظر می‌گیرد. .sp سپس libabigail قابلیت تولید نمایش‌های متنی از پیکره‌های ABI، مقایسه آن‌ها، تحلیل تغییراتشان و گزارش‌دهی درباره آن‌ها را دارد. .SH "خلاصه دستور (SYNOPSIS)" .INDENT 0.0 .INDENT 3.5 .sp .EX abidiff [گزینه‌ها] .EE .UNINDENT .UNINDENT .SH "محیط (ENVIRONMENT)" .sp ابزار abidiff دو فایل پیش‌فرض مشخصات مهارسازی (Suppression) \%<#\:suppr-spec-label> را بارگذاری کرده، محتوای آن‌ها را ادغام می‌کند و برای فیلتر کردن گزارش‌های تغییرات ABI که ممکن است از نظر کاربران مثبت کاذب تلقی شوند، به کار می‌گیرد. .INDENT 0.0 .IP \(bu 2 فایل سراسری پیش‌فرض مشخصات مهارسازی سیستم .sp مسیر آن توسط متغیر محیطی اختیاری LIBABIGAIL_DEFAULT_SYSTEM_SUPPRESSION_FILE تعیین می‌شود. اگر این متغیر محیطی تنظیم نشده باشد، abidiff تلاش می‌کند فایل مهارسازی $libdir/libabigail/libabigail\-default.abignore را بارگذاری کند. اگر این فایل موجود نباشد، هیچ فایل مشخصات مهارسازی سراسری سیستمی بارگذاری نمی‌شود. .IP \(bu 2 فایل پیش‌فرض مشخصات مهارسازی کاربر .sp مسیر آن توسط متغیر محیطی اختیاری LIBABIGAIL_DEFAULT_USER_SUPPRESSION_FILE تعیین می‌شود. اگر این متغیر محیطی تنظیم نشده باشد، abidiff تلاش می‌کند فایل مهارسازی $HOME/.abignore را بارگذاری کند. اگر این فایل موجود نباشد، هیچ مشخصات مهارسازی کاربری پیش‌فرضی بارگذاری نمی‌شود. .UNINDENT .SH "گزینه‌ها (OPTIONS)" .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 \fB\-\-add\-binaries1\fP <\fIbin1,bin2,bin3,..\fP> .sp برای هر یک از فایل‌های باینری جداشده با کاما که به عنوان آرگومان به این گزینه داده می‌شود، در صورتی که فایل باینری در پوشه مشخص‌شده توسط گزینه \fB\-\-added\-binaries\-dir1\fP پیدا شود، \fBabidiff\fP پیکره ABI آن باینری را بارگذاری کرده و به مجموعه‌ای از پیکره‌ها (موسوم به گروه پیکره ABI) که شامل اولین آرگومان \fBabidiff\fP است اضافه می‌کند. .sp سپس آن گروه پیکره ABI با دومین گروه پیکره داده‌شده به عنوان آرگومان به \fBabidiff\fP مقایسه می‌شود. .IP \(bu 2 \fB\-\-add\-binaries2\fP <\fIbin1,bin2,bin3,..\fP> .sp برای هر یک از فایل‌های باینری جداشده با کاما که به عنوان آرگومان به این گزینه داده می‌شود، در صورتی که فایل باینری در پوشه مشخص‌شده توسط گزینه \fB\-\-added\-binaries\-dir2\fP پیدا شود، \fBabidiff\fP پیکره ABI آن باینری را بارگذاری کرده و به مجموعه‌ای از پیکره‌ها (موسوم به گروه پیکره ABI) که شامل دومین آرگومان \fBabidiff\fP است اضافه می‌کند. .sp سپس آن گروه پیکره ABI با اولین گروه پیکره داده‌شده به عنوان آرگومان به \fBabidiff\fP مقایسه می‌شود. .IP \(bu 2 \fB\-\-added\-binaries\-dir1 | \-\-abd1\fP .sp این گزینه همراه با گزینه‌های \fB\-\-add\-binaries1\fP، \fB\-\-follow\-dependencies\fP و \fB\-\-list\-dependencies\fP به کار می‌رود. فایل‌های باینری ارجاع‌شده توسط این گزینه‌ها، در صورت یافت شدن در پوشه \fIadded\-binaries\-directory\-1\fP، به عنوان پیکره ABI بارگذاری شده و به اولین گروه پیکره ABI مورد استفاده در مقایسه افزوده می‌شوند. .IP \(bu 2 \fB\-\-added\-binaries\-dir2 | \-\-abd2\fP .sp این گزینه همراه با گزینه‌های \fB\-\-add\-binaries2\fP، \fB\-\-follow\-dependencies\fP و \fB\-\-list\-dependencies\fP به کار می‌رود. فایل‌های باینری ارجاع‌شده توسط این گزینه‌ها، در صورت یافت شدن در پوشه \fIadded\-binaries\-directory\-2\fP، به عنوان پیکره ABI بارگذاری شده و به دومین گروه پیکره ABI مورد استفاده در مقایسه افزوده می‌شوند. .IP \(bu 2 \fB\-\-added\-fns\fP .sp در گزارش حاصل از تفاوت‌های میان \fIfirst\-shared\-library\fP و \fIsecond\-shared\-library\fP، فقط توابع با تعریف سراسری را که به \fIsecond\-shared\-library\fP اضافه شده‌اند نمایش می‌دهد. .IP \(bu 2 \fB\-\-added\-vars\fP .sp در گزارش حاصل از تفاوت‌های میان \fIfirst\-shared\-library\fP و \fIsecond\-shared\-library\fP، فقط متغیرهای سراسری را که به \fIsecond\-shared\-library\fP اضافه (تعریف) شده‌اند نمایش می‌دهد. .IP \(bu 2 \fB\-\-allow\-non\-exported\-interfaces\fP .sp هنگام بررسی اطلاعات اشکال‌زدایی همراه با یک باینری، این ابزار توضیحات انواعی را که توسط واسط‌های (توابع و متغیرها) قابل مشاهده در بیرون از واحد ترجمه خود در دسترس هستند تحلیل می‌کند. پس از انجام این تحلیل، یک پیکره ABI تنها با در نظر گرفتن زیرمجموعه‌ای از انواع در دسترس از واسط‌های مرتبط با نمادهای ELF \% که توسط فایل باینری تعریف و صادر شده‌اند ساخته می‌شود. این همان پیکره‌های نهایی ABI است که توسط این ابزار مقایسه می‌شوند. .sp اما اشکال این رویکرد در آن است که تحلیل تمام واسط‌های قابل مشاهده از بیرون واحد ترجمه می‌تواند حجم بسیار زیادی از داده تولید کند، به‌ویژه زمانی که آن باینری‌ها برنامه‌های کاربردی باشند (در مقایسه با کتابخانه‌های مشترک). یک نمونه از این برنامه‌ها، هسته لینوکس \% است. تحلیل چنین پیکره‌های عظیمی از ABI می‌تواند به‌شدت کند باشد. .sp با این حال، در حضور یک باینری با «اندازه متوسط»، می‌توان با استفاده از این گزینه به libabigail اجازه داد تمام واسط‌های قابل مشاهده از بیرون واحد ترجمه را تحلیل کند. .sp توجه داشته باشید که این گزینه به‌طور پیش‌فرض فعال است، مگر اینکه در حال تحلیل هسته لینوکس \% باشیم. .IP \(bu 2 \fB\-\-btf\fP .sp هنگام مقایسه باینری‌ها، اطلاعات ABI را از اطلاعات اشکال‌زدایی BTF \% (در صورت وجود) استخراج می‌کند. .IP \(bu 2 \fB\-\-changed\-fns\fP .sp در گزارش حاصل از تفاوت‌های میان \fIfirst\-shared\-library\fP و \fIsecond\-shared\-library\fP، فقط تغییرات در زیرنوع‌های توابع سراسری تعریف‌شده در \fIfirst\-shared\-library\fP را نمایش می‌دهد. .IP \(bu 2 \fB\-\-changed\-vars\fP .sp در گزارش حاصل از تفاوت‌های میان \fIfirst\-shared\-library\fP و \fIsecond\-shared\-library\fP، فقط تغییرات در زیرنوع‌های متغیرهای سراسری تعریف‌شده در \fIfirst\-shared\-library\fP را نمایش می‌دهد. .IP \(bu 2 \fB\-\-ctf\fP .sp هنگام مقایسه باینری‌ها، اطلاعات ABI را از اطلاعات اشکال‌زدایی CTF \% (در صورت وجود) استخراج می‌کند. .IP \(bu 2 \fB\-\-debug\-info\-dir1 | \-\-d1\fP <\fIdi\-path1\fP> .sp برای مواردی که اطلاعات اشکال‌زدایی \fIfirst\-shared\-library\fP در یک فایل جداگانه قرار دارد، به \fBabidiff\fP می‌گوید که آن فایل اطلاعات اشکال‌زدایی مجزا را در کجا پیدا کند. .sp توجه داشته باشید که \fIdi\-path\fP باید به پوشه ریشه‌ای اشاره کند که اطلاعات اشکال‌زدایی به صورت درختی در زیر آن مرتب شده است. در سیستم‌های مبتنی بر Red Hat، این پوشه معمولاً \fB/usr/lib/debug\fP است. .sp این گزینه را می‌توان چندین بار با پوشه‌های ریشه مختلف مشخص کرد. در این حالت، \fBabidiff\fP برای یافتن اطلاعات اشکال‌زدایی مجزای \fIfirst\-shared\-library\fP به‌طور بالقوه تمام آن پوشه‌های ریشه را جستجو می‌کند. .sp همچنین توجه داشته باشید که این گزینه برای اطلاعات اشکال‌زدایی مجزایی که توسط مدیر بسته سیستم شما نصب شده‌اند اجباری نیست، زیرا در آن صورت \fBabidiff\fP می‌داند که آن را کجا پیدا کند. .IP \(bu 2 \fB\-\-debug\-info\-dir2 | \-\-d2\fP <\fIdi\-path2\fP> .sp مانند \fB\-\-debug\-info\-dir1\fP، این گزینه به \fBabidiff\fP می‌گوید که فایل اطلاعات اشکال‌زدایی مجزا را برای فایل \fIsecond\-shared\-library\fP در کجا پیدا کند. .sp این گزینه را می‌توان چندین بار با پوشه‌های ریشه مختلف ارائه کرد. در این حالت، \fBabidiff\fP به دنبال اطلاعات اشکال‌زدایی مجزای \fIsecond\-shared\-library\fP در تمام آن پوشه‌های ریشه خواهد گشت. .IP \(bu 2 \fB\-\-debug\-self\-comparison\fP .sp در این حالت، هنگام مقایسه یک باینری با خودش در شرایط خاص، برای انواعی که یکسان‌سازی نوع (Type Canonicalization) روی آن‌ها ناموفق بوده است، پیام‌های خطا صادر می‌شود. .sp هنگام مقایسه یک باینری با خودش، انواع متعارف (Canonical Types) باینری دوم باید (تا حد ممکن) با انواع متعارف باینری اول برابر باشند. اگر در این حالت مغایرتی تشخیص داده شود، یک سیگنال توقف (Abort) ارسال شده و فرآیند متوقف می‌گردد. این گزینه باید هنگام اجرای ابزار در یک دیباگر، برای مقاصد عیب‌یابی مورد استفاده قرار گیرد. .sp این یک گزینه اختیاری برای اشکال‌زدایی و بررسی سلامت است. برای فعال‌سازی آن، بسته libabigail باید با گزینه پیکربندی \-\-enable\-debug\-self\-comparison کامپایل شود. .IP \(bu 2 \fB\-\-debug\-tc\fP .sp در این حالت، فرآیند یکسان‌سازی نوع (Type Canonicalization) تحت نظارت و بررسی دقیق قرار می‌گیرد. اساساً در طول یکسان‌سازی نوع، هر مقایسه نوع دو بار انجام می‌شود: یک بار در حالت ساختاری (مقایسه عضوبه‌عضو تمام زیرنوع‌ها) و یک بار با استفاده از مقایسه متعارف (Canonical). هر دو مقایسه باید نتیجه یکسانی داشته باشند. در غیر این صورت، یک سیگنال توقف (Abort) ارسال می‌شود و می‌توان فرآیند را اشکال‌زدایی کرد تا مشخص شود چرا دو نوع مقایسه نتایج متفاوتی داده‌اند. .sp این یک گزینه اختیاری برای اشکال‌زدایی و بررسی سلامت است. برای فعال‌سازی آن، بسته libabigail باید با گزینه پیکربندی \-\-enable\-debug\-type\-canonicalization کامپایل شود. .IP \(bu 2 \fB\-\-deleted\-fns\fP .sp در گزارش حاصل از تفاوت‌های میان \fIfirst\-shared\-library\fP و \fIsecond\-shared\-library\fP، فقط توابع با تعریف سراسری را که از \fIfirst\-shared\-library\fP حذف شده‌اند نمایش می‌دهد. .IP \(bu 2 \fB\-\-deleted\-vars\fP .sp در گزارش حاصل از تفاوت‌های میان \fIfirst\-shared\-library\fP و \fIsecond\-shared\-library\fP، فقط متغیرهای با تعریف سراسری را که از \fIfirst\-shared\-library\fP حذف شده‌اند نمایش می‌دهد. .IP \(bu 2 \fB\-\-drop\fP <\fIregex\fP> .sp هنگام خواندن فایل‌های ورودی ELF شامل \fIfirst\-shared\-library\fP و \fIsecond\-shared\-library\fP، توابع و متغیرهای دارای تعریف سراسری که نام آن‌ها با عبارت باقاعده \fIregex\fP مطابقت دارد را نادیده می‌گیرد (حذف می‌کند). در نتیجه، هیچ تغییری شامل این توابع یا متغیرها در گزارش تفاوت صادر نخواهد شد. .IP \(bu 2 \fB\-\-drop\-fn\fP <\fIregex\fP> .sp هنگام خواندن فایل‌های ورودی ELF شامل \fIfirst\-shared\-library\fP و \fIsecond\-shared\-library\fP، توابع دارای تعریف سراسری که نام آن‌ها با عبارت باقاعده \fIregex\fP مطابقت دارد را نادیده می‌گیرد. در نتیجه، هیچ تغییری شامل این توابع در گزارش تفاوت صادر نخواهد شد. .IP \(bu 2 \fB\-\-drop\-var\fP <\fIregex\fP> .sp هنگام خواندن فایل‌های ورودی ELF شامل \fIfirst\-shared\-library\fP و \fIsecond\-shared\-library\fP، متغیرهای دارای تعریف سراسری که با عبارت باقاعده \fIregex\fP مطابقت دارند را نادیده می‌گیرد. .IP \(bu 2 \fB\-\-drop\-private\-types\fP .sp این گزینه همراه با گزینه‌های \fB\-\-headers\-dir1\fP، \fBheader\-file1\fP، \fBheader\-file2\fP و \fB\-\-headers\-dir2\fP به کار می‌رود. با فعال بودن این گزینه، انواعی که در هدرها تعریف \fIنشده‌اند\fP به‌طور کامل از نمایش درونی ساخته‌شده توسط Libabigail برای نمایش ABI حذف می‌شوند. بنابراین، نیازی به فیلتر کردن آن‌ها از گزارش نهایی تغییرات ABI نیست زیرا اصلاً در نمایش درونی Libabigail وجود نخواهند داشت. .sp اما بدون این گزینه، آن انواع خصوصی در نمایش درونی نگهداری شده و بعداً از گزارش فیلتر می‌شوند. .sp بنابراین این گزینه به‌طور بالقوه مصرف حافظه Libabigail را کاهش می‌دهد. کاربرد اصلی آن بهینه‌سازی مصرف حافظه ابزار روی باینری‌هایی با تعداد زیادی انواع تعریف‌شده و صادرشده عمومی است. .IP \(bu 2 \fB\-\-dump\-diff\-tree\fP .UNINDENT .INDENT 0.0 .INDENT 3.5 پس از گزارش تفاوت، یک نمایش متنی از درخت گره‌های تفاوت (Diff Nodes Tree) را که توسط موتور مقایسه برای نمایش توابع و متغیرهای تغییریافته استفاده شده است در خروجی خطا (stderr) صادر می‌کند. این نمایش برای مقاصد اشکال‌زدایی است. توجه داشته باشید که این درخت تفاوت فقط به توابع و متغیرهایی مربوط می‌شود که دارای تغییراتی در زیرنوع‌های خود هستند. توابع و متغیرهای اضافه‌شده یا حذف‌شده هیچ درخت گره تفاوتی وابسته به خود ندارند. .UNINDENT .UNINDENT .INDENT 0.0 .IP \(bu 2 \fB\-\-exported\-interfaces\-only\fP .sp به‌طور پیش‌فرض، هنگام بررسی اطلاعات اشکال‌زدایی همراه با یک باینری، این ابزار توضیحات انواعی را تحلیل می‌کند که توسط واسط‌های (توابع و متغیرها) قابل مشاهده در بیرون از واحد ترجمه خود در دسترس هستند. پس از انجام آن تحلیل، یک پیکره ABI تنها با در نظر گرفتن زیرمجموعه‌ای از انواع در دسترس از واسط‌های مرتبط با نمادهای ELF \% که توسط فایل باینری تعریف و صادر شده‌اند ساخته می‌شود. این همان پیکره‌های نهایی ABI است که توسط این ابزار مقایسه می‌شوند. .sp اما مشکل این رویکرد آن است که تحلیل تمام واسط‌های قابل مشاهده از خارج واحد ترجمه می‌تواند داده‌های بسیار زیادی تولید کند، به‌ویژه زمانی که آن باینری‌ها برنامه‌های کاربردی باشند (در مقایسه با کتابخانه‌های مشترک). یک نمونه از این برنامه‌ها هسته لینوکس \% است. تحلیل چنین پیکره‌های عظیمی از ABI می‌تواند به‌شدت کند باشد. .sp برای کاهش این مشکل عملکردی، این گزینه به libabigail امکان می‌دهد فقط انواعی را تحلیل کند که از طریق واسط‌های مرتبط با نمادهای تعریف‌شده و صادرشده ELF \% در دسترس هستند. .sp توجه داشته باشید که این گزینه هنگام تحلیل هسته لینوکس \% به‌طور پیش‌فرض فعال است؛ در غیر این صورت، به‌طور پیش‌فرض غیرفعال است. .IP \(bu 2 \fB\-\-fail\-no\-debug\-info\fP .sp اگر هیچ اطلاعات اشکال‌زدایی یافت نشود، این گزینه موجب شکست اجرای برنامه (خروج با خطا) می‌شود. در غیر این صورت، بدون این گزینه، برنامه تلاش می‌کند ویژگی‌های باینری‌ها را که به اطلاعات اشکال‌زدایی وابسته نیستند (مانند ویژگی‌های خالص ELF) مقایسه کند. .IP \(bu 2 \fB\-\-follow\-dependencies | \-\-fdeps\fP .sp برای هر وابستگی آرگومان اول \fBabidiff\fP، اگر در پوشه مشخص‌شده با گزینه \fB\-\-added\-binaries\-dir1\fP یافت شود، یک پیکره ABI از آن وابستگی ایجاد کرده و به مجموعه‌ای از پیکره‌ها (موسوم به گروه پیکره ABI) که شامل اولین آرگومان \fBabidiff\fP است اضافه می‌کند. .sp به‌همین ترتیب، برای هر وابستگی آرگومان دوم \fBabidiff\fP، اگر در پوشه مشخص‌شده با گزینه \fB\-\-added\-binaries\-dir2\fP یافت شود، یک پیکره ABI از آن وابستگی ایجاد کرده و به گروه پیکره ABI که شامل دومین آرگومان \fBabidiff\fP است اضافه می‌کند. .sp سپس این دو گروه پیکره ABI در برابر یکدیگر مقایسه می‌شوند. .sp به عبارت دیگر، این گزینه باعث می‌شود \fBabidiff\fP مجموعه ورودی اول و وابستگی‌های آن را در برابر مجموعه ورودی دوم و وابستگی‌های آن مقایسه کند. .IP \(bu 2 \fB\-\-harmless\fP .sp در گزارش تفاوت، فقط تغییرات بی‌ضرر (Harmless) \%<#\:harmlesschangeconcept-label> را نمایش می‌دهد. به‌طور پیش‌فرض، تغییرات بی‌ضرر از گزارش تفاوت فیلتر می‌شوند تا شلوغی متن به حداقل برسد و شانس تشخیص مشکلات واقعی ABI افزایش یابد. .IP \(bu 2 \fB\-\-headers\-dir1 | \-\-hd1\fP .sp مشخص می‌کند که فایل‌های هدر عمومی اولین کتابخانه مشترک (یا به‌طور کلی باینری) که ابزار باید مد نظر قرار دهد در کجا قرار دارند. بدین ترتیب ابزار تغییرات ABI مربوط به انواعی را که در هدرهای عمومی تعریف نشده‌اند فیلتر خواهد کرد. .sp توجه داشته باشید که می‌توان چندین پوشه هدر عمومی را برای اولین کتابخانه مشترک مشخص کرد. در این صورت، گزینه \fB\-\-headers\-dir1\fP باید چندین بار در خط فرمان درج شود، همانند مثال زیر: .INDENT 2.0 .INDENT 3.5 .sp .EX $ abidiff \-\-headers\-dir1 /some/path \e \-\-headers\-dir1 /some/other/path \e binary\-version\-1 binary\-version\-2 .EE .UNINDENT .UNINDENT .IP \(bu 2 \fB\-\-headers\-dir2 | \-\-hd2\fP .sp مشخص می‌کند که فایل‌های هدر عمومی دومین کتابخانه مشترک که ابزار باید مد نظر قرار دهد در کجا قرار دارند. بدین ترتیب ابزار تغییرات ABI مربوط به انواعی را که در هدرهای عمومی تعریف نشده‌اند فیلتر خواهد کرد. .sp توجه داشته باشید که می‌توان چندین پوشه هدر عمومی را برای دومین کتابخانه مشترک مشخص کرد. در این صورت گزینه \fB\-\-headers\-dir2\fP باید چندین بار درج شود، مانند مثال زیر: .INDENT 2.0 .INDENT 3.5 .sp .EX $ abidiff \-\-headers\-dir2 /some/path \e \-\-headers\-dir2 /some/other/path \e binary\-version\-1 binary\-version\-2 .EE .UNINDENT .UNINDENT .IP \(bu 2 \fB\-\-header\-file1 | \-\-hf1\fP .sp مشخص می‌کند که یک هدر عمومی از اولین کتابخانه مشترک که ابزار باید مد نظر قرار دهد در کجا قرار دارد. بدین ترتیب ابزار تغییرات ABI انواعی را که در هدرهای عمومی تعریف نشده‌اند فیلتر خواهد کرد. .IP \(bu 2 \fB\-\-header\-file2 | \-\-hf2\fP .sp مشخص می‌کند که یک هدر عمومی از دومین کتابخانه مشترک که ابزار باید مد نظر قرار دهد در کجا قرار دارد. بدین ترتیب ابزار تغییرات ABI انواعی را که در هدرهای عمومی تعریف نشده‌اند فیلتر خواهد کرد. .IP \(bu 2 \fB\-\-help | \-h\fP .sp نمایش یک راهنمای کوتاه درباره دستور و خروج. .IP \(bu 2 \fB\-\-ignore\-soname\fP .sp چشم‌پوشی از تفاوت‌های موجود در SONAME هنگام انجام مقایسه. .IP \(bu 2 \fB\-\-impacted\-interfaces\fP .sp هنگام نمایش تغییرات برگ (Leaf changes)، این گزینه به abidiff دستور می‌دهد فهرست واسط‌های تحت تأثیر قرار گرفته را نشان دهد. بنابراین این گزینه باید در کنار گزینه \fB\-\-leaf\-changes\-only\fP استفاده شود، در غیر این صورت نادیده گرفته می‌شود. .IP \(bu 2 \fB\-\-keep\fP <\fIregex\fP> .sp هنگام خواندن فایل‌های ورودی ELF شامل \fIfirst\-shared\-library\fP و \fIsecond\-shared\-library\fP، توابع و متغیرهای دارای تعریف سراسری را که نامشان با عبارت باقاعده \fIregex\fP مطابقت دارد نگه می‌دارد. تمام توابع و متغیرهای دیگر کنار گذاشته می‌شوند و در گزارش تفاوت نهایی ظاهر نخواهند شد. .IP \(bu 2 \fB\-\-keep\-fn\fP <\fIregex\fP> .sp هنگام خواندن فایل‌های ورودی ELF شامل \fIfirst\-shared\-library\fP و \fIsecond\-shared\-library\fP، توابع دارای تعریف سراسری را که نامشان با عبارت باقاعده \fIregex\fP مطابقت دارد نگه می‌دارد. سایر توابع کنار گذاشته می‌شوند و در گزارش تفاوت نهایی ظاهر نخواهند شد. .IP \(bu 2 \fB\-\-keep\-var\fP <\fIregex\fP> .sp هنگام خواندن فایل‌های ورودی ELF شامل \fIfirst\-shared\-library\fP و \fIsecond\-shared\-library\fP، متغیرهای دارای تعریف سراسری را که نامشان با عبارت باقاعده \fIregex\fP مطابقت دارد نگه می‌دارد. سایر متغیرها کنار گذاشته می‌شوند و در گزارش تفاوت نهایی ظاهر نخواهند شد. .IP \(bu 2 \fB\-\-kmi\-whitelist | \-w\fP <\fIpath\-to\-whitelist\fP> .sp هنگام تحلیل یک فایل باینری هسته لینوکس، این گزینه به فهرست سفید نام نمادهای ELF توابع و متغیرهایی اشاره می‌کند که ABI آن‌ها باید مد نظر قرار گیرد. به این فهرست سفید، «فهرست سفید واسط ماژول هسته» (Kernel Module Interface white list یا KMI) گفته می‌شود. علت این نام‌گذاری این است که برای هسته، ما از واژه \fBABI\fP استفاده نمی‌کنیم؛ بلکه درباره واسط میان هسته و ماژول‌های آن صحبت می‌کنیم؛ از این رو اصطلاح \fBKMI\fP به جای \fBABI\fP به کار می‌رود. .sp هر تابع یا متغیر دیگری که نماد ELF آن در این فهرست سفید موجود نباشد، توسط این ابزار در نظر گرفته نخواهد شد. .sp اگر این گزینه مشخص نشود \-\- یعنی هیچ فهرست سفیدی ارائه نشود \-\- کل KMI، یعنی مجموعه تمام توابع و متغیرهای سراسری تعریف‌شده و صادرشده به صورت عمومی توسط باینری‌های هسته لینوکس، مد نظر قرار خواهد گرفت. .IP \(bu 2 \fB\-\-leaf\-changes\-only|\-l\fP فقط تغییرات برگ را نشان می‌دهد و گزارش تحلیل اثرگذاری را نمایش نمی‌دهد. این گزینه متضمن گزینه \fB\-\-redundant\fP است. .sp خروجی معمول abidiff هنگام مقایسه دو باینری شبیه به این است: .INDENT 2.0 .INDENT 3.5 .sp .EX $ abidiff libtest\-v0.so libtest\-v1.so Functions changes summary: 0 Removed, 1 Changed, 0 Added function Variables changes summary: 0 Removed, 0 Changed, 0 Added variable 1 function with some indirect sub\-type change: [C]\(aqfunction void fn(C&)\(aq at test\-v1.cc:13:1 has some indirect sub\-type changes: parameter 1 of type \(aqC&\(aq has sub\-type changes: in referenced type \(aqstruct C\(aq at test\-v1.cc:7:1: type size hasn\(aqt changed 1 data member change: type of \(aqleaf* C::m0\(aq changed: in pointed to type \(aqstruct leaf\(aq at test\-v1.cc:1:1: type size changed from 32 to 64 bits 1 data member insertion: \(aqchar leaf::m1\(aq, at offset 32 (in bits) at test\-v1.cc:4:1 $ .EE .UNINDENT .UNINDENT .sp بنابراین در این مثال، گزارش اطلاعاتی را درباره چگونگی دسترسی به تغییر درج عضو داده "struct leaf" از تابع "void fn(C&)" ارائه می‌دهد. به عبارت دیگر، گزارش نه تنها تغییر عضو داده روی "struct leaf" را نشان می‌دهد، بلکه تأثیر آن تغییر بر روی تابع "void fn(C&)" را نیز نمایش می‌دهد. .sp در اصطلاح abidiff، به تغییر روی "struct leaf" تغییر برگ (Leaf Change) گفته می‌شود. بنابراین گزینه‌های \fB\-\-leaf\-changes\-only \-\-impacted\-interfaces\fP فقط تغییر برگ را نمایش می‌دهند. خروجی به این صورت خواهد بود: .INDENT 2.0 .INDENT 3.5 .sp .EX $ abidiff \-l libtest\-v0.so libtest\-v1.so \(aqstruct leaf\(aq changed: type size changed from 32 to 64 bits 1 data member insertion: \(aqchar leaf::m1\(aq, at offset 32 (in bits) at test\-v1.cc:4:1 one impacted interface: function void fn(C&) $ .EE .UNINDENT .UNINDENT .sp توجه کنید که گزارش با نمایش فهرستی از واسط‌های تحت تأثیر تغییر برگ به پایان می‌رسد. .sp حال اگر مایل به مشاهده آن فهرست از واسط‌های تحت تأثیر نیستید، می‌توانید به سادگی از گزینه \fB\-\-impacted\-interface\fP استفاده نکنید. در هر صورت، توضیحات بیشتر درباره این گزینه در ادامه آمده است. .IP \(bu 2 \fB\-\-list\-dependencies | \-\-ldeps\fP .sp این گزینه تمام وابستگی‌های آرگومان‌های ورودی \fBabidiff\fP را که در پوشه‌های مشخص‌شده توسط گزینه‌های \fB\-\-added\-binaries\-dir1\fP و \fB\-\-added\-binaries\-dir2\fP یافت می‌شوند، فهرست می‌کند. .IP \(bu 2 \fB\-\-no\-added\-syms\fP .sp در گزارش حاصل از تفاوت‌های میان \fIfirst\-shared\-library\fP و \fIsecond\-shared\-library\fP، توابع یا متغیرهای اضافه‌شده را نمایش نمی‌دهد. نمادهای ELF توابع یا متغیرهای اضافه‌شده را نیز نمایش نمی‌دهد. تمام انواع دیگر تغییرات نمایش داده می‌شوند مگر اینکه صریحاً توسط سایر گزینه‌ها در خط فرمان منع شده باشند. .IP \(bu 2 \fB\-\-no\-assume\-odr\-for\-cplusplus\fP .sp هنگام تحلیل یک باینری تولیدشده از کد C++ با استفاده از اطلاعات اشکال‌زدایی DWARF \%، کتابخانه libabigail قاعده یک تعریف (One Definition Rule یا ODR) \% را برای افزایش سرعت تحلیل فرض می‌گیرد. در این حالت، هنگامی که چند نوع دارای نام یکسان در باینری باشند، فرض می‌شود که همگی برابر هستند. .sp این گزینه آن فرض را غیرفعال کرده و به libabigail دستور می‌دهد تا انواع را واقعاً با یکدیگر مقایسه کند تا برابری آن‌ها مشخص گردد. .IP \(bu 2 \fB\-\-no\-architecture\fP .sp هنگام مقایسه واسط‌های کاربردی باینری (ABI)، معماری سیستم را مد نظر قرار نمی‌دهد. .IP \(bu 2 \fB\-\-no\-change\-categorization | \-x\fP .sp این گزینه دسته‌بندی تغییرات به تغییرات بی‌ضرر (Harmless) و زیان‌آور (Harmful) را غیرفعال می‌کند. توجه داشته باشید که این دسته‌بندی پیش‌نیاز فیلتر کردن تغییرات است؛ بنابراین این گزینه آن فیلترسازی را نیز غیرفعال می‌سازد. هدف از این گزینه، افزایش سرعت اجرای برنامه در مواردی است که گراف تغییرات بسیار بزرگ بوده و کاربر صرفاً علاقه‌مند به بررسی تغییرات گره‌های برگ بدون توجه به تأثیر بالقوه آن‌ها بر واسط‌ها باشد. در چنین حالتی، این گزینه معمولاً در کنار گزینه \fB\-\-leaf\-changes\-only\fP استفاده می‌شود. .IP \(bu 2 \fB\-\-no\-corpus\-path\fP .sp ویژگی مسیر (path attribute) را برای پیکره ABI صادر نمی‌کند. .IP \(bu 2 \fB\-\-no\-default\-suppression\fP .sp فایل‌های پیش‌فرض مشخصات مهارسازی (Suppression) را بارگذاری نمی‌کند. .IP \(bu 2 \fB\-\-no\-harmful\fP .sp در گزارش تفاوت، تغییرات زیان‌آور (Harmful) \%<#\:harmfulchangeconcept-label> را نمایش نمی‌دهد. به‌طور پیش‌فرض، فقط تغییرات زیان‌آور در گزارش تفاوت نمایش داده می‌شوند. .IP \(bu 2 \fB\-\-no\-leverage\-dwarf\-factorization\fP .sp هنگام تحلیل باینری‌ای که اطلاعات اشکال‌زدایی DWARF \% آن توسط ابزار DWZ \% پردازش شده است، فرض بر این است که اطلاعات نوع از قبل فاکتورگیری شده‌اند. این زمینه توسط libabigail برای انجام برخی بهینه‌سازی‌های سرعتی به کار گرفته می‌شود. .sp این گزینه آن بهینه‌سازی‌ها را غیرفعال می‌سازد. .IP \(bu 2 \fB\-\-no\-linkage\-name\fP .sp در گزارش خروجی، نام‌های پیوند (Linkage Names) توابع یا متغیرهای اضافه‌شده، حذف‌شده یا تغییریافته را نمایش نمی‌دهد. .IP \(bu 2 \fB\-\-no\-linux\-kernel\-mode\fP .sp بدون این گزینه، اگر abidiff تشخیص دهد که باینری‌های مورد بررسی باینری‌های هسته لینوکس هستند (یا vmlinux یا ماژول‌ها)، فقط توابع و متغیرهایی را در نظر می‌گیرد که نمادهای ELF آن‌ها در بخش‌های __ksymtab و __ksymtab_gpl فهرست شده باشند. .sp با این گزینه، abidiff باینری را به عنوان یک باینری ELF غیرویژه در نظر می‌گیرد و بنابراین توابع و متغیرهایی را که بر اساس مفهوم ELF تعریف و صادر شده‌اند بررسی می‌کند. .IP \(bu 2 \fB\-\-no\-redundant\fP .sp در گزارش تفاوت، تغییرات تکراری (Redundant) را نمایش \fIنمی‌دهد\fP. یک تغییر تکراری تغییری است که در جای دیگری از گزارش نمایش داده شده است. این گزینه به‌طور پیش‌فرض فعال است. .IP \(bu 2 \fB\-\-no\-show\-locs\fP .UNINDENT .INDENT 0.0 .INDENT 3.5 اطلاعات مربوط به اینکه نوع مورد نظر در کجای \fIsecond shared library\fP تغییر یافته است را نمایش نمی‌دهد. .UNINDENT .UNINDENT .INDENT 0.0 .IP \(bu 2 \fB\-\-no\-show\-relative\-offset\-changes\fP .sp بدون این گزینه، هنگامی که آفست یک عضو داده تغییر می‌کند، گزارش تغییرات علاوه بر ذکر آفست قدیم و جدید، مشخص می‌کند که عضو داده به چه میزان (چند بیت) تغییر کرده است. با این گزینه، این تفاوت بیتی نسبی نمایش داده نمی‌شود. .IP \(bu 2 \fB\-\-no\-unreferenced\-symbols\fP .sp در گزارش خروجی، اطلاعات تغییرات مربوط به نمادهای توابع و متغیرهایی را که توسط هیچ اطلاعات اشکال‌زدایی ارجاع داده نشده‌اند نمایش نمی‌دهد. توجه داشته باشید که برای این نمادهای ارجاع‌نشده، اطلاعات تغییرات نمایش‌داده‌شده صرفاً شامل نمادهای اضافه‌شده یا حذف‌شده است. .IP \(bu 2 \fB\-\-non\-reachable\-types|\-t\fP .sp تحلیل و صدور گزارش‌های تغییرات را برای تمام انواع باینری، شامل انواعی که از طریق توابع و متغیرهای سراسری در دسترس نیستند، انجام می‌دهد. .sp این گزینه ممکن است منجر به افت شدید عملکرد شود زیرا تعداد انواع تحلیل‌شده می‌تواند بسیار زیاد باشد. با این حال، اگر همراه با گزینه‌های \fB\-\-headers\-dir{1,2}\fP و/یا \fBheader\-file{1,2}\fP استفاده شود، انواع غیرقابل‌دسترس اضافی تحلیل‌شده به انواعی که در فایل‌های هدر عمومی تعریف شده‌اند محدود می‌شوند و در نتیجه افت عملکرد در حد قابل قبولی باقی می‌ماند. .sp همچنین، استفاده از این گزینه در کنار مشخصات مهارسازی (با استفاده از گزینه \fB\-\-suppressions\fP) می‌تواند به کنترل تعداد انواع تحلیل‌شده (و افت احتمالی کارایی) کمک کند. .sp توجه داشته باشید که بدون این گزینه، فقط انواعی که از توابع و متغیرهای سراسری در دسترس هستند تحلیل می‌شوند؛ بنابراین ابزار تغییرات را فقط روی این انواع در دسترس تشخیص داده و گزارش می‌کند. .IP \(bu 2 \fB\-\-redundant\fP .sp در گزارش تفاوت، تغییرات تکراری را نمایش می‌دهد. یک تغییر تکراری، تغییری است که در جای دیگری از گزارش نیز نمایش داده شده است. .IP \(bu 2 \fB\-\-show\-bits\fP .sp نمایش اندازه‌ها و آفست‌ها بر حسب بیت، نه بایت. این گزینه به‌طور پیش‌فرض فعال است. .IP \(bu 2 \fB\-\-show\-bytes\fP .sp نمایش اندازه‌ها و آفست‌ها بر حسب بایت، نه بیت. به‌طور پیش‌فرض، اندازه‌ها و آفست‌ها بر حسب بیت نمایش داده می‌شوند. .IP \(bu 2 \fB\-\-show\-dec\fP .sp نمایش اندازه‌ها و آفست‌ها در مبنای ده‌دهی (Decimal). این گزینه به‌طور پیش‌فرض فعال است. .IP \(bu 2 \fB\-\-show\-hex\fP .sp نمایش اندازه‌ها و آفست‌ها در مبنای شانزده‌شانزدهی (Hexadecimal). .IP \(bu 2 \fB\-\-stat\fP .sp به جای نمایش تفاوت‌های تفصیلی ABI میان \fIfirst\-shared\-library\fP و \fIsecond\-shared\-library\fP، صرفاً برخی آمارهای خلاصه درباره این تفاوت‌ها را نمایش می‌دهد. .IP \(bu 2 \fB\-\-stats\fP .sp صدور آمار درباره موارد گوناگون درونی برنامه. .IP \(bu 2 \fB\-\-suppressions | \-\-suppr\fP <\fIpath\-to\-suppressions\fP> .sp استفاده از یک فایل مشخصات مهارسازی \%<#\:suppr-spec-label> واقع در \fIpath\-to\-suppressions\fP. توجه داشته باشید که این گزینه می‌تواند چندین بار در خط فرمان درج شود. در این صورت، تمام فایل‌های مشخصات مهارسازی ارائه‌شده مد نظر قرار خواهند گرفت. .sp لطفاً توجه داشته باشید که به‌طور پیش‌فرض، در صورت عدم ارائه این گزینه، فایل‌های پیش‌فرض مشخصات مهارسازی بارگذاری می‌شوند. .IP \(bu 2 \fB\-\-symtabs\fP .sp فقط جدول‌های نمادهای \fIfirst\-shared\-library\fP و \fIsecond\-shared\-library\fP را نمایش می‌دهد. .IP \(bu 2 \fB\-\-verbose\fP .sp صدور گزارش‌های پرجزئیات (Verbose) درباره روند انجام کارهای گوناگون درونی. .IP \(bu 2 \fB\-\-version | \-v\fP .sp نمایش نسخه برنامه و خروج. .UNINDENT .UNINDENT .UNINDENT .SH "مقادیر بازگشتی (RETURN VALUES)" .sp کد خروج دستور \fBabidiff\fP در صورتی که ABI باینری‌های مورد مقایسه یکسان باشند برابر با 0 است، و در صورتی که تفاوت داشته باشند یا ابزار با خطایی مواجه شود، عددی غیر صفر خواهد بود. .sp در حالت دوم، کد خروج یک فیلد بیتی ۸ بیتی است که در آن هر بیت دارای معنای ویژه‌ای است. .sp بیت اول با مقدار عددی 1 و به نام \fBABIDIFF_ERROR\fP، بیانگر رخ دادن یک خطا است. .sp بیت دوم با مقدار عددی 2 و به نام \fBABIDIFF_USAGE_ERROR\fP، بیانگر وجود خطا در نحوه فراخوانی ابزار توسط کاربر است. این بیت برای نمونه زمانی فعال می‌شود که کاربر ابزار را با یک گزینه خط فرمان ناشناخته، یا تعداد یا آرگومان‌های اشتباه فراخوانی کرده باشد. اگر این بیت تنظیم شود، بیت \fBABIDIFF_ERROR\fP نیز باید تنظیم شده باشد. .sp بیت سوم با مقدار عددی 4 و به نام \fBABIDIFF_ABI_CHANGE\fP، بیانگر تفاوت در ABI باینری‌های مورد مقایسه است. .sp بیت چهارم با مقدار عددی 8 و به نام \fBABIDIFF_ABI_INCOMPATIBLE_CHANGE\fP، به این معنی است که ABI باینری‌های مورد مقایسه به صورتی ناسازگار دچار تفاوت شده‌اند. اگر این بیت تنظیم شود، بیت \fBABIDIFF_ABI_CHANGE\fP نیز باید حتماً تنظیم شده باشد. اگر بیت \fBABIDIFF_ABI_CHANGE\fP تنظیم شود اما بیت \fBABIDIFF_INCOMPATIBLE_CHANGE\fP تنظیم \fIنشده باشد\fP، به این معناست که واسط‌های باینری کاربردی مقایسه‌شده ممکن است سازگار یا ناسازگار باشند. در چنین حالتی، یک بازبین انسانی باید تغییرات ABI را بررسی کند تا درباره سازگار یا ناسازگار بودن آن‌ها تصمیم بگیرد. .sp توجه داشته باشید که در حال حاضر، تنها انواع خاصی از تغییرات ABI منجر به فعال شدن فلگ \fBABIDIFF_ABI_INCOMPATIBLE_CHANGE\fP می‌شوند. این تغییرات ABI عبارتند از: .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP \(bu 2 حذف نماد یک تابع یا متغیر که قبلاً تعریف و صادر (Export) شده بوده است. .IP \(bu 2 تغییر اندیس یکی از اعضای جدول توابع مجازی (vtable) برای برنامه‌ها و کتابخانه‌های زبان C++. .UNINDENT .UNINDENT .UNINDENT .sp با گذشت زمان، هرگاه الگوهای تغییر بیشتری شناسایی شوند که \fIهمواره\fP به معنای تغییر ناسازگار در ABI باشند، کد برنامه تطبیق داده خواهد شد تا آن موارد را شناسایی کرده و مقدار \fBABIDIFF_ABI_INCOMPATIBLE_CHANGE\fP را متناسب با آن‌ها تنظیم کند. بنابراین، اگر با چنین الگوهایی روبرو شدید، لطفاً به ما اطلاع دهید. .sp بیت‌های باقی‌مانده در حال حاضر مورد استفاده قرار نمی‌گیرند. .SH "مثال‌های کاربردی (USAGE EXAMPLES)" .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP 1. 3 تشخیص تغییر در زیرنوع یک تابع: .INDENT 3.0 .INDENT 3.5 .sp .EX $ cat \-n test\-v0.cc 1 // Compile this with: 2 // g++ \-g \-Wall \-shared \-o libtest\-v0.so test\-v0.cc 3 4 struct S0 5 { 6 int m0; 7 }; 8 9 void 10 foo(S0* /*parameter_name*/) 11 { 12 // do something with parameter_name. 13 } $ $ cat \-n test\-v1.cc 1 // Compile this with: 2 // g++ \-g \-Wall \-shared \-o libtest\-v1.so test\-v1.cc 3 4 struct type_base 5 { 6 int inserted; 7 }; 8 9 struct S0 : public type_base 10 { 11 int m0; 12 }; 13 14 void 15 foo(S0* /*parameter_name*/) 16 { 17 // do something with parameter_name. 18 } $ $ g++ \-g \-Wall \-shared \-o libtest\-v0.so test\-v0.cc $ g++ \-g \-Wall \-shared \-o libtest\-v1.so test\-v1.cc $ $ abidiff libtest\-v0.so libtest\-v1.so; echo \(dqexit code: $?\(dq Functions changes summary: 0 Removed, 1 Changed, 0 Added function Variables changes summary: 0 Removed, 0 Changed, 0 Added variable 1 function with some indirect sub\-type change: [C]\(aqfunction void foo(S0*)\(aq has some indirect sub\-type changes: parameter 0 of type \(aqS0*\(aq has sub\-type changes: in pointed to type \(aqstruct S0\(aq: size changed from 32 to 64 bits 1 base class insertion: struct type_base 1 data member change: \(aqint S0::m0\(aq offset changed from 0 to 32 exit code: 4 $ .EE .UNINDENT .UNINDENT .UNINDENT .UNINDENT .UNINDENT .sp توجه کنید که کد خروج 4 است؛ به این معنی که بیت سوم ABIDIFF_ABI_CHANGE با مقدار عددی 4 روی 1 تنظیم شده است. این بدان معناست که ابزار تغییرات ABI را به عنوان زیان‌آور (Harmful) \%<#\:harmfulchangeconcept-label> دسته‌بندی کرده و بنابراین نیازمند بازبینی کاربر است. .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP 2. 3 تشخیص یک تغییر ناسازگار در ABI در نوع یک تابع: .INDENT 3.0 .INDENT 3.5 .sp .EX $ cat \-n test\-v0.cc 1 // Compile this with: 2 // g++ \-g \-Wall \-shared \-o libtest\-v0.so test\-v0.cc 3 4 struct S0 5 { 6 int m0; 7 }; 8 9 S0 10 foo() 11 { 12 S0 s = {}; 13 return s; 14 } $ $ cat \-n test\-v1.cc 1 // Compile this with: 2 // g++ \-g \-Wall \-shared \-o libtest\-v1.so test\-v1.cc 3 4 struct type_base 5 { 6 int inserted; 7 }; 8 9 struct S0 : public type_base 10 { 11 int m0; 12 }; 13 14 S0 15 foo() 16 { 17 S0 s = {}; 18 return s; 19 } $ $ g++ \-g \-Wall \-shared \-o libtest\-v0.so test\-v0.cc $ g++ \-g \-Wall \-shared \-o libtest\-v1.so test\-v1.cc $ $ abidiff libtest\-v0.so libtest\-v1.so; echo \(dqexit code: $?\(dq Functions changes summary: 0 Removed, 1 Changed, 0 Added function Variables changes summary: 0 Removed, 0 Changed, 0 Added variable 1 function with incompatible sub\-type changes: [C] \(aqfunction S0 foo(void)\(aq at test\-v0.cc:10:1 has some sub\-type changes: return type changed: type size changed from 32 to 64 (in bits) 1 base class insertion: struct type_base at test\-v1.cc:4:1 1 data member change: \(aqint m0\(aq offset changed from 0 to 32 (in bits) (by +32 bits) exit code: 12 $ .EE .UNINDENT .UNINDENT .UNINDENT .UNINDENT .UNINDENT .sp توجه کنید که کد خروج 12 است؛ به این معنی که هر دو بیت سوم ABIDIFF_ABI_CHANGE با مقدار 4 و بیت چهارم ABIDIFF_ABI_INCOMPATIBLE_CHANGE با مقدار 8 روی 1 تنظیم شده‌اند. این بدان معناست که ابزار تغییرات ABI را به عنوان ناسازگار \%<#\:incompatiblechangeconcept-label> دسته‌بندی کرده است. این یک شکست در ABI (یا ABI break) محسوب می‌شود. .INDENT 0.0 .INDENT 3.5 .INDENT 0.0 .IP 3. 3 تشخیص تغییر دیگری در یک زیرنوع از یک تابع: .INDENT 3.0 .INDENT 3.5 .sp .EX $ cat \-n test\-v0.cc 1 // Compile this with: 2 // g++ \-g \-Wall \-shared \-o libtest\-v0.so test\-v0.cc 3 4 struct S0 5 { 6 int m0; 7 }; 8 9 void 10 foo(S0& /*parameter_name*/) 11 { 12 // do something with parameter_name. 13 } $ $ cat \-n test\-v1.cc 1 // Compile this with: 2 // g++ \-g \-Wall \-shared \-o libtest\-v1.so test\-v1.cc 3 4 struct S0 5 { 6 char inserted_member; 7 int m0; 8 }; 9 10 void 11 foo(S0& /*parameter_name*/) 12 { 13 // do something with parameter_name. 14 } $ $ g++ \-g \-Wall \-shared \-o libtest\-v0.so test\-v0.cc $ g++ \-g \-Wall \-shared \-o libtest\-v1.so test\-v1.cc $ $ abidiff libtest\-v0.so libtest\-v1.so; echo \(dqexit code: $?\(dq Functions changes summary: 0 Removed, 1 Changed, 0 Added function Variables changes summary: 0 Removed, 0 Changed, 0 Added variable 1 function with some indirect sub\-type change: [C]\(aqfunction void foo(S0&)\(aq has some indirect sub\-type changes: parameter 0 of type \(aqS0&\(aq has sub\-type changes: in referenced type \(aqstruct S0\(aq: size changed from 32 to 64 bits 1 data member insertion: \(aqchar S0::inserted_member\(aq, at offset 0 (in bits) 1 data member change: \(aqint S0::m0\(aq offset changed from 0 to 32 exit code: 4 $ .EE .UNINDENT .UNINDENT .IP 4. 3 تشخیص حذف یا اضافه شدن توابع به یک کتابخانه: .INDENT 3.0 .INDENT 3.5 .sp .EX $ cat \-n test\-v0.cc 1 // Compile this with: 2 // g++ \-g \-Wall \-shared \-o libtest\-v0.so test\-v0.cc 3 4 struct S0 5 { 6 int m0; 7 }; 8 9 void 10 foo(S0& /*parameter_name*/) 11 { 12 // do something with parameter_name. 13 } $ $ cat \-n test\-v1.cc 1 // Compile this with: 2 // g++ \-g \-Wall \-shared \-o libtest\-v1.so test\-v1.cc 3 4 struct S0 5 { 6 char inserted_member; 7 int m0; 8 }; 9 10 void 11 bar(S0& /*parameter_name*/) 12 { 13 // do something with parameter_name. 14 } $ $ g++ \-g \-Wall \-shared \-o libtest\-v0.so test\-v0.cc $ g++ \-g \-Wall \-shared \-o libtest\-v1.so test\-v1.cc $ $ abidiff libtest\-v0.so libtest\-v1.so; echo \(dqexit code: $?\(dq Functions changes summary: 1 Removed, 0 Changed, 1 Added functions Variables changes summary: 0 Removed, 0 Changed, 0 Added variable 1 Removed function: \(aqfunction void foo(S0&)\(aq {_Z3fooR2S0} 1 Added function: \(aqfunction void bar(S0&)\(aq {_Z3barR2S0} exit code: 12 $ .EE .UNINDENT .UNINDENT .IP 5. 3 مقایسه دو مجموعه باینری که در خط فرمان ارسال می‌شوند: .INDENT 3.0 .INDENT 3.5 .sp .EX $ abidiff \-\-add\-binaries1=file2\-v1 \e \-\-add\-binaries2=file2\-v2,file2\-v1 \e \-\-added\-binaries\-dir1 dir1 \e \-\-added\-binaries\-dir2 dir2 \e file1\-v1 file1\-v2 .EE .UNINDENT .UNINDENT .sp توجه داشته باشید که فایل‌های \fBfile2\-v1\fP و \fBfile2\-v2\fP باید در \fBdir1\fP و \fBdir2\fP یا در دایرکتوری جاری یافت شوند. .IP 6. 3 مقایسه دو کتابخانه و وابستگی‌های آن‌ها: .INDENT 3.0 .INDENT 3.5 .sp .EX $ abidiff \-\-follow\-dependencies \e \-\-added\-binaries\-dir1 /some/where \e \-\-added\-binaries\-dir2 /some/where/else \e foo bar .EE .UNINDENT .UNINDENT .sp این دستور مجموعه باینری‌های تشکیل‌شده توسط \fBfoo\fP و وابستگی‌های آن را در برابر مجموعه باینری‌های تشکیل‌شده توسط \fBbar\fP و وابستگی‌های آن مقایسه می‌کند. .UNINDENT .UNINDENT .UNINDENT .SH "نویسندگان (AUTHORS)" Dodji Seketeli .SH "حق نشر (COPYRIGHT)" 2014-2025, Red Hat, Inc. .\" End of generated man page.