Jest to polecenie abicompat, które można uruchomić u dostawcy bezpłatnego hostingu OnWorks przy użyciu jednej z naszych wielu bezpłatnych stacji roboczych online, takich jak Ubuntu Online, Fedora Online, emulator online systemu Windows lub emulator online MAC OS
PROGRAM:
IMIĘ
abicompat - sprawdź kompatybilność ABI
abicompat sprawdza, czy aplikacja, która łączy się z daną współdzieloną biblioteką, nie działa
ABI kompatybilny z kolejną wersją tej biblioteki. Jeśli nowa wersja
biblioteka wprowadza niezgodność ABI, a następnie abicompat podpowiada użytkownikowi, co dokładnie
ta niezgodność jest.
WEZWANIE
abicompat [opcje] [ ]
OPCJE
· --help
Wyświetl krótką pomoc dotyczącą polecenia i wyjdź.
· --wersja | -v
Wyświetl wersję programu i wyjdź.
· --list-niezdefiniowanych-symboli | -u
Wyświetl listę niezdefiniowanych symboli aplikacji i wyjdź.
· --show-base-names | -b
W wynikowym raporcie emitowanym przez narzędzie ta opcja powoduje, że aplikacja i
do bibliotek należy odnosić się wyłącznie za pomocą ich nazw podstawowych; nie przez pełną nazwę absolutną. Ten
może być przydatny do użycia w skryptach, które chcą porównać nazwy aplikacji i
bibliotek niezależnie od tego, jakie są ich nazwy katalogów.
· --app-debug-info-katalog
Ustaw ścieżkę do katalogu, w którym znajdują się informacje debugowania aplikacji
miał być rozłożony. Jest to przydatne w przypadku plików binarnych aplikacji, dla których debug
info znajduje się w osobnym zestawie plików.
· --lib-debug-informacje-katalog1
Ustaw ścieżkę do katalogu, w którym znajdują się informacje debugowania pierwszej wersji
biblioteki wspólnej ma być rozplanowany. Jest to przydatne w przypadku biblioteki współdzielonej
pliki binarne, dla których informacje debugowania znajdują się w osobnym zestawie plików.
· --lib-debug-informacje-katalog2
Ustaw ścieżkę do katalogu, w którym znajdują się informacje debugowania drugiej wersji
biblioteki wspólnej ma być rozplanowany. Jest to przydatne w przypadku biblioteki współdzielonej
pliki binarne, dla których informacje debugowania znajdują się w osobnym zestawie plików.
· --no-show-loc
Nie pokazuj informacji o tym, gdzie w Dopiero shared biblioteka odpowiedni
typ został zmieniony.
· --słaby tryb
To uruchamia słaby tryb abikompat. W tym trybie tylko jedna wersja pliku
wymagana jest biblioteka. Oznacza to, że abicompat jest wywoływany w następujący sposób:
abicompat --tryb słaby
Zauważ, że --słaby tryb opcję można nawet pominąć, jeśli tylko jedna wersja pliku
wraz z aplikacją przekazywana jest biblioteka; w tym wypadku, abikompat automatycznie
przełączniki do pracy w trybie słabym:
abikompat
W tym słabym trybie typy funkcji i zmiennych eksportowanych przez bibliotekę i
zużywane przez aplikację (jak w symbolach tych funkcji i zmiennych
są niezdefiniowane w aplikacji i są definiowane i eksportowane przez bibliotekę) są
w porównaniu z wersją tych typów zgodnie z oczekiwaniami aplikacji. A jeśli te
dwie wersje typów są różne, abikompat informuje użytkownika, jakie są różnice
są.
Innymi słowy, w tym trybie abikompat sprawdza, czy typy funkcji i
zmienne eksportowane przez bibliotekę oznaczają to samo, co aplikacja
oczekuje, jeśli chodzi o ABI.
Należy pamiętać, że w tym trybie abikompat nie wykrywa wyeksportowanych funkcji ani zmiennych
(symbole), których oczekuje aplikacja, ale które są usuwane z biblioteki.
Dlatego to się nazywa słaby tryb.
POWRÓT WARTOŚCI
Kod wyjścia z abikompat polecenie ma wartość 0, jeśli ABI plików binarnych jest
porównywane są równe lub niezerowe, jeśli się różnią lub jeśli narzędzie napotkało błąd.
W tym drugim przypadku kod wyjścia to pole bitowe o szerokości 8 bitów, w którym każdy bit ma wartość
konkretne znaczenie.
Pierwszy bit o wartości 1, nazwany ABIDIFF_BŁĄD oznacza, że wystąpił błąd.
Drugi bit o wartości 2 o nazwie ABIDIFF_USAGE_ERROR oznacza, że wystąpił błąd w drodze
użytkownik wywołał narzędzie. Można to ustawić na przykład, jeśli użytkownik wywołał narzędzie
z nieznanym przełącznikiem wiersza poleceń, z błędną liczbą lub argumentem itp. Jeśli ten bit jest
ustawić, a następnie ABIDIFF_BŁĄD Bit również musi być ustawiony.
Trzeci bit o wartości 4 o nazwie ABIDIFF_ABI_CHANGE oznacza ABI istot binarnych
porównywane są różne.
Czwarty bit o wartości 8 o nazwie ABIDIFF_ABI_INCOMPATIBLE_CHANGE oznacza ABI
porównywane pliki binarne różnią się w niekompatybilny sposób. Jeśli ten bit jest ustawiony, to
ABIDIFF_ABI_CHANGE Bit również musi być ustawiony. jeśli ABIDIFF_ABI_CHANGE jest ustawiony i
ABIDIFF_INCOMPATIBLE_CHANGE is NIE ustawiony, oznacza to, że porównywane ABI mogą
lub może nie być kompatybilny. W takim przypadku człowiek musi przejrzeć zmiany ABI
zdecydować, czy są kompatybilne, czy nie.
Pozostałe bity na razie nie są używane.
ZASTOSOWANIE PRZYKŁADY
· Wykrywanie możliwej niezgodności ABI w nowej wersji biblioteki współdzielonej:
$ cat -n test0.h
1 struktura foo
2 {
3 cal m0;
4
5 foo()
6: m0()
7 {}
8 };
9
10 fu*
11 pierwsza_funkcja();
12
13 pustka
14 druga_funkcja(foo&);
15
16 pustka
17 trzecia_funkcja();
$
$ cat -n aplikacja-testowa.cc
1 // Skompiluj z:
2 // g++ -g -Wall -o test-app -L. -ltest-0 aplikacja-testowa.cc
3
4 #włącz "test0.h"
5
6 wewn
7 główny()
8 {
9 foo* f = pierwsza_funkcja();
10 druga_funkcja(*f);
11 powrót 0;
12}
$
$ cat -n test0.cc
1 // Skompiluj to z:
2 // g++ -g -Wall -shared -o libtest-0.so test0.cc
3
4 #włącz "test0.h"
5
6 fu*
7 pierwsza_funkcja()
8 {
9 foo* f = nowy foo();
10 powrót f;
11}
12
13 pustka
14 sekunda_funkcja(foo&)
15 {
16}
17
18 pustka
19 trzecia_funkcja()
20 {
21}
$
$ cat -n test1.h
1 struktura foo
2 {
3 cal m0;
4 char m1; /* <-- nowy członek został tutaj dodany! */
5
6 foo()
7: m0(),
8 m1()
9 {}
10 };
11
12 fu*
13 pierwsza_funkcja();
14
15 pustka
16 druga_funkcja(foo&);
17
18 pustka
19 trzecia_funkcja();
$
$ cat -n test1.cc
1 // Skompiluj to z:
2 // g++ -g -Wall -shared -o libtest-1.so test1.cc
3
4 #włącz "test1.h"
5
6 fu*
7 pierwsza_funkcja()
8 {
9 foo* f = nowy foo();
10 powrót f;
11}
12
13 pustka
14 sekunda_funkcja(foo&)
15 {
16}
17
18 /* Skomentujmy definicję trzeciej_funkcji()
19 pustka
20 trzecia_funkcja()
21 {
22}
23 */
$
· Skompiluj pierwszą i drugą wersję bibliotek: libtest-0.so i
libtest-1.so:
$ g++ -g -Wall -shared -o libtest-0.so test0.cc
$ g++ -g -Wall -shared -o libtest-1.so test1.cc
· Skompiluj aplikację i połącz ją z pierwszą wersją biblioteki,
tworzenie aplikacja testowa dwójkowy:
$ g++ -g -Wall -o aplikacja-testowa -L. -ltest-0.so test-app.cc
· Teraz użyj abikompat aby sprawdzić, czy libtest-1.so jest kompatybilny z aplikacją ABI, z szacunkiem
do ABI libtest-0.so:
$ abicompat aplikacja testowa libtest-0.so libtest-1.so
Plik ELF „test-app” może nie być zgodny z ABI z „libtest-1.so” ze względu na różnice z „libtest-0.so” poniżej:
Podsumowanie zmian funkcji: 0 usunięto, 2 zmieniono, 0 dodano funkcje
Podsumowanie zmian zmiennych: 0 usunięto, 0 zmieniono, 0 dodano zmienną
2 funkcje z pewną pośrednią zmianą podtypu:
[C]'function foo* first_func()' ma pewne pośrednie zmiany podtypów:
zmieniony typ zwrotu:
w wskazał typ „struct foo”:
rozmiar zmieniony z 32 na 64 bity
1 wstawienie członka danych:
'char foo::m1', z przesunięciem 32 (w bitach)
[C]'function void second_func(foo&)' ma pewne pośrednie zmiany podtypów:
parametr 0 typu „foo&” ma zmiany podtypu:
typ odniesienia „struct foo” został zmieniony, jak podano wcześniej
$
· Teraz użyj słabego trybu abicompat, czyli udostępnij tylko aplikację i
nowa wersja biblioteki:
$ abicompat --słaba aplikacja testowa libtest-1.so
funkcje zdefiniowane w bibliotece
„libtest-1.so”
mają podtypy, które różnią się od aplikacji
„aplikacja testowa”
oczekuje:
funkcja foo* pierwsza_funkcja():
zmieniony typ zwrotu:
w wskazał typ „struct foo”:
rozmiar zmieniony z 32 na 64 bity
1 wstawienie członka danych:
'char foo::m1', z przesunięciem 32 (w bitach)
$
Korzystaj z abicompat online, korzystając z usług onworks.net