abidiff(1): Skillnad mellan sidversioner
Admin (diskussion | bidrag) Ingen redigeringssammanfattning |
Admin (diskussion | bidrag) Ingen redigeringssammanfattning |
||
| Rad 1: | Rad 1: | ||
= ABIDIFF(1) = | |||
== NAMN == | == NAMN == | ||
'''abidiff''' – jämför ABI:er för ELF-filer | '''abidiff''' – jämför ABI:er för ELF-filer.<BR> | ||
'''abidiff''' jämför | '''abidiff''' jämför applikationsbinärgränssnitt (ABI, Application Binary Interface) för två delade bibliotek i ELF-format (Executable and Linkable Format). Verktyget skriver ut en meningsfull rapport som beskriver skillnaderna mellan de två ABI:erna.<BR><BR> | ||
Det här verktyget kan också jämföra de textuella representationerna av ABI:t för två ELF-binärer (såsom de skrivs ut av '''abidw'''), eller jämföra en ELF-binär mot en textuell representation av en annan ELF-binär.<BR><BR> | |||
För en omfattande ABI-ändringsrapport mellan två | För en omfattande ABI-ändringsrapport mellan två indata-delade bibliotek (som även inkluderar ändringar i funktions- och variabelundertypers strukturer) använder '''abidiff''' som standard felsökningsinformation i DWARF-format om den finns. Om DWARF saknas jämför den i stället med felsökningsinformation i CTF- eller BTF-format, om sådan finns. Om ingen felsökningsinformation i dessa format hittas, beaktas enbart ELF-symboler och verktyget rapporterar då om symboler har lagts till eller tagits bort.<BR><BR> | ||
Det här verktyget använder biblioteket libabigail för att analysera binären och dess associerade felsökningsinformation. Så här fungerar det i stora drag:<BR><BR> | |||
När verktyget | När du instruerar verktyget läses en binär och dess associerade felsökningsinformation in och analyseras. Libabigail analyserar som standard typbeskrivningar som kan nås från gränssnitt (funktioner och variabler) som är synliga utanför sin översättningsenhet. När analysen är klar konstrueras en ABI-korpus (ABI Corpus) genom att endast beakta den delmängd av typer som kan nås från gränssnitt kopplade till ELF-symboler som är definierade och exporterade av binären. Det är denna slutliga ABI-korpus som libabigail betraktar som binärens ABI.<BR><BR> | ||
Libabigail | Libabigail kan sedan generera textuella representationer av ABI-korpusar, jämföra dem, analysera ändringar och rapportera om dem.<BR> | ||
== ANROP == | == ANROP == | ||
<pre> | <pre> | ||
abidiff [alternativ] <första-delade-biblioteket> <andra-delade-biblioteket> | |||
</pre> | </pre> | ||
''' | == MILJÖ == | ||
'''abidiff''' läser in två förvalda ''undertryckningsspecifikationsfiler'' (suppression specifications), slår ihop deras innehåll och använder detta för att filtrera bort ABI-ändringar som kan betraktas som falska positiva resultat.<BR><BR> | |||
''' | * '''Förvald systemomfattande undertryckningsfil'''<BR> | ||
Platsen kan anges med miljövariabeln '''LIBABIGAIL_DEFAULT_SYSTEM_SUPPRESSION_FILE'''. Om den inte är satt försöker '''abidiff''' läsa filen <code>$libdir/libabigail/libabigail-default.abignore</code>. Om filen inte finns laddas ingen förvald systemomfattande undertryckningsfil.<BR><BR> | |||
''' | * '''Förvald användarundertryckningsfil'''<BR> | ||
Platsen kan anges med miljövariabeln '''LIBABIGAIL_DEFAULT_USER_SUPPRESSION_FILE'''. Om den inte är satt försöker '''abidiff''' läsa filen <code>$HOME/.abignore</code>. Om filen inte finns laddas ingen förvald användarundertryckningsfil.<BR> | |||
== ALTERNATIV == | |||
{| class="wikitable" | |||
! Flagga | |||
! Argument | |||
'''-- | | ! Beskrivning | | ||
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | |||
| <code>--add-binaries1</code> | | |||
| <code><bin1,bin2,bin3,..></code> | | |||
Vid | | För varje kommaseparerad binär som anges: om binären finns i katalogen som anges med <code>--added-binaries-dir1</code>, så läser '''abidiff''' in dess ABI-korpus och lägger till den i en uppsättning korpusar (en ”ABI Corpus Group”) som inkluderar första argumentet till '''abidiff'''.<BR><BR> | | ||
| Denna korpusgrupp jämförs sedan mot den andra korpusgruppen som ges som andra argumentet till '''abidiff'''. | | |||
''' | | - | | ||
| <code>--add-binaries2</code> | | |||
| <code><bin1,bin2,bin3,..></code> | | |||
| Som <code>--add-binaries1</code>, men för andra argumentet till '''abidiff'''. Om binären hittas i katalogen som anges med <code>--added-binaries-dir2</code> läggs den till i korpusgruppen som inkluderar andra argumentet, och denna jämförs sedan mot den första korpusgruppen. | | |||
Som | | - | | ||
| <code>--added-binaries-dir1</code><BR><code>--abd1</code> | | |||
| <code><katalog-1></code> | | |||
Som | | Används tillsammans med <code>--add-binaries1</code>, <code>--follow-dependencies</code> och <code>--list-dependencies</code>.<BR> | | ||
| Binärer som refereras av dessa alternativ, och som hittas i <code><katalog-1></code>, laddas som ABI-korpus och läggs till i första korpusgruppen. | | |||
| - | | |||
| <code>--added-binaries-dir2</code><BR><code>--abd2</code> | | |||
| <code><katalog-2></code> | | |||
| Motsvarar <code>--added-binaries-dir1</code>, men för andra korpusgruppen. | | |||
| - | | |||
| <code>--added-fns</code> | | |||
| (inget) | | |||
| Visa endast globalt definierade funktioner som har lagts till i <code><andra-delade-biblioteket></code>. | | |||
< | | - | | ||
| <code>--added-vars</code> | | |||
| (inget) | | |||
| Visa endast globala variabler som har lagts till (definierats) i <code><andra-delade-biblioteket></code>. | | |||
| - | | |||
| <code>--allow-non-exported-interfaces</code> | | |||
| (inget) | | |||
| Vid analys av debug-info analyseras typer som kan nås från gränssnitt synliga utanför sin översättningsenhet, och en ABI-korpus byggs sedan för exporterade/definierade ELF-symboler. Det är dessa korpusar som jämförs.<BR><BR> | | |||
| Nackdelen är att ”alla externa gränssnitt” kan ge enormt mycket data (särskilt för applikationer snarare än bibliotek), t.ex. Linuxkärnan, vilket kan bli extremt långsamt.<BR><BR> | | |||
| För ”normalt stora” binärer kan man ofta ha råd med detta; detta alternativ aktiverar den analysen.<BR><BR> | | |||
| Observera: detta är på som standard, utom när binären är Linuxkärnan. | | |||
| - | | |||
| <code>--btf</code> | | |||
| (inget) | | |||
| Vid jämförelse av binärer: extrahera ABI-information från BTF-debug-info om den finns. | | |||
| - | | |||
| <code>--changed-fns</code> | | |||
| (inget) | | |||
</ | | Visa endast ändringar i undertyper för globala funktioner definierade i <code><första-delade-biblioteket></code>. | | ||
| - | | |||
| <code>--changed-vars</code> | | |||
| (inget) | | |||
| Visa endast ändringar i undertyper för globala variabler definierade i <code><första-delade-biblioteket></code>. | | |||
| - | | |||
| <code>--ctf</code> | | |||
| (inget) | | |||
| Vid jämförelse av binärer: extrahera ABI-information från CTF-debug-info om den finns. | | |||
| - | | |||
| <code>--debug-info-dir1</code><BR><code>--d1</code> | | |||
| <code><di-sökväg1></code> | | |||
| Om debug-info för <code><första-delade-biblioteket></code> är separerad i en annan fil: anger var denna separata debug-info finns.<BR><BR> | | |||
| <code><di-sökväg></code> måste peka på rotkatalogen där debug-info är organiserad i ett träd. På Red Hat-baserade system är detta ofta <code><root>/usr/lib/debug</code>.<BR><BR> | | |||
| Kan anges flera gånger; då söker '''abidiff''' i alla angivna rotkataloger.<BR><BR> | | |||
| Inte nödvändigt om split debug-info installerats via pakethanteraren ('''abidiff''' vet då var den finns). | | |||
| - | | |||
| <code>--debug-info-dir2</code><BR><code>--d2</code> | | |||
| <code><di-sökväg2></code> | | |||
| Som <code>--debug-info-dir1</code>, men för <code><andra-delade-biblioteket></code>. | | |||
| - | | |||
| <code>--debug-self-comparison</code> | | |||
| (inget) | | |||
| I detta läge skrivs felmeddelanden ut för typer som misslyckas med typ-kanonisering när en binär jämförs med sig själv. Vid avvikelser aborteras körningen för felsökning i debugger.<BR><BR> | | |||
| Detta är ett valfritt debug-/sanity-check-alternativ. Kräver att libabigail byggts med <code>--enable-debug-self-comparison</code>. | | |||
| - | | |||
| <code>--debug-tc</code> | | |||
| (inget) | | |||
| Lägger typkanonisering under hård granskning: varje typjämförelse görs två gånger (strukturellt och kanoniskt). Om resultaten skiljer sig aborteras processen så att det går att felsöka varför.<BR><BR> | | |||
| Valfritt debug-/sanity-check-alternativ. Kräver libabigail byggt med <code>--enable-debug-type-canonicalization</code>. | | |||
| - | | |||
| <code>--deleted-fns</code> | | |||
| (inget) | | |||
| Visa endast globalt definierade funktioner som togs bort från <code><första-delade-biblioteket></code>. | | |||
| - | | |||
| <code>--deleted-vars</code> | | |||
| (inget) | | |||
| Visa endast globalt definierade variabler som togs bort från <code><första-delade-biblioteket></code>. | | |||
| - | | |||
| <code>--drop</code> | | |||
| <code><regex></code> | | |||
| Vid inläsning av ELF-filerna: droppa globalt definierade funktioner och variabler vars namn matchar <code><regex></code>. Då rapporteras inga ändringar för dem. | | |||
| - | | |||
| <code>--drop-fn</code> | | |||
| <code><regex></code> | | |||
| Som <code>--drop</code>, men endast för funktioner. | | |||
| - | | |||
| <code>--drop-var</code> | | |||
| <code><regex></code> | | |||
| Som <code>--drop</code>, men endast för variabler. | | |||
| - | | |||
| <code>--drop-private-types</code> | | |||
| (inget) | | |||
| Används med <code>--headers-dir1</code>, <code>--headers-dir2</code>, <code>--header-file1</code>, <code>--header-file2</code>.<BR><BR> | | |||
| Med detta alternativ droppas typer som '''inte''' är definierade i headerfilerna helt ur libabigails interna representation av ABI:t (de behöver alltså inte filtreras bort i efterhand).<BR><BR> | | |||
| Utan detta alternativ behålls privata typer internt och filtreras senare i rapporten.<BR><BR> | | |||
| Kan minska minnesanvändning, främst för binärer med många publikt definierade och exporterade typer. | | |||
| - | | |||
| <code>--dump-diff-tree</code> | | |||
| (inget) | | |||
| Efter diff-rapporten: skriv ut en textuell representation av diff-nodträdet som jämförelsemotorn använder för ändrade funktioner/variabler (till stderr), avsett för felsökning.<BR><BR> | | |||
| Relevant endast för ändringar i undertyper; tillagda/borttagna symboler har inget diff-träd. | | |||
| - | | |||
| <code>--exported-interfaces-only</code> | | |||
| (inget) | | |||
| För att mitigera prestandaproblem kan detta alternativ instruera libabigail att endast analysera typer som kan nås från gränssnitt kopplade till definierade och exporterade ELF-symboler (i stället för ”alla externa gränssnitt”).<BR><BR> | | |||
| Detta är på som standard när Linuxkärnan analyseras, annars av som standard. | | |||
| - | | |||
| <code>--fail-no-debug-info</code> | | |||
| (inget) | | |||
| Om ingen debug-info hittas: misslyckas programmet. Utan detta alternativ försöker verktyget ändå jämföra rena ELF-egenskaper. | | |||
| - | | |||
| <code>--follow-dependencies</code><BR><code>--fdeps</code> | | |||
| (inget) | | |||
| För varje beroende till första argumentet: om beroendet hittas i katalogen som anges av <code>--added-binaries-dir1</code>, bygg en ABI-korpus av beroendet och lägg till den i första korpusgruppen.<BR><BR> | | |||
| Motsvarande görs för andra argumentet med <code>--added-binaries-dir2</code>.<BR><BR> | | |||
| Sedan jämförs korpusgrupperna. Dvs '''abidiff''' jämför ”första indata + dess beroenden” mot ”andra indata + dess beroenden”. | | |||
| - | | |||
| <code>--harmless</code> | | |||
| (inget) | | |||
| Visa endast ''ofarliga'' (harmless) ändringar. Som standard filtreras ofarliga ändringar bort för att minska brus. | | |||
| - | | |||
| <code>--headers-dir1</code><BR><code>--hd1</code> | | |||
| <code><headers-katalog-1></code> | | |||
| Anger var de publika headerfilerna för första biblioteket/binären finns. Verktyget filtrerar då bort ABI-ändringar för typer som inte definieras i publika headers.<BR><BR> | | |||
| Kan anges flera gånger, t.ex.:<BR> | | |||
<pre> | <pre> | ||
abidiff --headers-dir1 /some/path \ | |||
--headers-dir1 /some/other/path \ | |||
binary-version-1 binary-version-2 | |||
</pre> | </pre> | ||
|- | |||
| <code>--headers-dir2</code><BR><code>--hd2</code> | |||
| <code><headers-katalog-2></code> | |||
'''-- | | Som <code>--headers-dir1</code>, men för andra biblioteket. | | ||
Visa | | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ||
| <code>--header-file1</code><BR><code>--hf1</code> | | |||
| <code><headerfil-1></code> | | |||
| Anger en publik headerfil för första biblioteket som ska beaktas; filtrerar bort ändringar för typer som inte definieras i publika headers. | | |||
| - | | |||
| <code>--header-file2</code><BR><code>--hf2</code> | | |||
| <code><headerfil-2></code> | | |||
| Som <code>--header-file1</code>, men för andra biblioteket. | | |||
| - | | |||
| <code>--help</code><BR><code>-h</code> | | |||
| (inget) | | |||
| Visa kort hjälp och avsluta. | | |||
| - | | |||
| <code>--ignore-soname</code> | | |||
| (inget) | | |||
| Ignorera skillnader i SONAME vid jämförelse. | | |||
| - | | |||
| <code>--impacted-interfaces</code> | | |||
| (inget) | | |||
| Vid visning av ”leaf changes”: visa listan av påverkade gränssnitt. Ska användas tillsammans med <code>--leaf-changes-only</code>, annars ignoreras den. | | |||
| - | | |||
| <code>--keep</code> | | |||
| <code><regex></code> | | |||
| Vid inläsning: behåll endast globalt definierade funktioner/variabler vars namn matchar <code><regex></code>. Alla andra droppas och syns inte i rapporten. | | |||
| - | | |||
| <code>--keep-fn</code> | | |||
| <code><regex></code> | | |||
| Som <code>--keep</code>, men endast funktioner. | | |||
| - | | |||
| <code>--keep-var</code> | | |||
| <code><regex></code> | | |||
| Som <code>--keep</code>, men endast variabler. | | |||
| - | | |||
| <code>--kmi-whitelist</code><BR><code>-w</code> | | |||
| <code><sökväg-till-vitlista></code> | | |||
| Vid analys av Linuxkärna: pekar på en vitlista över ELF-symbolnamn för funktioner/variabler vars gränssnitt ska beaktas. Denna lista kallas ”Kernel Module Interface white list” (KMI), eftersom man i kärnkontext pratar om gränssnittet mellan kärna och moduler.<BR><BR> | | |||
| Symboler som inte finns i listan beaktas inte. Om alternativet inte anges beaktas hela KMI:t (alla publikt definierade och exporterade funktioner/variabler). | | |||
| - | | |||
| <code>--leaf-changes-only</code><BR><code>-l</code> | | |||
| (inget) | | |||
| Visa endast ”leaf changes”, dvs visa inte påverkningsanalysrapport. Detta alternativ implicerar <code>--redundant</code>.<BR><BR> | | |||
| (I manualen följer ett längre exempel på skillnaden mellan standardutdata och leaf-only-utdata; se avsnittet ”ANVÄNDNINGSEXEMPEL”.) | | |||
| - | | |||
| <code>--list-dependencies</code><BR><code>--ldeps</code> | | |||
| (inget) | | |||
| Lista alla beroenden till indataargumenten som hittas i katalogerna angivna via <code>--added-binaries-dir1</code> och <code>--added-binaries-dir2</code>. | | |||
| - | | |||
| <code>--no-added-syms</code> | | |||
| (inget) | | |||
| Visa inte tillagda funktioner/variabler i rapporten, och visa inte heller deras ELF-symboler. Övriga ändringstyper visas om de inte förbjuds av andra flaggor. | | |||
| - | | |||
| <code>--no-assume-odr-for-cplusplus</code> | | |||
| (inget) | | |||
| Vid analys av binär från C++ med DWARF: libabigail antar One Definition Rule (ODR) för att snabba upp, så typer med samma namn antas lika.<BR><BR> | | |||
| Detta alternativ stänger av antagandet och tvingar libabigail att faktiskt jämföra typerna. | | |||
| - | | |||
| <code>--no-architecture</code> | | |||
| (inget) | | |||
| Ta inte hänsyn till arkitektur vid jämförelse av ABI. | | |||
| - | | |||
| <code>--no-change-categorization</code><BR><code>-x</code> | | |||
| (inget) | | |||
| Stäng av kategorisering av ändringar i ofarliga/skadliga. Kategorisering krävs för filtrering, så detta stänger även av filtreringen.<BR><BR> | | |||
| Syftet är att snabba upp när ändringsgrafen är enorm och du t.ex. vill se leaf-changes utan att bry dig om påverkan. Används ofta med <code>--leaf-changes-only</code>. | | |||
| - | | |||
| <code>--no-corpus-path</code> | | |||
| (inget) | | |||
| Skriv inte ut attributet ”path” för ABI-korpusen. | | |||
| - | | |||
| <code>--no-default-suppression</code> | | |||
| (inget) | | |||
| Ladda inte de förvalda undertryckningsfilerna. | | |||
| - | | |||
| <code>--no-harmful</code> | | |||
| (inget) | | |||
| Visa inte ”skadliga” (harmful) ändringar. Som standard är det annars främst skadliga ändringar som visas. | | |||
| - | | |||
| <code>--no-leverage-dwarf-factorization</code> | | |||
| (inget) | | |||
| Om DWARF debug-info har processats med verktyget '''dwz''' antas typen vara faktoriserad och libabigail kan optimera. Detta alternativ stänger av dessa optimeringar. | | |||
| - | | |||
| <code>--no-linkage-name</code> | | |||
| (inget) | | |||
| Visa inte länkarnamn (linkage names) för tillagda/borttagna/ändrade funktioner eller variabler. | | |||
| - | | |||
| <code>--no-linux-kernel-mode</code> | | |||
| (inget) | | |||
| Utan detta alternativ: om '''abidiff''' upptäcker Linuxkärnebinärer (vmlinux/moduler) beaktas endast symboler listade i sektionerna <code>__ksymtab</code> och <code>__ksymtab_gpl</code>.<BR><BR> | | |||
| Med detta alternativ behandlas binären som en ”vanlig” ELF, och symboler som är definierade och exporterade i ELF-mening beaktas. | | |||
| - | | |||
| <code>--no-redundant</code> | | |||
| (inget) | | |||
| Visa '''inte''' redundanta ändringar (ändringar som redan visats någon annanstans i rapporten). Detta är på som standard. | | |||
| - | | |||
| <code>--no-show-locs</code> | | |||
| (inget) | | |||
| Visa inte information om var i <code><andra-delade-biblioteket></code> respektive typ ändrades. | | |||
| - | | |||
| <code>--no-show-relative-offset-changes</code> | | |||
| (inget) | | |||
| När en medlems offset ändras: utan detta alternativ visas både gammal/ny offset och även hur många bitar ändringen är. Med detta alternativ visas inte ”förändringen i antal bitar”. | | |||
| - | | |||
| <code>--no-unreferenced-symbols</code> | | |||
| (inget) | | |||
| Visa inte ändringsinfo för funktions-/variabelsymboler som inte refereras av någon debug-info. För sådana symboler är ändringen annars typiskt ”tillagd” eller ”borttagen symbol”. | | |||
| - | | |||
| <code>--non-reachable-types</code><BR><code>-t</code> | | |||
| (inget) | | |||
| Analysera och rapportera ändringar för alla typer i binären, även de som inte kan nås från globala funktioner/variabler.<BR><BR> | | |||
| Kan ge kraftig prestandaförsämring om antalet typer är stort. Men om det kombineras med <code>--headers-dir{1,2}</code> och/eller <code>--header-file{1,2}</code> begränsas extra typer till sådana som definieras i publika headers, vilket kan göra det rimligt.<BR><BR> | | |||
| Även suppression-filer (via <code>--suppressions</code>) kan hjälpa att hålla analysmängden nere.<BR><BR> | | |||
| Utan detta alternativ analyseras bara ”nåbara” typer, och endast dessa ändringar upptäcks/rapporteras. | | |||
| - | | |||
| <code>--redundant</code> | | |||
| (inget) | | |||
| Visa redundanta ändringar (motsatsen till <code>--no-redundant</code>). | | |||
| - | | |||
| <code>--show-bits</code> | | |||
| (inget) | | |||
| Visa storlekar och offset i bitar, inte bytes. Detta är på som standard. | | |||
| - | | |||
| <code>--show-bytes</code> | | |||
| (inget) | | |||
| Visa storlekar och offset i bytes, inte bitar. | | |||
| - | | |||
| <code>--show-dec</code> | | |||
| (inget) | | |||
| Visa storlekar och offset i decimal. Detta är på som standard. | | |||
| - | | |||
| <code>--show-hex</code> | | |||
| (inget) | | |||
| Visa storlekar och offset i hexadecimal. | | |||
| - | | |||
| <code>--stat</code> | | |||
| (inget) | | |||
| I stället för detaljerad diff: visa sammanfattande statistik över skillnaderna. | | |||
| - | | |||
| <code>--stats</code> | | |||
| (inget) | | |||
| Skriv ut statistik om olika interna saker. | | |||
| - | | |||
| <code>--suppressions</code><BR><code>--suppr</code> | | |||
| <code><sökväg></code> | | |||
| Använd en suppression-specifikationsfil i <code><sökväg></code>. Kan anges flera gånger; då tas alla filer med i beräkningen.<BR><BR> | | |||
| Observera: om detta inte anges laddas de förvalda suppression-filerna (om de finns). | | |||
| - | | |||
| <code>--symtabs</code> | | |||
| (inget) | | |||
| Visa endast symboltabellerna för första och andra delade biblioteket. | | |||
| - | | |||
| <code>--verbose</code> | | |||
| (inget) | | |||
| Skriv ut utförliga loggar om diverse interna förloppssaker. | | |||
| - | | |||
| <code>--version</code><BR><code>-v</code> | | |||
| (inget) | | |||
| Visa programmets version och avsluta. | | |||
| } | | |||
== RETURVÄRDEN == | == RETURVÄRDEN == | ||
Returkoden är 0 om ABI: | Returkoden från '''abidiff''' är antingen 0 om ABI:t för binärerna som jämförs är lika, eller icke-noll om de skiljer sig eller om verktyget stötte på ett fel.<BR><BR> | ||
I det senare fallet är returkoden ett 8-bitars bitfält där varje bit har en specifik betydelse:<BR><BR> | |||
* 1 | * Bit 1 (värde 1), '''ABIDIFF_ERROR''': ett fel inträffade.<BR> | ||
* 2 | * Bit 2 (värde 2), '''ABIDIFF_USAGE_ERROR''': fel i hur användaren anropade verktyget (okänd flagga, fel antal argument, osv). Om denna bit är satt måste även '''ABIDIFF_ERROR''' vara satt.<BR> | ||
* 4 | * Bit 3 (värde 4), '''ABIDIFF_ABI_CHANGE''': ABI:t skiljer sig mellan binärerna.<BR> | ||
* 8 | * Bit 4 (värde 8), '''ABIDIFF_ABI_INCOMPATIBLE_CHANGE''': ABI:t skiljer sig på ett inkompatibelt sätt. Om denna bit är satt måste även '''ABIDIFF_ABI_CHANGE''' vara satt. Om '''ABIDIFF_ABI_CHANGE''' är satt men '''ABIDIFF_ABI_INCOMPATIBLE_CHANGE''' inte är satt betyder det att ABI:erna kan vara kompatibla eller inte; en människa behöver då granska ändringarna.<BR><BR> | ||
För närvarande finns bara några få typer av ABI-ändringar som alltid | För närvarande finns bara några få typer av ABI-ändringar som alltid leder till att '''ABIDIFF_ABI_INCOMPATIBLE_CHANGE''' sätts:<BR> | ||
* | * Borttagning av symbolen för en funktion eller variabel som varit definierad och exporterad.<BR> | ||
* | * Ändring av index för en medlem i en virtuell funktionstabell (för C++-program och -bibliotek).<BR><BR> | ||
Med tiden kan fler mönster identifieras som alltid utgör inkompatibla ändringar; då kommer koden att uppdateras för att känna igen dessa fall. Om du hittar sådana mönster, rapportera dem gärna.<BR><BR> | |||
Övriga bitar används inte för tillfället.<BR> | |||
1. Upptäcka ABI-ändring i en undertyp till en funktion | == ANVÄNDNINGSEXEMPEL == | ||
=== 1. Upptäcka en ABI-ändring i en undertyp till en funktion === | |||
<pre> | <pre> | ||
| Rad 358: | Rad 413: | ||
</pre> | </pre> | ||
Notera att returkoden är 4, vilket betyder att biten '''ABIDIFF_ABI_CHANGE''' (värde 4) är satt. Det innebär att verktyget kategoriserar ändringen som ''skadlig'' och att en mänsklig granskning krävs.<BR> | |||
2. Upptäcka inkompatibel ABI-ändring i | === 2. Upptäcka en inkompatibel ABI-ändring i typen för en funktion === | ||
<pre> | <pre> | ||
| Rad 421: | Rad 476: | ||
</pre> | </pre> | ||
Notera att returkoden är 12, vilket betyder att både '''ABIDIFF_ABI_CHANGE''' (4) och '''ABIDIFF_ABI_INCOMPATIBLE_CHANGE''' (8) är satta. Det betyder att verktyget kategoriserar ändringen som ''inkompatibel'' – ett ABI-brott.<BR> | |||
3. Upptäcka en | === 3. Upptäcka ytterligare en ändring i en undertyp till en funktion === | ||
<pre> | <pre> | ||
| Rad 479: | Rad 534: | ||
</pre> | </pre> | ||
4. Upptäcka | === 4. Upptäcka att funktioner har tagits bort eller lagts till i ett bibliotek === | ||
<pre> | <pre> | ||
| Rad 530: | Rad 585: | ||
</pre> | </pre> | ||
5. Jämföra två uppsättningar binärer | === 5. Jämföra två uppsättningar binärer via kommandoraden === | ||
<pre> | <pre> | ||
| Rad 540: | Rad 595: | ||
</pre> | </pre> | ||
Observera att filerna | Observera att filerna <code>file2-v1</code> och <code>file2-v2</code> ska finnas i <code>dir1</code> och <code>dir2</code> eller i aktuell katalog.<BR> | ||
6. Jämföra två bibliotek och deras beroenden | === 6. Jämföra två bibliotek och deras beroenden === | ||
<pre> | <pre> | ||
| Rad 551: | Rad 606: | ||
</pre> | </pre> | ||
Detta jämför uppsättningen binärer | Detta jämför uppsättningen binärer bestående av <code>foo</code> och dess beroenden mot uppsättningen bestående av <code>bar</code> och dess beroenden.<BR> | ||
== | == FÖRFATTARE == | ||
Dodji Seketeli | Dodji Seketeli<BR> | ||
== | == UPPHOVSRÄTT == | ||
2014–2025, Red Hat, Inc. | 2014–2025, Red Hat, Inc.<BR> | ||
== | == KOLOFON == | ||
Den här sidan ingår i projektet ''libabigail'' (ABI Generic Analysis and Instrumentation Library). Information om projektet finns på: [https://sourceware.org/libabigail/](https://sourceware.org/libabigail/)<BR><BR> | |||
För felrapport för manualsidan, se: [http://sourceware.org/bugzilla/enter_bug.cgi?product=libabigail](http://sourceware.org/bugzilla/enter_bug.cgi?product=libabigail)<BR><BR> | |||
Den här sidan hämtades från projektets uppströms Git-repo (git://sourceware.org/git/libabigail.git) den 2025-08-11. Vid den tidpunkten var datumet för den senaste commit som hittades i repot 2025-07-28.<BR><BR> | |||
Om du upptäcker renderingsproblem i HTML-versionen, | Om du upptäcker renderingsproblem i HTML-versionen, eller tror att det finns en bättre/nyare källa för sidan, eller har korrigeringar/förbättringar till informationen i detta KOLOFON-avsnitt (som inte är del av originalmanualen), skicka e-post till [man-pages@man7.org](mailto:man-pages@man7.org)<BR> | ||
Versionen från 10 januari 2026 kl. 06.27
ABIDIFF(1)
NAMN
abidiff – jämför ABI:er för ELF-filer.
abidiff jämför applikationsbinärgränssnitt (ABI, Application Binary Interface) för två delade bibliotek i ELF-format (Executable and Linkable Format). Verktyget skriver ut en meningsfull rapport som beskriver skillnaderna mellan de två ABI:erna.
Det här verktyget kan också jämföra de textuella representationerna av ABI:t för två ELF-binärer (såsom de skrivs ut av abidw), eller jämföra en ELF-binär mot en textuell representation av en annan ELF-binär.
För en omfattande ABI-ändringsrapport mellan två indata-delade bibliotek (som även inkluderar ändringar i funktions- och variabelundertypers strukturer) använder abidiff som standard felsökningsinformation i DWARF-format om den finns. Om DWARF saknas jämför den i stället med felsökningsinformation i CTF- eller BTF-format, om sådan finns. Om ingen felsökningsinformation i dessa format hittas, beaktas enbart ELF-symboler och verktyget rapporterar då om symboler har lagts till eller tagits bort.
Det här verktyget använder biblioteket libabigail för att analysera binären och dess associerade felsökningsinformation. Så här fungerar det i stora drag:
När du instruerar verktyget läses en binär och dess associerade felsökningsinformation in och analyseras. Libabigail analyserar som standard typbeskrivningar som kan nås från gränssnitt (funktioner och variabler) som är synliga utanför sin översättningsenhet. När analysen är klar konstrueras en ABI-korpus (ABI Corpus) genom att endast beakta den delmängd av typer som kan nås från gränssnitt kopplade till ELF-symboler som är definierade och exporterade av binären. Det är denna slutliga ABI-korpus som libabigail betraktar som binärens ABI.
Libabigail kan sedan generera textuella representationer av ABI-korpusar, jämföra dem, analysera ändringar och rapportera om dem.
ANROP
abidiff [alternativ] <första-delade-biblioteket> <andra-delade-biblioteket>
MILJÖ
abidiff läser in två förvalda undertryckningsspecifikationsfiler (suppression specifications), slår ihop deras innehåll och använder detta för att filtrera bort ABI-ändringar som kan betraktas som falska positiva resultat.
- Förvald systemomfattande undertryckningsfil
Platsen kan anges med miljövariabeln LIBABIGAIL_DEFAULT_SYSTEM_SUPPRESSION_FILE. Om den inte är satt försöker abidiff läsa filen$libdir/libabigail/libabigail-default.abignore. Om filen inte finns laddas ingen förvald systemomfattande undertryckningsfil.
- Förvald användarundertryckningsfil
Platsen kan anges med miljövariabeln LIBABIGAIL_DEFAULT_USER_SUPPRESSION_FILE. Om den inte är satt försöker abidiff läsa filen$HOME/.abignore. Om filen inte finns laddas ingen förvald användarundertryckningsfil.
ALTERNATIV
| Flagga | Argument |
abidiff --headers-dir1 /some/path \
--headers-dir1 /some/other/path \
binary-version-1 binary-version-2
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
--headers-dir2--hd2
|
<headers-katalog-2>
|
RETURVÄRDENReturkoden från abidiff är antingen 0 om ABI:t för binärerna som jämförs är lika, eller icke-noll om de skiljer sig eller om verktyget stötte på ett fel. I det senare fallet är returkoden ett 8-bitars bitfält där varje bit har en specifik betydelse:
För närvarande finns bara några få typer av ABI-ändringar som alltid leder till att ABIDIFF_ABI_INCOMPATIBLE_CHANGE sätts:
Med tiden kan fler mönster identifieras som alltid utgör inkompatibla ändringar; då kommer koden att uppdateras för att känna igen dessa fall. Om du hittar sådana mönster, rapportera dem gärna. Övriga bitar används inte för tillfället. ANVÄNDNINGSEXEMPEL1. Upptäcka en ABI-ändring i en undertyp till en funktion$ cat -n test-v0.cc
1 // Compile this with:
2 // g++ -g -Wall -shared -o libtest-v0.so test-v0.cc
3
4 struct S0
5 {
6 int m0;
7 };
8
9 void
10 foo(S0* /*parameter_name*/)
11 {
12 // do something with parameter_name.
13 }
$
$ cat -n test-v1.cc
1 // Compile this with:
2 // g++ -g -Wall -shared -o libtest-v1.so test-v1.cc
3
4 struct type_base
5 {
6 int inserted;
7 };
8
9 struct S0 : public type_base
10 {
11 int m0;
12 };
13
14 void
15 foo(S0* /*parameter_name*/)
16 {
17 // do something with 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
$
$ abidiff libtest-v0.so libtest-v1.so; echo "exit code: $?"
Functions changes summary: 0 Removed, 1 Changed, 0 Added function
Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
1 function with some indirect sub-type change:
[C]'function void foo(S0*)' has some indirect sub-type changes:
parameter 0 of type 'S0*' has sub-type changes:
in pointed to type 'struct S0':
size changed from 32 to 64 bits
1 base class insertion:
struct type_base
1 data member change:
'int S0::m0' offset changed from 0 to 32
exit code: 4
$
Notera att returkoden är 4, vilket betyder att biten ABIDIFF_ABI_CHANGE (värde 4) är satt. Det innebär att verktyget kategoriserar ändringen som skadlig och att en mänsklig granskning krävs. 2. Upptäcka en inkompatibel ABI-ändring i typen för en funktion$ cat -n test-v0.cc
1 // Compile this with:
2 // g++ -g -Wall -shared -o libtest-v0.so test-v0.cc
3
4 struct S0
5 {
6 int m0;
7 };
8
9 S0
10 foo()
11 {
12 S0 s = {};
13 return s;
14 }
$
$ cat -n test-v1.cc
1 // Compile this with:
2 // g++ -g -Wall -shared -o libtest-v1.so test-v1.cc
3
4 struct type_base
5 {
6 int inserted;
7 };
8
9 struct S0 : public type_base
10 {
11 int m0;
12 };
13
14 S0
15 foo()
16 {
17 S0 s = {};
18 return s;
19 }
$
$ g++ -g -Wall -shared -o libtest-v0.so test-v0.cc
$ g++ -g -Wall -shared -o libtest-v1.so test-v1.cc
$
$ abidiff libtest-v0.so libtest-v1.so; echo "exit code: $?"
Functions changes summary: 0 Removed, 1 Changed, 0 Added function
Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
1 function with incompatible sub-type changes:
[C] 'function S0 foo(void)' at test-v0.cc:10:1 has some sub-type changes:
return type changed:
type size changed from 32 to 64 (in bits)
1 base class insertion:
struct type_base at test-v1.cc:4:1
1 data member change:
'int m0' offset changed from 0 to 32 (in bits) (by +32 bits)
exit code: 12
$
Notera att returkoden är 12, vilket betyder att både ABIDIFF_ABI_CHANGE (4) och ABIDIFF_ABI_INCOMPATIBLE_CHANGE (8) är satta. Det betyder att verktyget kategoriserar ändringen som inkompatibel – ett ABI-brott. 3. Upptäcka ytterligare en ändring i en undertyp till en funktion$ cat -n test-v0.cc
1 // Compile this with:
2 // g++ -g -Wall -shared -o libtest-v0.so test-v0.cc
3
4 struct S0
5 {
6 int m0;
7 };
8
9 void
10 foo(S0& /*parameter_name*/)
11 {
12 // do something with parameter_name.
13 }
$
$ cat -n test-v1.cc
1 // Compile this with:
2 // g++ -g -Wall -shared -o libtest-v1.so test-v1.cc
3
4 struct S0
5 {
6 char inserted_member;
7 int m0;
8 };
9
10 void
11 foo(S0& /*parameter_name*/)
12 {
13 // do something with 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
$
$ abidiff libtest-v0.so libtest-v1.so; echo "exit code: $?"
Functions changes summary: 0 Removed, 1 Changed, 0 Added function
Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
1 function with some indirect sub-type change:
[C]'function void foo(S0&)' has some indirect sub-type changes:
parameter 0 of type 'S0&' has sub-type changes:
in referenced type 'struct S0':
size changed from 32 to 64 bits
1 data member insertion:
'char S0::inserted_member', at offset 0 (in bits)
1 data member change:
'int S0::m0' offset changed from 0 to 32
exit code: 4
$
4. Upptäcka att funktioner har tagits bort eller lagts till i ett bibliotek$ cat -n test-v0.cc
1 // Compile this with:
2 // g++ -g -Wall -shared -o libtest-v0.so test-v0.cc
3
4 struct S0
5 {
6 int m0;
7 };
8
9 void
10 foo(S0& /*parameter_name*/)
11 {
12 // do something with parameter_name.
13 }
$
$ cat -n test-v1.cc
1 // Compile this with:
2 // g++ -g -Wall -shared -o libtest-v1.so test-v1.cc
3
4 struct S0
5 {
6 char inserted_member;
7 int m0;
8 };
9
10 void
11 bar(S0& /*parameter_name*/)
12 {
13 // do something with 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
$
$ abidiff libtest-v0.so libtest-v1.so; echo "exit code: $?"
Functions changes summary: 1 Removed, 0 Changed, 1 Added functions
Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
1 Removed function:
'function void foo(S0&)' {_Z3fooR2S0}
1 Added function:
'function void bar(S0&)' {_Z3barR2S0}
exit code: 12
$
5. Jämföra två uppsättningar binärer via kommandoraden$ abidiff --add-binaries1=file2-v1 \
--add-binaries2=file2-v2,file2-v1 \
--added-binaries-dir1 dir1 \
--added-binaries-dir2 dir2 \
file1-v1 file1-v2
Observera att filerna 6. Jämföra två bibliotek och deras beroenden$ abidiff --follow-dependencies \
--added-binaries-dir1 /some/where \
--added-binaries-dir2 /some/where/else \
foo bar
Detta jämför uppsättningen binärer bestående av FÖRFATTAREDodji Seketeli UPPHOVSRÄTT2014–2025, Red Hat, Inc. KOLOFONDen här sidan ingår i projektet libabigail (ABI Generic Analysis and Instrumentation Library). Information om projektet finns på: [1](https://sourceware.org/libabigail/) För felrapport för manualsidan, se: [2](http://sourceware.org/bugzilla/enter_bug.cgi?product=libabigail) Den här sidan hämtades från projektets uppströms Git-repo (git://sourceware.org/git/libabigail.git) den 2025-08-11. Vid den tidpunkten var datumet för den senaste commit som hittades i repot 2025-07-28. Om du upptäcker renderingsproblem i HTML-versionen, eller tror att det finns en bättre/nyare källa för sidan, eller har korrigeringar/förbättringar till informationen i detta KOLOFON-avsnitt (som inte är del av originalmanualen), skicka e-post till [man-pages@man7.org](mailto:man-pages@man7.org) |