นี่คือคำสั่ง abicompat ที่สามารถเรียกใช้ในผู้ให้บริการโฮสต์ฟรีของ OnWorks โดยใช้เวิร์กสเตชันออนไลน์ฟรีของเรา เช่น Ubuntu Online, Fedora Online, โปรแกรมจำลองออนไลน์ของ Windows หรือโปรแกรมจำลองออนไลน์ของ MAC OS
โครงการ:
ชื่อ
abicompat - ตรวจสอบความเข้ากันได้ของ ABI
abicompat ตรวจสอบว่าแอปพลิเคชันที่เชื่อมโยงกับไลบรารีที่ใช้ร่วมกันที่กำหนดนั้นยังคงอยู่
ABI เข้ากันได้กับห้องสมุดรุ่นต่อมา หากเวอร์ชันใหม่ของ
ห้องสมุดแนะนำความไม่ลงรอยกันของ ABI จากนั้น abicompat จะแนะนำผู้ใช้ในสิ่งที่แน่นอน
ความไม่ลงรอยกันนั้นก็คือ
การร้องขอ
abicompat [ตัวเลือก] [ ]
OPTIONS
· --ช่วยด้วย
แสดงวิธีใช้สั้นๆ เกี่ยวกับคำสั่งและการออก
· --รุ่น | -v
แสดงเวอร์ชันของโปรแกรมและออก
· --list-undefined-สัญลักษณ์ | -u
แสดงรายการสัญลักษณ์ที่ไม่ได้กำหนดของแอปพลิเคชันและออก
· --แสดง-ฐาน-ชื่อ | -b
ในรายงานผลลัพธ์ที่ส่งออกโดยเครื่องมือ ตัวเลือกนี้ทำให้แอปพลิเคชันและ
ไลบรารีถูกอ้างถึงโดยชื่อฐานเท่านั้น ไม่ใช่ด้วยชื่อเต็มแน่นอน นี้
มีประโยชน์สำหรับใช้ในสคริปต์ที่ต้องการเปรียบเทียบชื่อแอพพลิเคชั่นและ
ไลบรารีโดยไม่ขึ้นกับว่าชื่อไดเร็กทอรีของพวกเขาคืออะไร
· --app-debug-info-dir
ตั้งค่าพาธไปยังไดเร็กทอรีภายใต้ข้อมูลการดีบักของแอปพลิเคชัน
น่าจะจัดวาง สิ่งนี้มีประโยชน์สำหรับไบนารีของแอปพลิเคชันที่ debug
ข้อมูลอยู่ในชุดไฟล์แยกต่างหาก
· --lib-debug-info-dir1
กำหนดเส้นทางไปยังไดเร็กทอรีภายใต้ข้อมูลการดีบักของเวอร์ชันแรก
ของห้องสมุดที่ใช้ร่วมกันควรจะจัดวาง สิ่งนี้มีประโยชน์สำหรับไลบรารีที่ใช้ร่วมกัน
ไบนารีที่ข้อมูลการดีบักอยู่ในชุดไฟล์แยกต่างหาก
· --lib-debug-info-dir2
กำหนดเส้นทางไปยังไดเร็กทอรีภายใต้ข้อมูลการดีบักของเวอร์ชันที่สอง
ของห้องสมุดที่ใช้ร่วมกันควรจะจัดวาง สิ่งนี้มีประโยชน์สำหรับไลบรารีที่ใช้ร่วมกัน
ไบนารีที่ข้อมูลการดีบักอยู่ในชุดไฟล์แยกต่างหาก
· --no-แสดง-locs
อย่าแสดงข้อมูลเกี่ยวกับตำแหน่งใน ที่สอง ที่ใช้ร่วมกัน ห้องสมุด ตามลำดับ
เปลี่ยนประเภทแล้ว
· --อ่อนแอโหมด
สิ่งนี้ทำให้เกิดโหมดอ่อนแอของ บิคอมแพต. ในโหมดนี้มีเพียงเวอร์ชันเดียวของ
ห้องสมุดเป็นสิ่งจำเป็น นั่นคือ abicompat ถูกเรียกใช้ดังนี้:
abicompat -- โหมดอ่อนแอ
โปรดทราบว่า --อ่อนแอโหมด สามารถละเว้นตัวเลือกได้หาก . เพียงเวอร์ชันเดียว
ให้ห้องสมุดพร้อมกับแอปพลิเคชัน ในกรณีนั้น, บิคอมแพต อัตโนมัติ
สวิตช์ทำงานในโหมดอ่อนแอ:
abicompat
ในโหมดอ่อนแอนี้ ประเภทของฟังก์ชันและตัวแปรที่ส่งออกโดยไลบรารีและ
ใช้งานโดยแอปพลิเคชัน (เช่นสัญลักษณ์ของฟังก์ชันและตัวแปรเหล่านี้
ไม่ได้กำหนดไว้ในแอปพลิเคชันและถูกกำหนดและส่งออกโดยไลบรารี) เป็น
เมื่อเทียบกับรุ่นของประเภทเหล่านี้ตามที่คาดไว้โดยแอปพลิเคชัน และถ้าสิ่งเหล่านี้
สองรุ่นที่แตกต่างกัน บิคอมแพต บอกผู้ใช้ถึงความแตกต่าง
เป็น
กล่าวอีกนัยหนึ่งในโหมดนี้ บิคอมแพต ตรวจสอบว่าประเภทของฟังก์ชันและ
ตัวแปรที่ส่งออกโดยไลบรารีหมายถึงสิ่งเดียวกับที่แอปพลิเคชัน
คาดหวังเท่าที่ ABI เป็นห่วง
โปรดทราบว่าในโหมดนี้ บิคอมแพต ตรวจไม่พบฟังก์ชันหรือตัวแปรที่ส่งออก
(สัญลักษณ์) ที่แอปพลิเคชันคาดไว้แต่ถูกลบออกจากไลบรารี
จึงเรียกว่า อ่อนแอ โหมด.
กลับ VALUES
รหัสทางออกของ บิคอมแพต คำสั่งเป็น 0 ถ้า ABI ของไบนารีเป็น
เปรียบเทียบเท่ากันหรือไม่เป็นศูนย์หากต่างกันหรือเครื่องมือพบข้อผิดพลาด
ในกรณีต่อมา รหัสออกคือฟิลด์บิตกว้าง 8 บิต โดยแต่ละบิตมี a
ความหมายเฉพาะ
บิตแรก ของค่า 1 ชื่อ ABIDIFF_ERROR หมายความว่ามีข้อผิดพลาด
บิตที่สอง ของค่า 2 ชื่อ ABIDIFF_USAGE_ERROR หมายความว่ามีข้อผิดพลาดในทาง
ผู้ใช้เรียกใช้เครื่องมือ อาจมีการตั้งค่า เช่น หากผู้ใช้เรียกใช้เครื่องมือ
ด้วยสวิตช์บรรทัดคำสั่งที่ไม่รู้จัก ด้วยตัวเลขหรืออาร์กิวเมนต์ที่ไม่ถูกต้อง ฯลฯ หากบิตนี้เป็น
ตั้งค่าแล้ว ABIDIFF_ERROR ต้องตั้งค่า bit ด้วย
บิตที่สาม ของค่า 4 ชื่อ ABIDIFF_ABI_CHANGE หมายถึง ABI ของไบนารีที่เป็น
เปรียบเทียบก็ต่างกัน
บิตที่สี่ของค่า 8 ชื่อ ABIDIFF_ABI_INCOMPATIBLE_CHANGE หมายถึง ABI ของ
การเปรียบเทียบไบนารีนั้นแตกต่างกันในทางที่เข้ากันไม่ได้ หากบิตนี้ถูกตั้งค่าแล้ว
ABIDIFF_ABI_CHANGE ต้องตั้งค่า bit ด้วย ถ้า ABIDIFF_ABI_CHANGE ถูกตั้งค่าและ
ABIDIFF_INCOMPATIBLE_CHANGE is ไม่ กำหนดก็หมายความว่า ABIs ที่เปรียบเทียบอาจ
หรืออาจจะเข้ากันไม่ได้ ในกรณีนั้น มนุษย์จำเป็นต้องตรวจสอบการเปลี่ยนแปลงของ ABI
เพื่อตัดสินใจว่าจะเข้ากันได้หรือไม่
บิตที่เหลือไม่ได้ใช้ในขณะนี้
การใช้ ตัวอย่าง
· การตรวจจับความไม่ลงรอยกันของ ABI ที่เป็นไปได้ในเวอร์ชันไลบรารีที่ใช้ร่วมกันใหม่:
$ cat -n ทดสอบ 0.h
1 โครงสร้าง foo
2 {
3 นิ้ว m0;
4
5 ฟู()
6 : ม0()
7 {}
8 };
9
10 ฟู*
11 first_func();
12
13 โมฆะ
14 วินาที_func(foo&);
15
16 โมฆะ
17 Third_func();
$
$ cat -n ทดสอบ app.cc
1 // รวบรวมด้วย:
2 // g++ -g -Wall -o ทดสอบแอป -L -ltest-0 ทดสอบ app.cc
3
4 #รวม "test0.h"
5
6 นิ้ว
7 หลัก()
8 {
9 foo* f = first_func();
10 วินาที_func(*f);
11 คืน 0;
12}
$
$ cat -n test0.cc
1 // รวบรวมสิ่งนี้ด้วย:
2 // g++ -g -Wall -shared -o libtest-0.so test0.cc
3
4 #รวม "test0.h"
5
6 ฟู*
7 first_func()
8 {
9 foo* f = ใหม่ foo();
10 กลับ f;
11}
12
13 โมฆะ
14 วินาที_func(foo&)
15 {
16}
17
18 โมฆะ
19 Third_func()
20 {
21}
$
$ cat -n ทดสอบ 1.h
1 โครงสร้าง foo
2 {
3 นิ้ว m0;
4 ถ่าน m1; /* <-- มีสมาชิกใหม่เพิ่มเข้ามาแล้ว! */
5
6 ฟู()
7 : m0(),
8 ม.1()
9 {}
10 };
11
12 ฟู*
13 first_func();
14
15 โมฆะ
16 วินาที_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 #รวม "test1.h"
5
6 ฟู*
7 first_func()
8 {
9 foo* f = ใหม่ foo();
10 กลับ f;
11}
12
13 โมฆะ
14 วินาที_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 แอปทดสอบ -L -ltest-0.so ทดสอบ app.cc
· ตอนนี้ ใช้ บิคอมแพต เพื่อดูว่า libtest-1.so ABI เข้ากันได้กับแอพหรือไม่ด้วยความเคารพ
ถึง ABI ของ libtest-0.so:
$ แอพทดสอบ abicompat libtest-0.so libtest-1.so
ไฟล์ 'test-app' ของ ELF อาจไม่เข้ากันได้กับ ABI กับ 'libtest-1.so' เนื่องจากความแตกต่างกับ 'libtest-0.so' ด้านล่าง:
สรุปการเปลี่ยนแปลงฟังก์ชัน: 0 ถูกลบ, 2 เปลี่ยนแปลง, 0 เพิ่มฟังก์ชัน
ตัวแปรการเปลี่ยนแปลงสรุป: 0 ลบ, 0 เปลี่ยนแปลง, 0 เพิ่มตัวแปร
2 ฟังก์ชั่นพร้อมการเปลี่ยนแปลงประเภทย่อยทางอ้อม:
[C]'function foo* first_func()' มีการเปลี่ยนแปลงประเภทย่อยทางอ้อม:
เปลี่ยนประเภทการส่งคืน:
ชี้ไปที่พิมพ์ 'struct foo':
ขนาดเปลี่ยนจาก 32 เป็น 64 บิต
การแทรกสมาชิกข้อมูล 1 รายการ:
'char foo::m1' ที่ออฟเซ็ต 32 (เป็นบิต)
[C]'function void second_func(foo&)' มีการเปลี่ยนแปลงประเภทย่อยทางอ้อม:
พารามิเตอร์ 0 ของประเภท 'foo&' มีการเปลี่ยนแปลงประเภทย่อย:
มีการเปลี่ยนแปลงประเภทอ้างอิง 'struct foo' ตามที่รายงานก่อนหน้านี้
$
· ตอนนี้ใช้โหมดอ่อนแอของ abicompat นั่นคือ ให้เฉพาะแอปพลิเคชันและ
เวอร์ชันใหม่ของไลบรารี:
$ abicompat --แอปทดสอบโหมดอ่อนแอ libtest-1.so
ฟังก์ชั่นที่กำหนดไว้ในห้องสมุด
'libtest-1.so'
มีประเภทย่อยที่แตกต่างจากแอปพลิเคชันใด
'แอปทดสอบ'
คาดหวัง:
ฟังก์ชั่น foo* first_func():
เปลี่ยนประเภทการส่งคืน:
ชี้ไปที่พิมพ์ 'struct foo':
ขนาดเปลี่ยนจาก 32 เป็น 64 บิต
การแทรกสมาชิกข้อมูล 1 รายการ:
'char foo::m1' ที่ออฟเซ็ต 32 (เป็นบิต)
$
ใช้ abicompat ออนไลน์โดยใช้บริการ onworks.net