To jest polecenie abidiff, które można uruchomić w darmowym dostawcy hostingu OnWorks przy użyciu jednej z naszych wielu bezpłatnych stacji roboczych online, takich jak Ubuntu Online, Fedora Online, emulator online Windows lub emulator online MAC OS
PROGRAM:
IMIĘ
abidiff - porównaj ABI plików ELF
abidiff porównuje interfejsy binarne aplikacji (ABI) dwóch współdzielonych bibliotek w ELF
format. Emituje znaczący raport opisujący różnice między dwoma ABI.
Aby uzyskać kompleksowy raport zmian ABI, który zawiera zmiany dotyczące funkcji i zmiennych
podtypy, dwóm wejściowym bibliotekom współdzielonym muszą towarzyszyć ich informacje debugowania
in KRASNOLUD format. Inaczej tylko ELF zgłaszane są symbole, które zostały dodane lub usunięte.
WEZWANIE
abidiff [opcje]
OPCJE
· --help | -h
Wyświetl krótką pomoc dotyczącą polecenia i wyjdź.
· --wersja | -v
Wyświetl wersję programu i wyjdź.
· --debug-info-katalog1 | --d1 <dwuścieżka1>
W przypadkach, gdy informacje debugowania dla pierwsza udostępniona biblioteka dzieli się na a
osobny plik, mówi abidif gdzie znaleźć ten oddzielny plik informacji debugowania.
Należy pamiętać, że dwuścieżka musi wskazywać katalog główny, w którym znajdują się informacje debugowania
ułożony jest w sposób przypominający drzewo. W systemach opartych na Red Hat ten katalog jest
zazwyczaj /usr/lib/debug.
Należy również zauważyć, że ta opcja nie jest obowiązkowa w przypadku dzielonych informacji debugowania instalowanych przez
menedżer pakietów twojego systemu, ponieważ wtedy abidif wie, gdzie go znaleźć.
· --debug-info-katalog2 | --d2 <dwuścieżka2>
Jak --debug-info-katalog1, ta opcja mówi abidif gdzie znaleźć podzielone debugowanie
informacje dla druga biblioteka współdzielona plik.
· --statystyka
Zamiast wyświetlać szczegółowe różnice ABI między pierwsza udostępniona biblioteka i
druga biblioteka współdzielona, wystarczy wyświetlić podsumowanie statystyk dotyczących tych różnic.
· --symtaby
Wyświetlaj tylko tabele symboli pierwsza udostępniona biblioteka i druga biblioteka współdzielona.
· --usunięte-fns
W powstałym raporcie o różnicach między pierwsza udostępniona biblioteka i
druga biblioteka współdzielona, wyświetlają tylko globalnie zdefiniowane funkcje, które zostały usunięte
od pierwsza udostępniona biblioteka.
· --zmieniony-fns
W powstałym raporcie o różnicach między pierwsza udostępniona biblioteka i
druga biblioteka współdzielona, wyświetlają tylko zmiany w podtypach funkcji globalnych
zdefiniowane w pierwsza udostępniona biblioteka.
· --dodane-fns
W powstałym raporcie o różnicach między pierwsza udostępniona biblioteka i
druga biblioteka współdzielona, wyświetlają tylko globalnie zdefiniowane funkcje, do których zostały dodane
druga biblioteka współdzielona.
· --usunięte-zmienne
W powstałym raporcie o różnicach między pierwsza udostępniona biblioteka i
druga biblioteka współdzielona, wyświetlają tylko globalnie zdefiniowane zmienne, które zostały usunięte
od pierwsza udostępniona biblioteka.
· --zmieniono-zmienne
W powstałym raporcie o różnicach między pierwsza udostępniona biblioteka i
druga biblioteka współdzielona, wyświetlają tylko zmiany w podtypach global
zmienne zdefiniowane w pierwsza udostępniona biblioteka
· --dodane-zmienne
W powstałym raporcie o różnicach między pierwsza udostępniona biblioteka i
druga biblioteka współdzielona, wyświetlają tylko zmienne globalne, do których zostały dodane (zdefiniowane).
druga biblioteka współdzielona.
· --nazwa-bez-powiązania
W wynikowym raporcie nie wyświetlaj nazw powiązań dodanych, usuniętych lub
zmienione funkcje lub zmienne.
· --no-show-loc
Nie pokazuj informacji o tym, gdzie w Dopiero shared biblioteka odpowiedni
typ został zmieniony.
· --no-bez-odniesień-symbole
W wynikowym raporcie nie wyświetlaj informacji o zmianie funkcji i
symbole zmiennych, do których nie odwołują się żadne informacje debugowania. Zauważ, że dla
te symbole, do których nie odwołują się żadne informacje debugowania, informacje o zmianie
wyświetlane są dodane lub usunięte symbole.
· --tłumienie | --wspomaganie <ścieżka do tłumienia>
Użyj pliku specyfikacji pomijania znajdującego się pod adresem ścieżka do tłumienia. Zwróć uwagę, że this
opcja może pojawić się wiele razy w wierszu poleceń; całe tłumienie
brane są pod uwagę pliki specyfikacji.
· --upuszczać <regex>
Podczas czytania ww pierwsza udostępniona biblioteka i druga biblioteka współdzielona Pliki wejściowe ELF, upuść
globalnie zdefiniowane funkcje i zmienne, których nazwy pasują do wyrażenia regularnego
regex. W rezultacie żadne zmiany dotyczące tych funkcji lub zmiennych nie zostaną wyemitowane
w raporcie różnicowym.
· --drop-fn <regex>
Podczas czytania ww pierwsza udostępniona biblioteka i druga biblioteka współdzielona Pliki wejściowe ELF, upuść
globalnie zdefiniowane funkcje, których nazwa pasuje do wyrażenia regularnego regex. Jak
wynik, żadna zmiana dotycząca tych funkcji nie zostanie wyemitowana w raporcie różnic.
· --drop-var <regex>
Podczas czytania ww pierwsza udostępniona biblioteka i druga biblioteka współdzielona Pliki wejściowe ELF, upuść
globalnie zdefiniowane zmienne pasujące do wyrażenia regularnego regex.
· --trzymać <regex>
Podczas czytania ww pierwsza udostępniona biblioteka i druga biblioteka współdzielona Pliki wejściowe ELF, zachowaj
globalnie zdefiniowane funkcje i zmienne, których nazwy pasują do wyrażenia regularnego
regex. Wszystkie inne funkcje i zmienne są upuszczane na podłogę i dlatego nie będą
pojawiają się w wynikowym raporcie różnic.
· --keep-fn <regex>
Podczas czytania ww pierwsza udostępniona biblioteka i druga biblioteka współdzielona Pliki wejściowe ELF, zachowaj
globalnie zdefiniowane funkcje, których nazwa pasuje do wyrażenia regularnego regex. Wszystko
inne funkcje są upuszczane na podłogę i dlatego nie pojawią się w wynikach
raport różnic.
· --keep-var <regex>
Podczas czytania ww pierwsza udostępniona biblioteka i druga biblioteka współdzielona Pliki wejściowe ELF, zachowaj
globalnie zdefiniowane, które nazwy pasują do wyrażenia regularnego regex. Wszystkie pozostałe
zmienne są upuszczane na podłogę i dlatego nie pojawią się w wynikowym pliku różnicowym
zgłosić.
· --niegroźny
W raporcie różnic wyświetl tylko nieszkodliwe zmiany. Domyślnie nieszkodliwe
zmiany są odfiltrowywane z raportu różnic, ogranicz bałagan do minimum i miej
większa zmiana, aby wykryć prawdziwe problemy z ABI.
· --nie-szkodliwe
W raporcie różnic nie wyświetlaj szkodliwych zmian. Domyślnie tylko szkodliwe
zmiany są wyświetlane w raporcie różnic.
· --zbędny
W raporcie różnic wyświetlaj zbędne zmiany. Zbędna zmiana to zmiana
który został wyświetlony w innym miejscu raportu.
· --nie-zbędne
W raporcie różnicowym zrób NIE wyświetlać zbędne zmiany. Zbędna zmiana to zmiana
który został wyświetlony w innym miejscu raportu. Ta opcja jest włączona przez
domyślna.
· --brak architektury
Nie bierz pod uwagę architektury podczas porównywania ABI.
· --dump-diff-drzewo
Po raporcie diff wyemituj tekstową reprezentację drzewa węzłów diff używanego przez
porównywarkę do reprezentowania zmienionych funkcji i zmiennych. To
reprezentacja jest emitowana do wyjścia błędu w celu debugowania. Zauważ to
to drzewo różnic dotyczy tylko funkcji i zmiennych, które mają jakiś podtyp
zmiany. Dodane lub usunięte funkcje i zmienne nie mają żadnego drzewa węzłów różnic
z nimi związany.
· --statystyki
Wysyłaj statystyki dotyczące różnych wewnętrznych rzeczy.
· --gadatliwy
Emituj szczegółowe dzienniki dotyczące postępu różnych wewnętrznych rzeczy.
POWRÓT WARTOŚCI
Kod wyjścia z abidif polecenie ma wartość 0, jeśli ABI porównywanych plików binarnych
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
1. Wykrywanie zmiany podtypu funkcji:
$ cat -n test-v0.cc
1 // Skompiluj to z:
2 // g++ -g -Wall -shared -o libtest-v0.so test-v0.cc
3
4 struktura S0
5 {
6 cal m0;
7 };
8
9 pustka
10 foo(S0* /*nazwa_parametru*/)
11 {
12 // zrób coś z nazwa_parametru.
13}
$
$ cat -n test-v1.cc
1 // Skompiluj to z:
2 // g++ -g -Wall -shared -o libtest-v1.so test-v1.cc
3
4 struktura typ_bazy
5 {
6 wstawionych;
7 };
8
9 struktura S0: publiczna baza_typów
10 {
11 cal m0;
12 };
13
14 pustka
15 foo(S0* /*nazwa_parametru*/)
16 {
17 // zrób coś z nazwa_parametru.
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
Podsumowanie zmian funkcji: 0 usunięto, 1 zmieniono, 0 dodano funkcję
Podsumowanie zmian zmiennych: 0 usunięto, 0 zmieniono, 0 dodano zmienną
1 funkcja z pewną pośrednią zmianą podtypu:
[C]'function void foo(S0*)' ma pewne pośrednie zmiany podtypów:
parametr 0 typu „S0*” ma zmiany podtypu:
we wskazanym typie „struct S0”:
rozmiar zmieniony z 32 na 64 bity
1 wstawienie klasy bazowej:
typ_struktury_podstawa
1 zmiana członka danych:
Zmieniono przesunięcie „int S0::m0” z 0 na 32
$
2. Wykrywanie kolejnej zmiany w podtypie funkcji:
$ cat -n test-v0.cc
1 // Skompiluj to z:
2 // g++ -g -Wall -shared -o libtest-v0.so test-v0.cc
3
4 struktura S0
5 {
6 cal m0;
7 };
8
9 pustka
10 foo(S0& /*nazwa_parametru*/)
11 {
12 // zrób coś z nazwa_parametru.
13}
$
$ cat -n test-v1.cc
1 // Skompiluj to z:
2 // g++ -g -Wall -shared -o libtest-v1.so test-v1.cc
3
4 struktura S0
5 {
6 znaków wstawiony_członek;
7 cal m0;
8 };
9
10 pustka
11 foo(S0& /*nazwa_parametru*/)
12 {
13 // zrób coś z nazwa_parametru.
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
Podsumowanie zmian funkcji: 0 usunięto, 1 zmieniono, 0 dodano funkcję
Podsumowanie zmian zmiennych: 0 usunięto, 0 zmieniono, 0 dodano zmienną
1 funkcja z pewną pośrednią zmianą podtypu:
[C]'function void foo(S0&)' ma pewne pośrednie zmiany podtypów:
parametr 0 typu „S0&” ma zmiany podtypu:
w referencyjnym typie „struct S0”:
rozmiar zmieniony z 32 na 64 bity
1 wstawienie członka danych:
'char S0::inserted_member', z przesunięciem 0 (w bitach)
1 zmiana członka danych:
Zmieniono przesunięcie „int S0::m0” z 0 na 32
$
3. Wykrywanie, że funkcje zostały usunięte lub dodane do biblioteki:
$ cat -n test-v0.cc
1 // Skompiluj to z:
2 // g++ -g -Wall -shared -o libtest-v0.so test-v0.cc
3
4 struktura S0
5 {
6 cal m0;
7 };
8
9 pustka
10 foo(S0& /*nazwa_parametru*/)
11 {
12 // zrób coś z nazwa_parametru.
13}
$
$ cat -n test-v1.cc
1 // Skompiluj to z:
2 // g++ -g -Wall -shared -o libtest-v1.so test-v1.cc
3
4 struktura S0
5 {
6 znaków wstawiony_członek;
7 cal m0;
8 };
9
10 pustka
11 bar(S0& /*nazwa_parametru*/)
12 {
13 // zrób coś z nazwa_parametru.
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
Podsumowanie zmian funkcji: 1 usunięto, 0 zmieniono, 1 dodano funkcje
Podsumowanie zmian zmiennych: 0 usunięto, 0 zmieniono, 0 dodano zmienną
1 Usunięta funkcja:
'funkcja pusta foo(S0&)' {_Z3fooR2S0}
1 Dodana funkcja:
'funkcja pusta kreska(S0&)' {_Z3barR2S0}
$
Korzystaj z abidiff online, korzystając z usług onworks.net