این دستوری است که می تواند در ارائه دهنده میزبانی رایگان OnWorks با استفاده از یکی از چندین ایستگاه کاری آنلاین رایگان مانند Ubuntu Online، Fedora Online، شبیه ساز آنلاین ویندوز یا شبیه ساز آنلاین MAC OS اجرا شود.
برنامه:
نام
abidiff - مقایسه ABI فایل های ELF
abidiff رابط های باینری برنامه (ABI) دو کتابخانه مشترک را مقایسه می کند ELFE
قالب این یک گزارش معنادار منتشر می کند که تفاوت های بین دو ABI را توصیف می کند.
برای یک گزارش جامع تغییر ABI که شامل تغییرات مربوط به تابع و متغیر است
زیر انواع، دو کتابخانه مشترک ورودی باید با اطلاعات اشکال زدایی آنها همراه باشد
in آدم کوتوله قالب در غیر این صورت فقط ELFE نمادهایی که اضافه یا حذف شده اند گزارش می شوند.
فراخوانی
abidiff [گزینه ها]
OPTIONS
· --کمک | -h
یک راهنمای کوتاه در مورد فرمان و خروج نمایش دهید.
· - نسخه | -v
نسخه برنامه را نمایش دهید و از آن خارج شوید.
· --debug-info-dir1 | --d1 <di-path1>
برای مواردی که اطلاعات اشکال زدایی برای اولین کتابخانه مشترک به یک تقسیم می شود
فایل جداگانه، می گوید تابع کجا می توان آن فایل اطلاعات اشکال زدایی جداگانه را پیدا کرد.
توجه داشته باشید که دو مسیر باید به دایرکتوری ریشه ای اشاره کند که در آن اطلاعات اشکال زدایی وجود دارد
به صورت درختی چیده شده است. تحت سیستم های مبتنی بر Red Hat، آن دایرکتوری است
معمولا /usr/lib/debug.
همچنین توجه داشته باشید که این گزینه برای تقسیم اطلاعات اشکال زدایی نصب شده توسط اجباری نیست
مدیر بسته سیستم شما به این دلیل است تابع می داند کجا آن را پیدا کند
· --debug-info-dir2 | --d2 <di-path2>
پسندیدن --debug-info-dir1، این گزینه می گوید تابع کجا می توان اشکال زدایی تقسیم را پیدا کرد
اطلاعات برای کتابخانه اشتراکی دوم فایل.
· --stat
به جای نمایش تفاوت های دقیق ABI بین اولین کتابخانه مشترک و
کتابخانه اشتراکی دوم، فقط چند آمار خلاصه در مورد این تفاوت ها را نمایش دهید.
· --symtabs
فقط جداول نمادها را نمایش دهید اولین کتابخانه مشترک و کتابخانه اشتراکی دوم.
· --deleted-fns
در گزارش حاصل در مورد تفاوت های بین اولین کتابخانه مشترک و
کتابخانه اشتراکی دوم، فقط توابع تعریف شده جهانی را که حذف شده اند نمایش می دهد
از جانب اولین کتابخانه مشترک.
· --تغییر-fns
در گزارش حاصل در مورد تفاوت های بین اولین کتابخانه مشترک و
کتابخانه اشتراکی دوم، فقط تغییرات در انواع فرعی توابع سراسری را نمایش می دهد
تعریف شده در اولین کتابخانه مشترک.
· --added-fns
در گزارش حاصل در مورد تفاوت های بین اولین کتابخانه مشترک و
کتابخانه اشتراکی دوم، فقط توابع تعریف شده جهانی را که به آنها اضافه شده اند نمایش می دهد
کتابخانه اشتراکی دوم.
· -- deleted-vars
در گزارش حاصل در مورد تفاوت های بین اولین کتابخانه مشترک و
کتابخانه اشتراکی دوم، فقط متغیرهای تعریف شده جهانی را که حذف شده اند نمایش می دهد
از جانب اولین کتابخانه مشترک.
· --تغییر-vars
در گزارش حاصل در مورد تفاوت های بین اولین کتابخانه مشترک و
کتابخانه اشتراکی دوم، فقط تغییرات در زیر انواع جهانی را نمایش می دهد
متغیرهای تعریف شده در اولین کتابخانه مشترک
· --added-vars
در گزارش حاصل در مورد تفاوت های بین اولین کتابخانه مشترک و
کتابخانه اشتراکی دوم، فقط متغیرهای جهانی را که به آن اضافه شده (تعریف شده) نمایش می دهد
کتابخانه اشتراکی دوم.
· --بدون پیوند-نام
در گزارش حاصل، نام پیوندهای اضافه شده، حذف شده یا نمایش داده نشود
تغییر توابع یا متغیرها
· --no-show-locs
اطلاعات مربوط به جایی که در دوم به اشتراک گذاشته شده کتابخانه مربوطه
نوع عوض شد
· --بدون ارجاع-نماد
در گزارش حاصل، اطلاعات تغییر در مورد عملکرد و نمایش داده نشود
نمادهای متغیری که توسط هیچ اطلاعات اشکال زدایی ارجاع نمی شوند. توجه داشته باشید که برای
این نمادها توسط هیچ اطلاعات اشکال زدایی، اطلاعات تغییر ارجاع داده نمی شود
نمایش داده شده یا اضافه یا حذف نمادها.
· -- سرکوب ها | --suppr <مسیر سرکوب ها>
از یک فایل مشخصات سرکوب واقع در مسیر سرکوب ها. توجه داشته باشید که این
گزینه می تواند چندین بار در خط فرمان ظاهر شود. همه سرکوب
سپس فایل های مشخصات در نظر گرفته می شوند.
· -- رها کردن <regex>
هنگام خواندن اولین کتابخانه مشترک و کتابخانه اشتراکی دوم فایل های ورودی ELF، رها کنید
توابع و متغیرهای تعریف شده جهانی که نام آنها با عبارت منظم مطابقت دارد
regex. در نتیجه، هیچ تغییری شامل این توابع یا متغیرها منتشر نخواهد شد
در گزارش تفاوت
· --drop-fn <regex>
هنگام خواندن اولین کتابخانه مشترک و کتابخانه اشتراکی دوم فایل های ورودی ELF، رها کنید
توابع تعریف شده جهانی که نام آنها با عبارت منظم مطابقت دارد regex. به عنوان یک
در نتیجه، هیچ تغییری شامل این توابع در گزارش تفاوت منتشر نخواهد شد.
· --drop-var <regex>
هنگام خواندن اولین کتابخانه مشترک و کتابخانه اشتراکی دوم فایل های ورودی ELF، رها کنید
متغیرهای تعریف شده جهانی که با عبارت منظم مطابقت دارند regex.
· --نگاه داشتن <regex>
هنگام خواندن اولین کتابخانه مشترک و کتابخانه اشتراکی دوم فایل های ورودی ELF، نگه دارید
توابع و متغیرهای تعریف شده جهانی که نام آنها با عبارت منظم مطابقت دارد
regex. همه توابع و متغیرهای دیگر روی زمین ریخته می شوند و بنابراین نمی شوند
در گزارش تفاوت حاصل ظاهر می شود.
· --keep-fn <regex>
هنگام خواندن اولین کتابخانه مشترک و کتابخانه اشتراکی دوم فایل های ورودی ELF، نگه دارید
توابع تعریف شده جهانی که نام آنها با عبارت منظم مطابقت دارد regex. همه
سایر عملکردها روی زمین افتاده و بنابراین در نتیجه ظاهر نمی شوند
گزارش تفاوت
· --keep-var <regex>
هنگام خواندن اولین کتابخانه مشترک و کتابخانه اشتراکی دوم فایل های ورودی ELF، نگه دارید
به صورت جهانی تعریف شده است که نامها با عبارت منظم مطابقت دارند regex. همه موارد دیگر
متغیرها روی زمین ریخته می شوند و بنابراین در تفاوت حاصل ظاهر نمی شوند
گزارش.
· --بی ضرر
در گزارش تفاوت، فقط تغییرات بی ضرر را نمایش دهید. به طور پیش فرض، بی ضرر
تغییرات از گزارش تفاوت فیلتر می شوند، درهم و برهمی را به حداقل برسانید و دارای a
تغییر بیشتر برای شناسایی مشکلات واقعی ABI.
· --بدون مضر
در گزارش تفاوت، تغییرات مضر را نمایش ندهید. به طور پیش فرض، فقط مضر است
تغییرات در گزارش تفاوت نمایش داده می شود.
· --زائد
در گزارش تفاوت، تغییرات اضافی را نمایش دهید. تغییر اضافی یک تغییر است
که در جای دیگری از گزارش نمایش داده شده است.
· -- بدون زائد
در گزارش تفاوت، انجام دهید نه نمایش تغییرات اضافی یک تغییر اضافی یک تغییر است
که در جای دیگری از گزارش نمایش داده شده است. این گزینه توسط روشن می شود
به طور پیش فرض
· -- بدون معماری
هنگام مقایسه ABI ها، معماری را در نظر نگیرید.
· --dump-diff-tree
پس از گزارش تفاوت، یک نمایش متنی از درخت گرههای تفاوت استفاده شده توسط
موتور مقایسه برای نشان دادن توابع و متغیرهای تغییر یافته. که
نمایش برای اهداف اشکال زدایی به خروجی خطا ارسال می شود. توجه داشته باشید که
این درخت تفاوت فقط مربوط به توابع و متغیرهایی است که دارای زیر نوع هستند
تغییر می کند. توابع و متغیرهای اضافه یا حذف شده درخت گره های متفاوتی ندارند
به آنها مرتبط است.
· --آمار
انتشار آمار در مورد چیزهای داخلی مختلف.
· -- پرحرف
سیاهههای مربوط به پیشرفت چیزهای داخلی متفرقه منتشر کنید.
برگشت ارزش
کد خروج از تابع اگر ABI باینری های مورد مقایسه با هم مقایسه شوند، دستور 0 است
مساوی یا غیر صفر هستند اگر متفاوت باشند یا اگر ابزار با خطا مواجه شده باشد.
در مورد بعدی، کد خروج یک فیلد بیتی 8 بیتی است که در آن هر بیت دارای یک
معنی خاص
بیت اول، با ارزش 1، نامگذاری شده است ABIDIFF_ERROR یعنی خطایی وجود داشت
بیت دوم، با ارزش 2، نامگذاری شده است ABIDIFF_USAGE_ERROR یعنی خطایی در راه بوده است
کاربر ابزار را فراخوانی کرد. برای مثال، اگر کاربر ابزار را فراخوانی کند، ممکن است تنظیم شود
با سوئیچ خط فرمان ناشناخته، با عدد یا آرگومان اشتباه و غیره اگر این بیت باشد
مجموعه، سپس ABIDIFF_ERROR بیت نیز باید تنظیم شود.
بیت سوم، با ارزش 4، نامگذاری شده است ABIDIFF_ABI_CHANGE یعنی ABI موجودات باینری
مقایسه شده متفاوت است.
بیت چهارم، با ارزش 8، نامگذاری شده است ABIDIFF_ABI_INCOMPATIBLE_CHANGE به معنی ABI از
مقایسه باینری ها به روشی ناسازگار متفاوت است. اگر این بیت تنظیم شده باشد،
ABIDIFF_ABI_CHANGE بیت نیز باید تنظیم شود. اگر ABIDIFF_ABI_CHANGE تنظیم شده است و
ABIDIFF_INCOMPATIBLE_CHANGE is نه تنظیم کنید، پس به این معنی است که ABI های مورد مقایسه ممکن است
یا ممکن است سازگار نباشد. در این صورت، یک انسان باید تغییرات ABI را بررسی کند
برای تصمیم گیری در مورد سازگاری یا عدم سازگاری آنها.
بیت های باقی مانده در حال حاضر استفاده نمی شوند.
طریقه استفاده مثال ها
1. تشخیص تغییر در یک نوع فرعی از یک تابع:
$ cat -n test-v0.cc
1 // کامپایل این با:
2 // g++ -g -Wall -shared -o libtest-v0.so test-v0.cc
3
4 ساختار S0
5 {
6 اینت m0;
7 };
8
9 باطل
10 foo(S0* /*parameter_name*/)
11 {
12 // کاری را با parameter_name انجام دهید.
13}
$
$ cat -n test-v1.cc
1 // کامپایل این با:
2 // g++ -g -Wall -shared -o libtest-v1.so test-v1.cc
3
4 ساختار type_base
5 {
6 درج شده؛
7 };
8
9 ساختار S0: public type_base
10 {
11 اینت m0;
12 };
13
14 باطل
15 foo(S0* /*parameter_name*/)
16 {
17 // کاری را با 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
$
$ ../build/tools/abidiff libtest-v0.so libtest-v1.so
خلاصه تغییرات توابع: 0 حذف، 1 تغییر، 0 عملکرد اضافه شده است
خلاصه تغییرات متغیرها: 0 حذف شده، 0 تغییر، 0 متغیر اضافه شده است
1 تابع با برخی تغییر نوع فرعی غیر مستقیم:
[C]'function void foo(S0*)' دارای برخی تغییرات غیرمستقیم در نوع فرعی است:
پارامتر 0 از نوع 'S0*' دارای تغییرات زیر نوع است:
در اشاره کرد تا «struct S0» را تایپ کنید:
اندازه از 32 به 64 بیت تغییر کرد
1 درج کلاس پایه:
struct type_base
1 تغییر عضو داده:
افست 'int S0::m0' از 0 به 32 تغییر کرد
$
2. تشخیص تغییر دیگری در یک نوع فرعی از یک تابع:
$ cat -n test-v0.cc
1 // کامپایل این با:
2 // g++ -g -Wall -shared -o libtest-v0.so test-v0.cc
3
4 ساختار S0
5 {
6 اینت m0;
7 };
8
9 باطل
10 foo(S0& /*parameter_name*/)
11 {
12 // کاری را با parameter_name انجام دهید.
13}
$
$ cat -n test-v1.cc
1 // کامپایل این با:
2 // g++ -g -Wall -shared -o libtest-v1.so test-v1.cc
3
4 ساختار S0
5 {
6 کاراکتر inserted_member;
7 اینت m0;
8 };
9
10 باطل
11 foo(S0& /*parameter_name*/)
12 {
13 // کاری را با 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
$
$ ../build/tools/abidiff libtest-v0.so libtest-v1.so
خلاصه تغییرات توابع: 0 حذف، 1 تغییر، 0 عملکرد اضافه شده است
خلاصه تغییرات متغیرها: 0 حذف شده، 0 تغییر، 0 متغیر اضافه شده است
1 تابع با برخی تغییر نوع فرعی غیر مستقیم:
[C]'function void foo(S0&)' دارای برخی تغییرات غیرمستقیم در نوع فرعی است:
پارامتر 0 از نوع 'S0&' دارای تغییرات زیر نوع است:
در نوع مرجع 'struct S0':
اندازه از 32 به 64 بیت تغییر کرد
1 درج عضو داده:
'char S0::inserted_member'، در افست 0 (به بیت)
1 تغییر عضو داده:
افست 'int S0::m0' از 0 به 32 تغییر کرد
$
3. تشخیص اینکه توابع حذف شده یا به یک کتابخانه اضافه شده اند:
$ cat -n test-v0.cc
1 // کامپایل این با:
2 // g++ -g -Wall -shared -o libtest-v0.so test-v0.cc
3
4 ساختار S0
5 {
6 اینت m0;
7 };
8
9 باطل
10 foo(S0& /*parameter_name*/)
11 {
12 // کاری را با parameter_name انجام دهید.
13}
$
$ cat -n test-v1.cc
1 // کامپایل این با:
2 // g++ -g -Wall -shared -o libtest-v1.so test-v1.cc
3
4 ساختار S0
5 {
6 کاراکتر inserted_member;
7 اینت m0;
8 };
9
10 باطل
11 نوار (S0& /*parameter_name*/)
12 {
13 // کاری را با 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
$
$ ../build/tools/abidiff libtest-v0.so libtest-v1.so
خلاصه تغییرات توابع: 1 حذف، 0 تغییر، 1 توابع اضافه شده
خلاصه تغییرات متغیرها: 0 حذف شده، 0 تغییر، 0 متغیر اضافه شده است
1 عملکرد حذف شده:
'function void foo(S0&)' {_Z3fooR2S0}
1 تابع اضافه شده:
'function void bar(S0&)' {_Z3barR2S0}
$
با استفاده از خدمات onworks.net از abidiff آنلاین استفاده کنید