ນີ້ແມ່ນຄໍາສັ່ງ abicompat ທີ່ສາມາດດໍາເນີນການໄດ້ໃນ OnWorks ຜູ້ໃຫ້ບໍລິການໂຮດຕິ້ງຟຣີໂດຍໃຊ້ຫນຶ່ງໃນສະຖານີເຮັດວຽກອອນໄລນ໌ຟຣີຫຼາຍອັນຂອງພວກເຮົາເຊັ່ນ Ubuntu Online, Fedora Online, Windows online emulator ຫຼື MAC OS online emulator
ໂຄງການ:
NAME
abicompat - ກວດເບິ່ງຄວາມເຂົ້າກັນໄດ້ ABI
abicompat ກວດເບິ່ງວ່າແອັບພລິເຄຊັນທີ່ເຊື່ອມຕໍ່ກັບຫ້ອງສະຫມຸດທີ່ແບ່ງປັນໃຫ້ແມ່ນຍັງຢູ່
ABI ເຂົ້າກັນໄດ້ກັບສະບັບຕໍ່ມາຂອງຫ້ອງສະຫມຸດນັ້ນ. ຖ້າຫາກວ່າສະບັບໃຫມ່ຂອງ
ຫ້ອງສະຫມຸດແນະນໍາຄວາມບໍ່ເຂົ້າກັນຂອງ ABI, ຫຼັງຈາກນັ້ນ abicompat ຊີ້ບອກຜູ້ໃຊ້ໃນສິ່ງທີ່ແນ່ນອນ
ຄວາມບໍ່ເຂົ້າກັນນັ້ນແມ່ນ.
ການຮຽກຮ້ອງ
abicompat [ທາງເລືອກ] [ ]
OPTIONS
· - ຊ່ວຍ
ສະແດງການຊ່ວຍເຫຼືອສັ້ນໆກ່ຽວກັບຄໍາສັ່ງແລະອອກ.
· - ການປ່ຽນແປງ | -v
ສະແດງສະບັບຂອງໂຄງການແລະອອກ.
· --list-undefined-ສັນຍາລັກ | -u
ສະແດງລາຍຊື່ຂອງສັນຍາລັກທີ່ບໍ່ໄດ້ກໍານົດຂອງແອັບພລິເຄຊັນແລະອອກ.
· --show-base-names | -b
ໃນບົດລາຍງານຜົນໄດ້ຮັບທີ່ປ່ອຍອອກມາໂດຍເຄື່ອງມື, ທາງເລືອກນີ້ເຮັດໃຫ້ຄໍາຮ້ອງສະຫມັກແລະ
ຫໍສະຫມຸດຖືກກ່າວເຖິງໂດຍຊື່ພື້ນຖານຂອງພວກເຂົາເທົ່ານັ້ນ; ບໍ່ແມ່ນຊື່ເຕັມ. ນີ້
ສາມາດເປັນປະໂຫຍດສໍາລັບການນໍາໃຊ້ໃນສະຄິບທີ່ຕ້ອງການປຽບທຽບຊື່ຂອງຄໍາຮ້ອງສະຫມັກແລະ
ຫ້ອງສະຫມຸດເປັນເອກະລາດຂອງສິ່ງທີ່ຊື່ໄດເລກະທໍລີຂອງເຂົາເຈົ້າ.
· --app-debug-info-dir
ກໍານົດເສັ້ນທາງໄປຫາໄດເລກະທໍລີທີ່ຂໍ້ມູນດີບັກຂອງແອັບພລິເຄຊັນແມ່ນ
ຄວນຈະໄດ້ວາງອອກ. ນີ້ແມ່ນເປັນປະໂຫຍດສໍາລັບ binaries ຄໍາຮ້ອງສະຫມັກສໍາລັບການ debug ໄດ້
ຂໍ້ມູນແມ່ນຢູ່ໃນຊຸດໄຟລ໌ແຍກຕ່າງຫາກ.
· --lib-debug-info-dir1
ກໍານົດເສັ້ນທາງໄປຫາໄດເລກະທໍລີພາຍໃຕ້ຂໍ້ມູນ debug ຂອງສະບັບທໍາອິດ
ຂອງຫໍສະຫມຸດທີ່ໃຊ້ຮ່ວມກັນແມ່ນຄວນຈະຖືກວາງໄວ້. ນີ້ແມ່ນເປັນປະໂຫຍດສໍາລັບຫ້ອງສະຫມຸດທີ່ໃຊ້ຮ່ວມກັນ
ໄບນາຣີທີ່ຂໍ້ມູນດີບັກຢູ່ໃນຊຸດໄຟລ໌ແຍກຕ່າງຫາກ.
· --lib-debug-info-dir2
ກໍານົດເສັ້ນທາງໄປຫາໄດເລກະທໍລີພາຍໃຕ້ຂໍ້ມູນ debug ຂອງສະບັບທີສອງ
ຂອງຫໍສະຫມຸດທີ່ໃຊ້ຮ່ວມກັນແມ່ນຄວນຈະຖືກວາງໄວ້. ນີ້ແມ່ນເປັນປະໂຫຍດສໍາລັບຫ້ອງສະຫມຸດທີ່ໃຊ້ຮ່ວມກັນ
ໄບນາຣີທີ່ຂໍ້ມູນດີບັກຢູ່ໃນຊຸດໄຟລ໌ແຍກຕ່າງຫາກ.
· --no-show-locs
ຢ່າສະແດງຂໍ້ມູນກ່ຽວກັບບ່ອນທີ່ຢູ່ໃນ ຄັ້ງທີສອງ ແບ່ງປັນ ຫ້ອງສະຫມຸດ ທີ່ກ່ຽວຂ້ອງ
ປະເພດຖືກປ່ຽນແປງ.
· -- ໂຫມດອ່ອນ
ນີ້ກະຕຸ້ນຮູບແບບທີ່ອ່ອນແອຂອງ abicompat. ໃນຮູບແບບນີ້, ມີພຽງແຕ່ຫນຶ່ງສະບັບຂອງ
ຫ້ອງສະຫມຸດແມ່ນຕ້ອງການ. ນັ້ນແມ່ນ, abicompat ຖືກເອີ້ນແບບນີ້:
abicompat --weak-mode
ຫມາຍເຫດວ່າ -- ໂຫມດອ່ອນ ທາງເລືອກແມ່ນແຕ່ສາມາດຖືກຍົກເວັ້ນຖ້າຫາກວ່າພຽງແຕ່ຫນຶ່ງສະບັບຂອງ
ຫ້ອງສະຫມຸດໄດ້ຖືກມອບ, ພ້ອມກັບຄໍາຮ້ອງສະຫມັກ; ໃນກໍລະນີນັ້ນ, abicompat ອັດຕະໂນມັດ
ສະຫຼັບເພື່ອເຮັດວຽກຢູ່ໃນໂໝດອ່ອນ:
abicompat
ໃນຮູບແບບທີ່ອ່ອນແອນີ້, ປະເພດຂອງຫນ້າທີ່ແລະຕົວແປທີ່ສົ່ງອອກໂດຍຫ້ອງສະຫມຸດແລະ
ບໍລິໂພກໂດຍຄໍາຮ້ອງສະຫມັກ (ໃນ, ສັນຍາລັກຂອງຫນ້າທີ່ແລະຕົວແປເຫຼົ່ານີ້
ແມ່ນ undefined ໃນຄໍາຮ້ອງສະຫມັກແລະຖືກກໍານົດແລະສົ່ງອອກໂດຍຫ້ອງສະຫມຸດ) ແມ່ນ
ເມື່ອປຽບທຽບກັບລຸ້ນຂອງປະເພດເຫຼົ່ານີ້ຕາມທີ່ຄາດໄວ້ໂດຍແອັບພລິເຄຊັນ. ແລະຖ້າຫາກວ່າເຫຼົ່ານີ້
ສອງສະບັບຂອງປະເພດແມ່ນແຕກຕ່າງກັນ, abicompat ບອກຜູ້ໃຊ້ວ່າມີຄວາມແຕກຕ່າງແນວໃດ
ແມ່ນ.
ໃນຄໍາສັບຕ່າງໆອື່ນໆ, ໃນຮູບແບບນີ້, abicompat ກວດເບິ່ງວ່າປະເພດຂອງຫນ້າທີ່ແລະ
ຕົວແປທີ່ສົ່ງອອກໂດຍຫ້ອງສະຫມຸດຫມາຍເຖິງສິ່ງດຽວກັນກັບສິ່ງທີ່ຄໍາຮ້ອງສະຫມັກ
ຄາດວ່າ, ເທົ່າທີ່ ABI ກ່ຽວຂ້ອງ.
ໃຫ້ສັງເກດວ່າໃນຮູບແບບນີ້, abicompat ບໍ່ກວດພົບຟັງຊັນ ຫຼືຕົວແປທີ່ສົ່ງອອກ
(ສັນຍາລັກ) ທີ່ຄາດວ່າຈະໂດຍຄໍາຮ້ອງສະຫມັກແຕ່ວ່າໄດ້ຖືກໂຍກຍ້າຍອອກຈາກຫ້ອງສະຫມຸດ.
ນັ້ນແມ່ນເຫດຜົນທີ່ວ່າມັນຖືກເອີ້ນວ່າ ອ່ອນແອ mode
ກັບຄືນ VALUES
ລະຫັດທາງອອກຂອງ abicompat ຄໍາສັ່ງແມ່ນ 0 ຖ້າ ABI ຂອງ binaries ເປັນ
ປຽບທຽບແມ່ນເທົ່າທຽມກັນ, ຫຼືບໍ່ແມ່ນສູນຖ້າພວກມັນແຕກຕ່າງກັນຫຼືຖ້າເຄື່ອງມືພົບຂໍ້ຜິດພາດ.
ໃນກໍລະນີຕໍ່ມາ, ລະຫັດອອກແມ່ນ 8-bits-wide bit field ທີ່ແຕ່ລະ bit ມີ a
ຄວາມຫມາຍສະເພາະ.
ບິດທຳອິດຂອງຄ່າ 1, ຊື່ ABIDIFF_ERROR ຫມາຍຄວາມວ່າມີຄວາມຜິດພາດ.
ບິດທີສອງ, ຂອງມູນຄ່າ 2, ຊື່ ABIDIFF_USAGE_ERROR ຫມາຍຄວາມວ່າມີຄວາມຜິດພາດໃນວິທີການ
ຜູ້ໃຊ້ໄດ້ຮຽກຮ້ອງເຄື່ອງມື. ມັນອາດຈະຖືກກໍານົດ, ຕົວຢ່າງ, ຖ້າຜູ້ໃຊ້ຮຽກຮ້ອງເຄື່ອງມື
ດ້ວຍການປ່ຽນເສັ້ນຄໍາສັ່ງທີ່ບໍ່ຮູ້ຈັກ, ມີຕົວເລກຜິດ ຫຼື argument, ແລະອື່ນໆ ຖ້າບິດນີ້ແມ່ນ
ຕັ້ງ, ຈາກນັ້ນ ABIDIFF_ERROR bit ຕ້ອງໄດ້ຮັບການຕັ້ງຄ່າເຊັ່ນດຽວກັນ.
ບິດທີສາມ, ຂອງມູນຄ່າ 4, ຊື່ ABIDIFF_ABI_CHANGE ຫມາຍຄວາມວ່າ ABI ຂອງ binaries ເປັນ
ປຽບທຽບແມ່ນແຕກຕ່າງກັນ.
ບິດທີສີ່, ຂອງມູນຄ່າ 8, ຊື່ ABIDIFF_ABI_INCOMPATIBLE_CHANGE ຫມາຍຄວາມວ່າ ABI ຂອງ
binaries ປຽບທຽບແມ່ນແຕກຕ່າງກັນໃນທາງທີ່ບໍ່ເຂົ້າກັນໄດ້. ຖ້າບິດນີ້ຖືກຕັ້ງ, ຫຼັງຈາກນັ້ນ
ABIDIFF_ABI_CHANGE bit ຕ້ອງໄດ້ຮັບການຕັ້ງຄ່າເຊັ່ນດຽວກັນ. ຖ້າ ABIDIFF_ABI_CHANGE ຖືກກໍານົດແລະ
ABIDIFF_INCOMPATIBLE_CHANGE is ບໍ່ ກໍານົດ, ຫຼັງຈາກນັ້ນມັນຫມາຍຄວາມວ່າ ABIs ທີ່ຖືກປຽບທຽບອາດຈະ
ຫຼືອາດຈະບໍ່ເຂົ້າກັນໄດ້. ໃນກໍລະນີດັ່ງກ່າວ, ມະນຸດຕ້ອງທົບທວນຄືນການປ່ຽນແປງ ABI
ເພື່ອຕັດສິນໃຈວ່າພວກມັນເຂົ້າກັນໄດ້ຫຼືບໍ່.
ບິດທີ່ຍັງເຫຼືອບໍ່ໄດ້ຖືກນໍາໃຊ້ສໍາລັບປັດຈຸບັນ.
ການນໍາໃຊ້ ຕົວຢ່າງ
· ການກວດສອບຄວາມບໍ່ເຂົ້າກັນ ABI ທີ່ເປັນໄປໄດ້ໃນສະບັບຫ້ອງສະຫມຸດທີ່ແບ່ງປັນໃຫມ່:
$ cat -n test0.h
ໂຄງສ້າງ 1 fo
2 {
3 int m0;
4
5 foo()
6 : m0()
7 {}
8 };
9
10 ຟຸດ*
11 first_func();
12
13 ຫວ່າງເປົ່າ
14 second_func(foo&);
15
16 ຫວ່າງເປົ່າ
17 third_func();
$
$ cat -n test-app.cc
1 // ລວບລວມກັບ:
2 // g++ -g -Wall -o test-app -L. -ltest-0 test-app.cc
3
4 #include "test0.h"
5
6 int
7 ຫຼັກ()
8 {
9 foo* f = first_func();
10 second_func(*f);
11 ກັບຄືນ 0;
12 }
$
$ cat -n test0.cc
1 // ລວບລວມຂໍ້ມູນນີ້ດ້ວຍ:
2 // g++ -g -Wall -shared -o libtest-0.so test0.cc
3
4 #include "test0.h"
5
6 ຟຸດ*
7 first_func()
8 {
9 foo* f = new foo();
10 ກັບຄືນ f;
11 }
12
13 ຫວ່າງເປົ່າ
14 second_func(foo&)
15 {
16 }
17
18 ຫວ່າງເປົ່າ
19 third_func()
20 {
21 }
$
$ cat -n test1.h
ໂຄງສ້າງ 1 fo
2 {
3 int m0;
4 char m1; /* <-- ໄດ້ເພີ່ມສະມາຊິກໃໝ່ຢູ່ທີ່ນີ້! */
5
6 foo()
7 : m0( ),
8 m1()
9 {}
10 };
11
12 ຟຸດ*
13 first_func();
14
15 ຫວ່າງເປົ່າ
16 second_func(foo&);
17
18 ຫວ່າງເປົ່າ
19 third_func();
$
$ cat -n test1.cc
1 // ລວບລວມຂໍ້ມູນນີ້ດ້ວຍ:
2 // g++ -g -Wall -shared -o libtest-1.so test1.cc
3
4 #include "test1.h"
5
6 ຟຸດ*
7 first_func()
8 {
9 foo* f = new foo();
10 ກັບຄືນ f;
11 }
12
13 ຫວ່າງເປົ່າ
14 second_func(foo&)
15 {
16 }
17
18 /* ໃຫ້ຄໍາຄິດຄໍາເຫັນອອກຄໍານິຍາມຂອງ third_func()
19 ຫວ່າງເປົ່າ
20 third_func()
21 {
22 }
23 */
$
·ລວບລວມສະບັບທໍາອິດແລະທີສອງຂອງຫ້ອງສະຫມຸດ: libtest-0.so ແລະ
libtest-1.so:
$g++ -g -Wall -shared -o libtest-0.so test0.cc
$g++ -g -Wall -shared -o libtest-1.so test1.cc
·ລວບລວມຄໍາຮ້ອງສະຫມັກແລະເຊື່ອມຕໍ່ມັນກັບສະບັບທໍາອິດຂອງຫ້ອງສະຫມຸດ,
ການສ້າງ ແອັບທົດສອບ ຄູ່:
$ g++ -g -Wall -o test-app -L. -ltest-0.so test-app.cc
· ດຽວນີ້, ໃຊ້ abicompat ເພື່ອເບິ່ງວ່າ libtest-1.so ແມ່ນ ABI ເຂົ້າກັນໄດ້ກັບ app, ດ້ວຍຄວາມນັບຖື
ກັບ ABI ຂອງ libtest-0.so:
$ abicompat test-app libtest-0.so libtest-1.so
ໄຟລ໌ ELF 'test-app' ອາດຈະບໍ່ເປັນ ABI ທີ່ເຂົ້າກັນໄດ້ກັບ 'libtest-1.so' ເນື່ອງຈາກຄວາມແຕກຕ່າງກັບ 'libtest-0.so' ຂ້າງລຸ່ມນີ້:
ສັງລວມການປ່ຽນແປງຟັງຊັນ: 0 ຖອດອອກ, 2 ປ່ຽນແປງ, 0 ຟັງຊັນເພີ່ມ
ສະຫຼຸບການປ່ຽນແປງຕົວແປ: 0 ລົບອອກ, 0 ປ່ຽນແປງ, 0 ເພີ່ມຕົວແປ
2 ຫນ້າທີ່ມີການປ່ຽນແປງບາງປະເພດຍ່ອຍທາງອ້ອມ:
[C]'function foo* first_func()' ມີການປ່ຽນແປງບາງປະເພດຍ່ອຍທາງອ້ອມ:
ປ່ຽນປະເພດກັບຄືນໄປບ່ອນ:
ຊີ້ໄປພິມ 'struct foo':
ຂະຫນາດປ່ຽນຈາກ 32 ຫາ 64 bits
1 ການແຊກສະມາຊິກຂໍ້ມູນ:
'char foo::m1', ທີ່ offset 32 (in bits)
[C] 'function void second_func(foo&)' ມີການປ່ຽນແປງບາງປະເພດຍ່ອຍທາງອ້ອມ:
ພາລາມິເຕີ 0 ຂອງປະເພດ 'foo&' ມີການປ່ຽນແປງປະເພດຍ່ອຍ:
ປະເພດອ້າງອີງ 'struct foo' ມີການປ່ຽນແປງ, ດັ່ງທີ່ໄດ້ລາຍງານກ່ອນຫນ້ານີ້
$
·ໃນປັດຈຸບັນນໍາໃຊ້ຮູບແບບທີ່ອ່ອນແອຂອງ abicompat, ນັ້ນແມ່ນ, ສະຫນອງພຽງແຕ່ຄໍາຮ້ອງສະຫມັກແລະ
ສະບັບໃຫມ່ຂອງຫໍສະຫມຸດ:
$ abicompat --weak-mode test-app libtest-1.so
ຫນ້າທີ່ກໍານົດໄວ້ໃນຫ້ອງສະຫມຸດ
'libtest-1.so'
ມີປະເພດຍ່ອຍທີ່ແຕກຕ່າງຈາກຄໍາຮ້ອງສະຫມັກໃດ
'ແອັບທົດສອບ'
ຄາດຫວັງວ່າ:
function foo* first_func():
ປ່ຽນປະເພດກັບຄືນໄປບ່ອນ:
ຊີ້ໄປພິມ 'struct foo':
ຂະຫນາດປ່ຽນຈາກ 32 ຫາ 64 bits
1 ການແຊກສະມາຊິກຂໍ້ມູນ:
'char foo::m1', ທີ່ offset 32 (in bits)
$
ໃຊ້ abicompat ອອນໄລນ໌ໂດຍໃຊ້ບໍລິການ onworks.net