abidiff(1): Skillnad mellan sidversioner

Från Wiki.linux.se - Svensk Linux Wiki
Hoppa till navigering Hoppa till sök
(Skapade sidan med 'Nedan är en svensk översättning i **MediaWiki-format** av den text du klistrade in. (Du gav ett utdrag som slutar vid `--version`, så översättningen nedan täcker exakt det som syns i ditt utdrag.) --- == NAMN == '''abidiff''' – jämför ABI:er för ELF-filer '''abidiff''' jämför *Application Binary Interface* (ABI) för två delade bibliotek i ELF-format (*Executable and Linkable Format*). Verktyget skriver ut en meningsfull rapport som beskriver skilln...')
 
 
(6 mellanliggande sidversioner av samma användare visas inte)
Rad 1: Rad 1:
Nedan är en svensk översättning i **MediaWiki-format** av den text du klistrade in. (Du gav ett utdrag som slutar vid `--version`, så översättningen nedan täcker exakt det som syns i ditt utdrag.)
= ABIDIFF(1) — Libabigail =
 
---


== NAMN ==
== NAMN ==
'''abidiff''' – jämför ABI:er för ELF-filer
'''abidiff''' – jämför ABI:er för ELF-filer


'''abidiff''' jämför *Application Binary Interface* (ABI) 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.
'''abidiff''' jämför applikationsbinärgränssnitt (ABI, Application Binary Interface) för två delade bibliotek i ''ELF''-format (Executable and Linkable Format). Programmet skriver 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 (som genereras av '''abidw'''), eller jämföra en ELF-binär mot en textuell representation av en annan ELF-binär.
Det här verktyget kan också jämföra textuella representationer av ABI:t för två ELF-binärer (som skrivs ut av '''abidw''') eller en ELF-binär mot en textuell representation av en annan ELF-binär.


För en omfattande rapport över ABI-ändringar mellan två inmatade delade bibliotek – inklusive ändringar i funktioners och variablers undertyper – använder '''abidiff''' som standard felsökningsinformation i [[DWARF]]-format, om sådan finns. I annat fall jämför den gränssnitt med felsökningsinformation i [[CTF]]- eller [[BTF]]-format, om sådan finns. Om ingen felsökningsinformation i dessa format hittas, beaktas endast [[ELF]]-symboler och rapporten handlar då om att symboler har lagts till eller tagits bort.
För en omfattande ABI-ändringsrapport mellan två indata-delade bibliotek som inkluderar ändringar om funktions- och variabelundertyp(er), använder '''abidiff''' som standard felsökningsinformation i ''DWARF''-format om den finns; annars jämför den gränssnitt med debug-info i ''CTF''- eller ''BTF''-format, om det finns. Till sist, om ingen debug-info i dessa format hittas, beaktas endast ELF-symboler och rapportering sker om att symboler lagts till eller tagits bort.


Det här verktyget använder biblioteket '''libabigail''' för att analysera binären samt tillhörande felsökningsinformation. Här är dess generella arbetssätt.
Det här verktyget använder biblioteket libabigail för att analysera binären samt tillhörande debug-information. Här är dess allmänna arbetssätt.


När verktyget instrueras att göra det läses en binär och dess tillhörande felsökningsinformation in och analyseras. För detta analyserar libabigail som standard beskrivningarna av de typer som kan nås via gränssnitten (funktioner och variabler) som är synliga utanför sin översättningsenhet (*translation unit*). När analysen är klar konstrueras en *Application Binary Interface Corpus* genom att endast beakta den delmängd av typer som är nåbara 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 representerande ABI:t för den analyserade binären.
När verktyget instrueras att göra det läses och analyseras en binär och dess associerade debug-information. För detta analyserar libabigail som standard beskrivningar av de typer som är nåbara från gränssnitt (funktioner och variabler) som är synliga utanför sin översättningsenhet. När analysen är klar byggs ett ABI-korpus (ABI Corpus) genom att bara beakta den delmängd av typer som är nåbara från gränssnitt associerade med ELF-symboler som är definierade och exporterade av binären. Det är detta slutliga ABI-korpus som libabigail ser som representerande ABI:t för den analyserade binären.


Libabigail har sedan möjlighet att generera textuella representationer av ABI-korpusar, jämföra dem, analysera deras ändringar och rapportera om dem.
Libabigail kan sedan generera textuella representationer av ABI-korpora, jämföra dem, analysera förändringar och rapportera om dem.


== ANROP ==
== ANROP ==
'''abidiff''' [alternativ] <första-delade-bibliotek> <andra-delade-bibliotek>
 
<pre>
abidiff [alternativ] <första-delade-biblioteket> <andra-delade-biblioteket>
</pre>


== MILJÖ ==
== MILJÖ ==
'''abidiff''' läser in två standardfiler med *undertryckningsspecifikationer* (*suppression specifications*), slår samman deras innehåll och använder resultatet för att filtrera bort ABI-ändringsrapporter som användare kan uppfatta som falska positiva.
'''abidiff''' laddar två standardfiler för ''suppression specifications'' (undertryckningsspecifikationer), slår ihop deras innehåll och använder dem för att filtrera bort ABI-ändringsrapporter som kan betraktas som falska positiva.


* Standardfil för systemomfattande undertryckningsspecifikation
'''Standard systemomfattande undertryckningsfil'''


  Den hittas via den valfria miljövariabeln '''LIBABIGAIL_DEFAULT_SYSTEM_SUPPRESSION_FILE'''. Om den miljövariabeln inte är satt försöker abidiff läsa undertryckningsfilen '''$libdir/libabigail/libabigail-default.abignore'''. Om den filen inte finns laddas ingen standardfil för systemomfattande undertryckningsspecifikation.
Den hittas via den valfria miljövariabeln '''LIBABIGAIL_DEFAULT_SYSTEM_SUPPRESSION_FILE'''. Om den variabeln inte är satt försöker abidiff ladda filen <pre>$libdir/libabigail/libabigail-default.abignore</pre>. Om filen inte finns laddas ingen systemomfattande standardfil.


* Standardfil för användarens undertryckningsspecifikation
'''Standard undertryckningsfil för användaren'''


  Den hittas via den valfria miljövariabeln '''LIBABIGAIL_DEFAULT_USER_SUPPRESSION_FILE'''. Om den miljövariabeln inte är satt försöker abidiff läsa undertryckningsfilen '''$HOME/.abignore'''. Om den filen inte finns laddas ingen standardfil för användarens undertryckningsspecifikation.
Den hittas via den valfria miljövariabeln '''LIBABIGAIL_DEFAULT_USER_SUPPRESSION_FILE'''. Om den variabeln inte är satt försöker abidiff ladda filen <pre>$HOME/.abignore</pre>. Om filen inte finns laddas ingen användarstandardfil.


== ALTERNATIV ==
== ALTERNATIV ==
'''--add-binaries1''' <''bin1,bin2,bin3,..''>
'''--add-binaries1''' ''<bin1,bin2,bin3,..>''
För var och en av de kommaseparerade binärer som anges som argument till detta alternativ: om binären hittas i katalogen som anges med alternativet '''--added-binaries-dir1''', så läser '''abidiff''' in ABI-korpusen för binären och lägger den till i en uppsättning korpusar (kallad en *ABI Corpus Group*) som inkluderar det första argumentet till '''abidiff'''.
: För varje kommaseparerad binär i argumentet: om binären hittas i katalogen som anges av '''--added-binaries-dir1''', laddar '''abidiff''' ABI-korpuset för binären och lägger till det i en uppsättning korpora (en ”ABI Corpus Group”) som inkluderar första argumentet till '''abidiff'''.
 
: Denna ABI-korpusgrupp jämförs sedan mot den andra korpusgruppen som ges som andra argument till '''abidiff'''.
Denna ABI-korpusgrupp jämförs sedan mot den andra korpusgruppen som anges som argument till '''abidiff'''.
 
'''--add-binaries2''' <''bin1,bin2,bin3,..''>
För var och en av de kommaseparerade binärer som anges som argument till detta alternativ: om binären hittas i katalogen som anges med alternativet '''--added-binaries-dir2''', så läser '''abidiff''' in ABI-korpusen för binären och lägger den till i en uppsättning korpusar (kallad en *ABI Corpus Group*) som inkluderar det andra argumentet till '''abidiff'''.


Denna ABI-korpusgrupp jämförs sedan mot den första korpusgruppen som anges som argument till '''abidiff'''.
'''--add-binaries2''' ''<bin1,bin2,bin3,..>''
: För varje kommaseparerad binär i argumentet: om binären hittas i katalogen som anges av '''--added-binaries-dir2''', laddar '''abidiff''' ABI-korpuset för binären och lägger till det i en uppsättning korpora (en ”ABI Corpus Group”) som inkluderar andra argumentet till '''abidiff'''.
: Denna ABI-korpusgrupp jämförs sedan mot den första korpusgruppen som ges som första argument till '''abidiff'''.


'''--added-binaries-dir1''' | '''--abd1''' <katalog-med-tilläggsbinärer-1>
'''--added-binaries-dir1''' | '''--abd1''' ''<katalog-1>''
Detta alternativ används tillsammans med alternativen '''--add-binaries1''', '''--follow-dependencies''' och '''--list-dependencies'''. Binärer som refereras av dessa alternativ om de hittas i katalogen ''katalog-med-tilläggsbinärer-1'' – läses in som ABI-korpus och läggs till i den första ABI-korpusgruppen som ska användas vid jämförelsen.
: Används tillsammans med '''--add-binaries1''', '''--follow-dependencies''' och '''--list-dependencies'''. Binärer som refereras av dessa alternativ laddas som ABI-korpus om de finns i ''katalog-1'', och läggs till i den första ABI-korpusgruppen som används i jämförelsen.


'''--added-binaries-dir2''' | '''--abd2''' <katalog-med-tilläggsbinärer-2>
'''--added-binaries-dir2''' | '''--abd2''' ''<katalog-2>''
Detta alternativ används tillsammans med alternativen '''--add-binaries2''', '''--follow-dependencies''' och '''--list-dependencies'''. Binärer som refereras av dessa alternativ om de hittas i katalogen ''katalog-med-tilläggsbinärer-2'' – läses in som ABI-korpus och läggs till i den andra ABI-korpusgruppen som ska användas vid jämförelsen.
: Används tillsammans med '''--add-binaries2''', '''--follow-dependencies''' och '''--list-dependencies'''. Binärer som refereras av dessa alternativ laddas som ABI-korpus om de finns i ''katalog-2'', och läggs till i den andra ABI-korpusgruppen som används i jämförelsen.


'''--added-fns'''
'''--added-fns'''
I den resulterande rapporten om skillnader mellan ''första-delade-bibliotek'' och ''andra-delade-bibliotek'': visa endast de globalt definierade funktioner som lades till i ''andra-delade-bibliotek''.
: I rapporten, visa endast globalt definierade funktioner som lades till i ''andra-delade-biblioteket''.


'''--added-vars'''
'''--added-vars'''
I den resulterande rapporten om skillnader mellan ''första-delade-bibliotek'' och ''andra-delade-bibliotek'': visa endast de globala variabler som lades till (definierades) i ''andra-delade-bibliotek''.
: I rapporten, visa endast globala variabler som lades till (definierades) i ''andra-delade-biblioteket''.


'''--allow-non-exported-interfaces'''
'''--allow-non-exported-interfaces'''
När verktyget tittar på felsökningsinformationen som följer med en binär analyserar det beskrivningarna av de typer som kan nås via gränssnitten (funktioner och variabler) som är synliga utanför sin översättningsenhet. När analysen är klar konstrueras en ABI-korpus genom att endast beakta den delmängd av typer som är nåbara från gränssnitt kopplade till [[ELF]]-symboler som är definierade och exporterade av binären. Det är dessa slutliga ABI-korpusar som jämförs av verktyget.
: När verktyget läser debug-info analyseras typer nåbara från gränssnitt synliga utanför sin översättningsenhet. Därefter byggs ABI-korpus normalt bara från typer nåbara från gränssnitt associerade med definierade och exporterade ELF-symboler, och det är de ABI-korpora som jämförs.
 
: Nackdelen är att analys av ”alla synliga gränssnitt” kan bli enorm, särskilt för applikationer (t.ex. Linux-kärnan), vilket kan bli mycket långsamt.
Problemet med detta angreppssätt är dock att analys av alla gränssnitt som är synliga utanför sin översättningsenhet kan innebära mycket data, särskilt när binärerna är program (applikationer) snarare än delade bibliotek. Ett exempel på sådana applikationer är [[Linux-kärnan]]. Att analysera mycket stora ABI-korpusar som dessa kan vara extremt långsamt.
: Med ”lagom stora” binärer kan man dock ha råd att analysera alla sådana gränssnitt med detta alternativ.
 
: Obs: detta alternativ är aktiverat som standard, om man inte är i närvaro av Linux-kärnan.
För en ”normalstor” binär har man däremot ofta råd att låta libabigail analysera alla gränssnitt som är synliga utanför sin översättningsenhet, genom att använda detta alternativ.
 
Observera att detta alternativ är aktiverat som standard, om vi inte befinner oss i fallet [[Linux-kärnan]].


'''--btf'''
'''--btf'''
Vid jämförelse av binärer: extrahera ABI-information från [[BTF]]-felsökningsinformation, om sådan finns.
: Vid jämförelse av binärer, extrahera ABI-information från BTF-debug-info, om den finns.


'''--changed-fns'''
'''--changed-fns'''
I den resulterande rapporten om skillnader mellan ''första-delade-bibliotek'' och ''andra-delade-bibliotek'': visa endast ändringar i undertyper för de globala funktioner som är definierade i ''första-delade-bibliotek''.
: I rapporten, visa endast ändringar i undertyper för globala funktioner definierade i ''första-delade-biblioteket''.


'''--changed-vars'''
'''--changed-vars'''
I den resulterande rapporten om skillnader mellan ''första-delade-bibliotek'' och ''andra-delade-bibliotek'': visa endast ändringar i undertyperna för de globala variabler som är definierade i ''första-delade-bibliotek''.
: I rapporten, visa endast ändringar i undertyper för globala variabler definierade i ''första-delade-biblioteket''.


'''--ctf'''
'''--ctf'''
Vid jämförelse av binärer: extrahera ABI-information från [[CTF]]-felsökningsinformation, om sådan finns.
: Vid jämförelse av binärer, extrahera ABI-information från CTF-debug-info, om den finns.
 
'''--debug-info-dir1''' | '''--d1''' <''di-sökväg1''>
För fall där felsökningsinformationen för ''första-delade-bibliotek'' är separerad till en egen fil anger detta var '''abidiff''' ska hitta den separata felsökningsinformationsfilen.


Observera att ''di-sökväg'' måste peka på rotkatalogen under vilken felsökningsinformationen är organiserad i en trädstruktur. På Red Hat-baserade system är den katalogen vanligtvis '''<rot>/usr/lib/debug'''.
'''--debug-info-dir1''' | '''--d1''' ''<di-sökväg1>''
: För fall där debug-information för ''första-delade-biblioteket'' är uppdelad i en separat fil anger detta var den separata debug-filen finns.
: ''di-sökväg1'' måste peka på rotkatalogen där debug-info ligger i en trädstruktur; på Red Hat-baserade system brukar det vara <pre><rot>/usr/lib/debug</pre>.
: Kan anges flera gånger med olika rotkataloger; då letar '''abidiff''' i alla.
: Alternativet är normalt inte nödvändigt om split debug-info installerats via paket­hanteraren, eftersom '''abidiff''' då vet var den finns.


Detta alternativ kan anges flera gånger med olika rotkataloger. I så fall kan '''abidiff''' leta i alla dessa rotkataloger efter den separata felsökningsinformationen för ''första-delade-bibliotek''.
'''--debug-info-dir2''' | '''--d2''' ''<di-sökväg2>''
 
: Som '''--debug-info-dir1''', men för ''andra-delade-biblioteket''. Kan också anges flera gånger.
Observera också att detta alternativ inte är obligatoriskt för separerad felsökningsinformation som installerats av systemets pakethanterare, eftersom '''abidiff''' då vet var den finns.
 
'''--debug-info-dir2''' | '''--d2''' <''di-sökväg2''>
Som '''--debug-info-dir1''', men anger var '''abidiff''' ska hitta den separata felsökningsinformationen för ''andra-delade-bibliotek''.
 
Detta alternativ kan anges flera gånger med olika rotkataloger. I så fall kan '''abidiff''' leta i alla dessa rotkataloger efter den separata felsökningsinformationen för ''andra-delade-bibliotek''.


'''--debug-self-comparison'''
'''--debug-self-comparison'''
I detta läge skrivs felmeddelanden ut för typer som misslyckas med typkanonisering, i vissa situationer, när man jämför en binär mot sig själv.
: I detta läge skrivs felmeddelanden för typer som misslyckas med typkanonisering när en binär jämförs med sig själv. Vid diskrepanser skickas abort-signal och körningen stoppas. Avsett för felsökning i debugger.
 
: Kräver att libabigail byggts med configure-alternativet <pre>--enable-debug-self-comparison</pre>.
När man jämför en binär mot sig själv bör kanoniska typer i den andra binären vara lika (så långt möjligt) de kanoniska typerna i den första binären. När avvikelser upptäcks i detta läge skickas en abort-signal och körningen stoppas. Alternativet är avsett att användas när man kör verktyget i en debugger, för felsökning.
 
Detta är ett valfritt felsöknings- och rimlighetskontrollalternativ. För att aktivera det måste libabigail-paketet konfigureras med configure-alternativet '''--enable-debug-self-comparison'''.


'''--debug-tc'''
'''--debug-tc'''
I detta läge granskas processen för typkanonisering mycket noggrant. Under typkanoniseringen görs i praktiken varje typjämförelse två gånger: en gång i strukturellt läge (jämför varje undertyp medlem-för-medlem), och en gång med kanonisk jämförelse. De två jämförelserna ska ge samma resultat. Annars skickas en abort-signal och processen kan felsökas för att förstå varför de två jämförelsesätten ger olika resultat.
: Skärper granskningen av typkanonisering: varje typjämförelse görs två gånger (strukturellt och kanoniskt). Om resultaten skiljer aborteras processen. Avsett för felsökning.
 
: Kräver att libabigail byggts med <pre>--enable-debug-type-canonicalization</pre>.
Detta är ett valfritt felsöknings- och rimlighetskontrollalternativ. För att aktivera det måste libabigail-paketet konfigureras med configure-alternativet '''--enable-debug-type-canonicalization'''.


'''--deleted-fns'''
'''--deleted-fns'''
I den resulterande rapporten om skillnader mellan ''första-delade-bibliotek'' och ''andra-delade-bibliotek'': visa endast de globalt definierade funktioner som raderades från ''första-delade-bibliotek''.
: I rapporten, visa endast globalt definierade funktioner som togs bort från ''första-delade-biblioteket''.


'''--deleted-vars'''
'''--deleted-vars'''
I den resulterande rapporten om skillnader mellan ''första-delade-bibliotek'' och ''andra-delade-bibliotek'': visa endast de globalt definierade variabler som raderades från ''första-delade-bibliotek''.
: I rapporten, visa endast globalt definierade variabler som togs bort från ''första-delade-biblioteket''.


'''--drop''' <''regex''>
'''--drop''' ''<regex>''
Vid inläsning av ELF-inmatningsfilerna ''första-delade-bibliotek'' och ''andra-delade-bibliotek'': uteslut globalt definierade funktioner och variabler vars namn matchar det reguljära uttrycket ''regex''. Som följd kommer inga ändringar som rör dessa funktioner/variabler att tas med i diff-rapporten.
: När ELF-indata läses: droppa globalt definierade funktioner och variabler vars namn matchar ''regex''. Då rapporteras inga ändringar som rör dem.


'''--drop-fn''' <''regex''>
'''--drop-fn''' ''<regex>''
Som '''--drop''', men gäller endast globalt definierade funktioner vars namn matchar ''regex''.
: Som '''--drop''', men endast funktioner.


'''--drop-var''' <''regex''>
'''--drop-var''' ''<regex>''
Vid inläsning av ELF-inmatningsfilerna ''första-delade-bibliotek'' och ''andra-delade-bibliotek'': uteslut globalt definierade variabler som matchar det reguljära uttrycket ''regex''.
: Som '''--drop''', men endast variabler.


'''--drop-private-types'''
'''--drop-private-types'''
Detta alternativ används med alternativen '''--headers-dir1''', '''header-file1''', '''header-file2''' och '''--headers-dir2'''. Med detta alternativ tas typer som *INTE* är definierade i headerfilerna bort helt från den interna representation som Libabigail bygger upp för att representera ABI:t. De behöver då inte filtreras bort från den slutliga ABI-ändringsrapporten eftersom de inte ens finns i Libabigails representation.
: Används med '''--headers-dir1''', '''--header-file1''', '''--header-file2''' och '''--headers-dir2'''. Med detta alternativ droppas typer som ''inte'' definieras i headers helt från libabigails interna representation. Utan alternativet behålls de internt och filtreras senare ur rapporten.
 
: Kan minska minnesåtgången och är främst tänkt att optimera minnesförbrukning för binärer med många publika exporterade typer.
Utan detta alternativ behålls dessa privata typer i den interna representationen och filtreras senare bort från rapporten.
 
Detta alternativ kan därmed göra att Libabigail använder mindre minne. Det är främst avsett för att optimera minnesförbrukningen på binärer med många offentligt definierade och exporterade typer.


'''--dump-diff-tree'''
'''--dump-diff-tree'''
Efter diff-rapporten: skriv ut en textuell representation av trädet av diff-noder som jämförelsemotorn använder för att representera ändrade funktioner och variabler. Den representationen skrivs till felutmatningen för felsökningsändamål.
: Efter diff-rapporten, skriv en textuell representation av diff-nodträdet som används för att representera ändrade funktioner och variabler. Skickas till felutmatningen (stderr) för felsökning. Gäller endast ändringar med undertypförändringar; tillagda/borttagna symboler har inget sådant träd.
 
Observera att detta diff-träd endast är relevant för funktioner och variabler som har undertypsändringar. Tillagda eller borttagna funktioner/variabler har inget associerat diff-nodträd.


'''--exported-interfaces-only'''
'''--exported-interfaces-only'''
Som standard analyserar verktyget (via felsökningsinformation) typer som är nåbara från gränssnitt som är synliga utanför sin översättningsenhet. Därefter konstrueras en ABI-korpus genom att endast beakta den delmängd av typer som är nåbara från gränssnitt associerade med definierade och exporterade [[ELF]]-symboler. Det är dessa slutliga ABI-korpusar som jämförs.
: Som standard analyseras typer nåbara från gränssnitt synliga utanför sin översättningsenhet, men ABI-korpus byggs från typer nåbara från gränssnitt associerade med definierade och exporterade ELF-symboler – och det är dessa ABI-korpora som jämförs.
 
: Att analysera alla ”extern-synliga gränssnitt” kan vara mycket datatungt för applikationer (t.ex. Linux-kärnan) och långsamt.
Detta kan vara mycket långsamt för stora applikationsbinärer, som till exempel [[Linux-kärnan]]. För att mildra prestandaproblemet tillåter detta alternativ att libabigail endast analyserar typer som är nåbara från gränssnitt associerade med definierade och exporterade [[ELF]]-symboler.
: Detta alternativ gör att libabigail endast analyserar typer nåbara från gränssnitt associerade med definierade och exporterade ELF-symboler, för bättre prestanda.
 
: Obs: detta alternativ är som standard när Linux-kärnan analyseras; annars av som standard.
Observera att detta alternativ är aktiverat som standard när man analyserar [[Linux-kärnan]]. Annars är det avstängt som standard.


'''--fail-no-debug-info'''
'''--fail-no-debug-info'''
Om ingen felsökningsinformation hittas gör detta alternativ att programmet misslyckas (avslutar med fel). Utan detta alternativ försöker programmet jämföra egenskaper som inte är kopplade till felsökningsinfo, som rena ELF-egenskaper.
: Om ingen debug-info hittas, gör detta att programmet misslyckas. Utan alternativet försöker programmet annars jämföra icke-debug-relaterade egenskaper (t.ex. rena ELF-egenskaper).


'''--follow-dependencies''' | '''--fdeps'''
'''--follow-dependencies''' | '''--fdeps'''
För varje beroende till det första argumentet till '''abidiff''': om beroendet hittas i katalogen som anges med '''--added-binaries-dir1''', konstrueras en ABI-korpus av beroendet och läggs till i en *ABI Corpus Group* som inkluderar det första argumentet.
: För varje beroende till första argumentet: om det hittas i katalogen från '''--added-binaries-dir1''', bygg ett ABI-korpus för beroendet och lägg till det i en ABI-korpusgrupp som inkluderar första argumentet.
 
: Motsvarande görs för andra argumentet med '''--added-binaries-dir2'''.
På samma sätt för varje beroende till det andra argumentet: om beroendet hittas i katalogen som anges med '''--added-binaries-dir2''', konstrueras en ABI-korpus av beroendet och läggs till i en ABI-korpusgrupp som inkluderar det andra argumentet.
: Dessa två ABI-korpusgrupper jämförs sedan. Dvs: jämför ”indata + beroenden” för båda sidor.
 
Dessa två ABI-korpusgrupper jämförs sedan mot varandra.
 
Med andra ord: detta gör att '''abidiff''' jämför uppsättningen bestående av den första inmatningen och dess beroenden mot uppsättningen bestående av den andra inmatningen och dess beroenden.


'''--harmless'''
'''--harmless'''
I diff-rapporten: visa endast de *ofarliga* ändringarna. Som standard filtreras de ofarliga ändringarna bort ur rapporten för att hålla den mindre rörig och göra det lättare att upptäcka verkliga ABI-problem.
: I diff-rapporten, visa endast ''harmlösa'' ändringar. Som standard filtreras harmlösa ändringar bort för mindre brus och större chans att se riktiga ABI-problem.


'''--headers-dir1''' | '''--hd1''' <sökväg-till-headers-katalog-1>
'''--headers-dir1''' | '''--hd1''' ''<headers-katalog-1>''
Anger var de publika headerfilerna för det första delade biblioteket (eller binären i allmänhet) finns, som verktyget ska ta hänsyn till. Verktyget filtrerar då bort ABI-ändringar för typer som inte är definierade i publika headerfiler.
: Anger var publika headers för första biblioteket/binären finns. Verktyget filtrerar då bort ABI-ändringar typer som inte är definierade i publika headers.
 
: Kan anges flera gånger för flera kataloger. Exempel:
Observera att flera publika headerkataloger kan anges för det första delade biblioteket. Då ska alternativet '''--headers-dir1''' finnas med flera gånger på kommandoraden, t.ex.:


<pre>
<pre>
$ abidiff --headers-dir1 /some/path      \
abidiff --headers-dir1 /some/path      \
          --headers-dir1 /some/other/path \
      --headers-dir1 /some/other/path \
          binary-version-1 binary-version-2
      binary-version-1 binary-version-2
</pre>
</pre>


'''--headers-dir2''' | '''--hd2''' <sökväg-till-headers-katalog-2>
'''--headers-dir2''' | '''--hd2''' ''<headers-katalog-2>''
Som '''--headers-dir1''', men för det andra delade biblioteket. Flera kataloger kan anges på samma sätt.
: Som '''--headers-dir1''', men för andra biblioteket. Kan anges flera gånger.


'''--header-file1''' | '''--hf1''' <sökväg-till-headerfil-1>
'''--header-file1''' | '''--hf1''' ''<header-fil-1>''
Anger var en publik headerfil för det första delade biblioteket finns, som verktyget ska ta hänsyn till. Verktyget filtrerar då bort ABI-ändringar för typer som inte är definierade i publika headerfiler.
: Anger en publik headerfil för första biblioteket som ska beaktas, för filtrering till publika typer.


'''--header-file2''' | '''--hf2''' <sökväg-till-headerfil-2>
'''--header-file2''' | '''--hf2''' ''<header-fil-2>''
Som '''--header-file1''', men för det andra delade biblioteket.
: Anger en publik headerfil för andra biblioteket som ska beaktas.


'''--help''' | '''-h'''
'''--help''' | '''-h'''
Visa en kort hjälp om kommandot och avsluta.
: Visa kort hjälp och avsluta.


'''--ignore-soname'''
'''--ignore-soname'''
Ignorera skillnader i SONAME vid jämförelse.
: Ignorera skillnader i SONAME vid jämförelse.


'''--impacted-interfaces'''
'''--impacted-interfaces'''
När man visar *leaf changes* instruerar detta alternativ '''abidiff''' att visa listan över påverkade gränssnitt. Alternativet ska användas tillsammans med '''--leaf-changes-only''', annars ignoreras det.
: När ”leaf changes” visas instruerar detta att listan över påverkade gränssnitt ska visas. Ska användas tillsammans med '''--leaf-changes-only''', annars ignoreras det.
 
'''--keep''' <''regex''>
Vid inläsning av ELF-inmatningsfilerna ''första-delade-bibliotek'' och ''andra-delade-bibliotek'': behåll globalt definierade funktioner och variabler vars namn matchar ''regex''. Alla andra funktioner och variabler kastas bort och kommer därför inte att synas i diff-rapporten.
 
'''--keep-fn''' <''regex''>
Som '''--keep''', men gäller endast funktioner.


'''--keep-var''' <''regex''>
'''--keep''' ''<regex>''
Vid inläsning av ELF-inmatningsfilerna ''första-delade-bibliotek'' och ''andra-delade-bibliotek'': behåll globala variabler vars namn matchar ''regex''. Alla andra variabler kastas bort och syns inte i diff-rapporten.
: När ELF-indata läses: behåll globalt definierade funktioner och variabler vars namn matchar ''regex''. Alla andra droppas och syns inte i rapporten.


'''--kmi-whitelist''' | '''-w''' <''sökväg-till-vitlista''>
'''--keep-fn''' ''<regex>''
Vid analys av en Linux-kärnbinär pekar detta alternativ ut vitlistan över namn på ELF-symboler för funktioner och variabler vars gränssnitt ska beaktas. Vitlistan kallas en ”Kernel Module Interface white list”, eftersom man för kärnan normalt talar om gränssnittet mellan kärnan och moduler (KMI) snarare än ABI.
: Som '''--keep''', men endast funktioner.


Alla andra funktioner/variabler vars ELF-symboler inte finns i vitlistan tas inte med.
'''--keep-var''' ''<regex>''
: Som '''--keep''', men endast variabler.


Om alternativet inte anges (ingen vitlista) beaktas hela KMI:t, dvs. alla offentligt definierade och exporterade funktioner och globala variabler i Linux-kärnans binärer.
'''--kmi-whitelist''' | '''-w''' ''<sökväg-till-whitelist>''
: Vid analys av Linux-kärna: pekar på en vitlista över ELF-symbolnamn (funktioner/variabler) vars ABI ska beaktas. Kallas ”Kernel Module Interface white list” (KMI), eftersom man för kärnan talar om gränssnittet mellan kärna och moduler.
: Symboler som inte finns i vitlistan beaktas inte.
: Om alternativet inte ges beaktas hela KMI (alla publikt definierade och exporterade funktioner samt globala variabler i Linux-kärnan).


'''--leaf-changes-only'''|'''-l'''
'''--leaf-changes-only''' | '''-l'''
Visa endast *leaf changes*, dvs. visa inte rapporten om konsekvens-/påverkansanalys. Detta alternativ implicerar '''--redundant'''.
: Visa endast leaf changes (visa inte impact analysis-rapport). Detta innebär '''--redundant'''.
 
: Typisk utmatning kan visa hur en leaf change nås från ett gränssnitt; med detta alternativ visas endast leaf change, och (om '''--impacted-interfaces''' används) en lista över påverkade gränssnitt.
(Textexemplen i originalmanualen är kod/utdata; säg till om du vill att jag tar med dem i MediaWiki som <pre>-block i samma stil som dina andra sidor.)


'''--list-dependencies''' | '''--ldeps'''
'''--list-dependencies''' | '''--ldeps'''
Listar alla beroenden till indataargumenten till '''abidiff''' som hittas i katalogerna som anges av '''--added-binaries-dir1''' och '''--added-binaries-dir2'''.
: Lista alla beroenden till indataargumenten som hittas i katalogerna från '''--added-binaries-dir1''' och '''--added-binaries-dir2'''.


'''--no-added-syms'''
'''--no-added-syms'''
I rapporten om skillnader mellan ''första-delade-bibliotek'' och ''andra-delade-bibliotek'': visa inte tillagda funktioner eller variabler. Visa inte heller tillagda ELF-symboler för funktioner/variabler. Alla andra sorters ändringar visas, såvida de inte uttryckligen förbjuds av andra alternativ.
: I rapporten, visa inte tillagda funktioner eller variabler. Visa inte heller deras ELF-symboler. Alla andra typer av ändringar visas om de inte förbjuds av andra alternativ.


'''--no-assume-odr-for-cplusplus'''
'''--no-assume-odr-for-cplusplus'''
När libabigail analyserar en binär som kommer från C++-kod med [[DWARF]]-felsökningsinformation antar den *One Definition Rule* (ODR) för att snabba upp analysen. Det betyder att om flera typer har samma namn i binären antas de vara lika.
: Vid analys av C++-binärer med DWARF antar libabigail One Definition Rule för att snabba upp: flera typer med samma namn antas lika. Detta alternativ stänger av antagandet och tvingar verklig jämförelse.
 
Detta alternativ stänger av det antagandet och instruerar libabigail att faktiskt jämföra typerna för att avgöra om de är lika.


'''--no-architecture'''
'''--no-architecture'''
Ta inte hänsyn till arkitektur vid jämförelse av ABI:er.
: Ta inte hänsyn till arkitektur vid ABI-jämförelse.


'''--no-change-categorization''' | '''-x'''
'''--no-change-categorization''' | '''-x'''
Stänger av kategorisering av ändringar i ofarliga/skadliga ändringar. Eftersom kategoriseringen krävs för filtrering av ändringar stänger detta alternativ också av filtreringen.
: Stäng av kategorisering i harmlösa/skadliga ändringar. Eftersom kategorisering krävs för filtrering stängs även filtrering av. Syftet är att snabba upp när förändringsgrafen är enorm och man bara vill titta på t.ex. leaf changes utan att bry sig om impact. Används då ofta med '''--leaf-changes-only'''.
 
Syftet är att snabba upp körningen i fall där ändringsgrafen är enorm och användaren t.ex. bara vill titta på *leaf changes* utan att bry sig om påverkan på gränssnitt. Då används alternativet ofta tillsammans med '''--leaf-changes-only'''.


'''--no-corpus-path'''
'''--no-corpus-path'''
Skriv inte ut sökvägsattributet för ABI-korpusen.
: Skriv inte ut path-attributet för ABI-korpuset.


'''--no-default-suppression'''
'''--no-default-suppression'''
Ladda inte standardfilerna för undertryckningsspecifikationer.
: Ladda inte standardfilerna för undertryckningsspecifikationer.


'''--no-harmful'''
'''--no-harmful'''
Visa inte *skadliga* ändringar i diff-rapporten. Som standard visas endast de skadliga ändringarna i diff-rapporten.
: Visa inte ''skadliga'' ändringar. Som standard är det normalt skadliga ändringar som visas.


'''--no-leverage-dwarf-factorization'''
'''--no-leverage-dwarf-factorization'''
När en binärs [[DWARF]]-felsökningsinformation har bearbetats med verktyget [[dwz]] antas typinformationen redan vara faktoriserad, vilket libabigail använder för prestandaoptimeringar.
: När DWARF-debug-info bearbetats av verktyget DWZ antas typinformationen redan vara faktoriserad och libabigail kan optimera. Detta alternativ stänger av de optimeringarna.
 
Detta alternativ stänger av dessa optimeringar.


'''--no-linkage-name'''
'''--no-linkage-name'''
Visa inte länk-namnen (*linkage names*) för tillagda, borttagna eller ändrade funktioner/variabler i rapporten.
: Visa inte länk-namnen (linkage names) för tillagda, borttagna eller ändrade funktioner/variabler.


'''--no-linux-kernel-mode'''
'''--no-linux-kernel-mode'''
Utan detta alternativ, om abidiff upptäcker att binärerna är Linux-kärnans binärer (antingen vmlinux eller moduler), beaktas endast funktioner/variabler vars ELF-symboler finns listade i sektionerna __ksymtab och __ksymtab_gpl.
: Utan detta alternativ, om abidiff upptäcker Linux-kärn-binärer (vmlinux eller moduler), beaktas bara funktioner/variabler vars ELF-symboler listas i sektionerna __ksymtab och __ksymtab_gpl.
 
: Med detta alternativ behandlas binären som en vanlig ELF och då beaktas ELF-definierade och exporterade symboler.
Med detta alternativ behandlar abidiff binären som en vanlig ELF-binär och beaktar funktioner/variabler som är definierade och exporterade i ELF-mening.


'''--no-redundant'''
'''--no-redundant'''
Visa *INTE* redundanta ändringar i diff-rapporten. En redundant ändring är en ändring som redan visats någon annanstans i rapporten. Detta alternativ är aktiverat som standard.
: Visa ''inte'' redundanta ändringar (ändringar som redan visats någon annanstans i rapporten). Detta är som standard.


'''--no-show-locs'''
'''--no-show-locs'''
Visa inte information om var i ''det andra delade biblioteket'' den aktuella typen ändrades.
: Visa inte information om var i ''andra'' biblioteket respektive typ ändrades.


'''--no-show-relative-offset-changes'''
'''--no-show-relative-offset-changes'''
Utan detta alternativ: när offset för en datamedlem ändras nämner rapporten både gammal och ny offset, samt med hur många bitar datamedlemmen flyttats. Med detta alternativ visas inte det sistnämnda.
: Utan detta alternativ, när offset för en datamedlem ändras, visas både gammal/ny offset och med hur många bitar den flyttades. Med detta alternativ visas inte den senare delen.


'''--no-unreferenced-symbols'''
'''--no-unreferenced-symbols'''
Visa inte ändringsinformation om funktions- och variabelsymboler som inte refereras av någon felsökningsinformation. För symboler som inte refereras av felsökningsinfo är ändringsinformationen som visas antingen ”tillagd” eller ”borttagen” symbol.
: Visa inte ändringsinfo om funktions- och variabelsymboler som inte refereras av någon debug-info. För sådana symboler är den info som annars visas endast tillagda eller borttagna symboler.
 
'''--non-reachable-types'''|'''-t'''
Analysera och rapportera ändringar för alla typer i binären, inklusive de som inte är nåbara från globala funktioner och variabler.
 
Detta kan ge kraftig prestandaförsämring eftersom antalet analyserade typer kan vara mycket stort. Om alternativet kombineras med '''--headers-dir{1,2}''' och/eller '''header-file{1,2}''' begränsas de extra, icke-nåbara typerna till dem som definieras i publika headerfiler, vilket kan göra prestandasmällen acceptabel.
 
Att använda detta tillsammans med undertryckningsspecifikationer (via '''--suppressions''') kan också hjälpa till att hålla antalet analyserade typer under kontroll.


Observera att utan detta alternativ analyseras endast typer som är nåbara från globala funktioner och variabler, och verktyget rapporterar då bara ändringar för dessa nåbara typer.
'''--non-reachable-types''' | '''-t'''
: Analysera och rapportera ändringar för alla typer i binären, inklusive de som inte är nåbara från globala funktioner och variabler.
: Kan ge stor prestandasmäll. Om det paras med '''--headers-dir{1,2}''' och/eller '''--header-file{1,2}''' begränsas extra typer till de som definieras i publika headers, vilket kan göra det mer acceptabelt.
: Tillsammans med undertryckningsspecifikationer ('''--suppressions''') kan man hålla mängden analyserade typer under kontroll.
: Utan detta alternativ analyseras bara typer nåbara från globala funktioner och variabler.


'''--redundant'''
'''--redundant'''
Visa redundanta ändringar i diff-rapporten. En redundant ändring är en ändring som redan visats någon annanstans i rapporten.
: Visa redundanta ändringar (ändringar som redan visats någon annanstans i rapporten).


'''--show-bits'''
'''--show-bits'''
Visa storlekar och offset i bitar, inte byte. Detta alternativ är aktiverat som standard.
: Visa storlekar och offset i bitar, inte bytes. Detta är aktivt som standard.


'''--show-bytes'''
'''--show-bytes'''
Visa storlekar och offset i byte, inte bitar. Som standard visas storlekar och offset i bitar.
: Visa storlekar och offset i bytes, inte bitar.


'''--show-dec'''
'''--show-dec'''
Visa storlekar och offset i decimalform. Detta alternativ är aktiverat som standard.
: Visa storlekar och offset i decimal bas. Detta är aktivt som standard.


'''--show-hex'''
'''--show-hex'''
Visa storlekar och offset i hexadecimalt.
: Visa storlekar och offset i hexadecimal bas.


'''--stat'''
'''--stat'''
Istället för att visa de detaljerade ABI-skillnaderna mellan ''första-delade-bibliotek'' och ''andra-delade-bibliotek'': visa bara sammanfattande statistik om skillnaderna.
: Visa endast sammanfattande statistik över skillnader, i stället för detaljerad diff.


'''--stats'''
'''--stats'''
Skriv ut statistik om olika interna saker.
: Skriv statistik om olika interna saker.


'''--suppressions''' | '''--suppr''' <''sökväg-till-undertryckningar''>
'''--suppressions''' | '''--suppr''' ''<sökväg-till-suppressions>''
Använd en fil med undertryckningsspecifikationer som finns på ''sökväg-till-undertryckningar''. Alternativet kan anges flera gånger; då tas alla angivna undertryckningsfiler med i beräkningen.
: Använd en undertryckningsspecifikationsfil vid ''sökväg-till-suppressions''. Kan anges flera gånger; då beaktas alla angivna filer.
 
: Om alternativet inte anges laddas standard-undertryckningsfiler som standard.
Observera att om detta alternativ inte anges, laddas standardfilerna för undertryckningsspecifikationer.


'''--symtabs'''
'''--symtabs'''
Visa endast symboltabellerna för ''första-delade-bibliotek'' och ''andra-delade-bibliotek''.
: Visa endast symboltabellerna för ''första-delade-biblioteket'' och ''andra-delade-biblioteket''.


'''--verbose'''
'''--verbose'''
Skriv ut utförliga loggar om förloppet för diverse interna saker.
: Skriv utförliga loggar om framsteg och interna saker.


'''--version''' | '''-v'''
'''--version''' | '''-v'''
Visa programmets version och avsluta.
: Visa programversion och avsluta.
 
== RETURVÄRDEN ==
Returkoden från kommandot '''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 särskild betydelse.
 
Första biten (värde 1), '''ABIDIFF_ERROR''', betyder att ett fel inträffade.
 
Andra biten (värde 2), '''ABIDIFF_USAGE_ERROR''', betyder att användaren anropade verktyget felaktigt (t.ex. okänd flagga, fel antal argument, osv). Om denna bit är satt måste även '''ABIDIFF_ERROR''' vara satt.
 
Tredje biten (värde 4), '''ABIDIFF_ABI_CHANGE''', betyder att ABI:t för de jämförda binärerna skiljer sig.
 
Fjärde biten (värde 8), '''ABIDIFF_ABI_INCOMPATIBLE_CHANGE''', betyder att 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 och '''ABIDIFF_INCOMPATIBLE_CHANGE''' ''inte'' är satt innebär det att ABI:erna kan vara kompatibla eller inte – en människa måste granska ändringarna.
 
Obs: just nu finns bara några få typer av ABI-ändringar som leder till att '''ABIDIFF_ABI_INCOMPATIBLE_CHANGE''' sätts:
 
* borttagning av symbolen för en funktion eller variabel som är definierad och exporterad
* ändring av index för en medlem i en virtuell funktionstabell (för C++-program och -bibliotek)
 
Med tiden, när fler mönster hittas som ''alltid'' innebär inkompatibla ABI-ändringar, kommer koden att anpassas för att känna igen dem och sätta '''ABIDIFF_ABI_INCOMPATIBLE_CHANGE''' i dessa fall. Om du hittar sådana mönster, tala om det.
 
Övriga bitar används inte för tillfället.
 
== ANVÄNDNINGSEXEMPEL ==
 
1. Upptäcka en ABI-ändring i en undertyp till en funktion:
 
<pre>
$ 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
$
</pre>
 
Notera att returkoden är 4, vilket betyder att tredje biten '''ABIDIFF_ABI_CHANGE''' med värde 4 är satt. Det betyder att verktyget kategoriserar ABI-ändringen som ''skadlig'' och att användaren behöver granska.
 
2. Upptäcka en inkompatibel ABI-ändring i typen för en funktion:
 
<pre>
$ 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
$
</pre>
 
Notera att returkoden är 12, vilket betyder att både tredje biten '''ABIDIFF_ABI_CHANGE''' (värde 4) och fjärde biten '''ABIDIFF_ABI_INCOMPATIBLE_CHANGE''' (värde 8) är satta. Det betyder att verktyget klassar ändringen som ''inkompatibel'' – ett ABI-brott.
 
3. Upptäcka en annan ändring i en undertyp av en funktion:
 
<pre>
$ 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
$
</pre>
 
4. Upptäcka att funktioner tagits bort eller lagts till i ett bibliotek:
 
<pre>
$ 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
$
</pre>
 
5. Jämföra två uppsättningar binärer som anges på kommandoraden:
 
<pre>
$ abidiff --add-binaries1=file2-v1              \
          --add-binaries2=file2-v2,file2-v1    \
          --added-binaries-dir1 dir1            \
          --added-binaries-dir2 dir2            \
          file1-v1 file1-v2
</pre>
 
Observera att filerna '''file2-v1''' och '''file2-v2''' ska finnas i '''dir1''' respektive '''dir2''' eller i den aktuella katalogen.
 
6. Jämföra två bibliotek och deras beroenden:
 
<pre>
$ abidiff --follow-dependencies                      \
          --added-binaries-dir1 /some/where          \
          --added-binaries-dir2 /some/where/else    \
          foo bar
</pre>
 
Detta jämför uppsättningen binärer som består av '''foo''' och dess beroenden mot uppsättningen som består av '''bar''' och dess beroenden.
 
== FÖRFATTARE ==
Dodji Seketeli
 
== UPPHOVSRÄTT ==
2014–2025, Red Hat, Inc.
 
== KOLOFON ==
Den här sidan är en del av projektet ''libabigail'' (ABI Generic Analysis and Instrumentation Library). Information om projektet finns på ⟨[https://sourceware.org/libabigail/⟩](https://sourceware.org/libabigail/⟩). Om du har en felrapport för den här manualsidan, se ⟨[http://sourceware.org/bugzilla/enter_bug.cgi?product=libabigail⟩](http://sourceware.org/bugzilla/enter_bug.cgi?product=libabigail⟩).
 
= Sidslut =


---
Orginalhemsidan på Engelska :https://man7.org/linux/man-pages/man1/abidiff.1.html
<HR>
Det här är en maskinöversättning av Linux man sidor till svenska. Om du hittar fel är vi tacksamma om du rapporterar dem via formuläret som finns på
https://www.linux.se/kontaka-linux-se/
<BR><BR>Tack till [https://pc-service.se PC-Service] som har  sponsrat [https://www.linux.se Linux.se] med webbhotell.


Om du klistrar in **resten av OPTIONS + RETURN VALUES + USAGE EXAMPLES + AUTHOR + COPYRIGHT + COLOPHON** (eller bara ger länken), kan jag fortsätta i exakt samma MediaWiki-stil och ta med exempelblocken som `<pre>` precis som du brukar göra.
[[Kategori:Linuxmanual grupp 1]]
[[Kategori:Linuxmanual]]

Nuvarande version från 10 januari 2026 kl. 06.50

ABIDIFF(1) — Libabigail

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). Programmet skriver en meningsfull rapport som beskriver skillnaderna mellan de två ABI:erna.

Det här verktyget kan också jämföra textuella representationer av ABI:t för två ELF-binärer (som skrivs ut av abidw) eller 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 inkluderar ändringar om funktions- och variabelundertyp(er), använder abidiff som standard felsökningsinformation i DWARF-format om den finns; annars jämför den gränssnitt med debug-info i CTF- eller BTF-format, om det finns. Till sist, om ingen debug-info i dessa format hittas, beaktas endast ELF-symboler och rapportering sker om att symboler lagts till eller tagits bort.

Det här verktyget använder biblioteket libabigail för att analysera binären samt tillhörande debug-information. Här är dess allmänna arbetssätt.

När verktyget instrueras att göra det läses och analyseras en binär och dess associerade debug-information. För detta analyserar libabigail som standard beskrivningar av de typer som är nåbara från gränssnitt (funktioner och variabler) som är synliga utanför sin översättningsenhet. När analysen är klar byggs ett ABI-korpus (ABI Corpus) genom att bara beakta den delmängd av typer som är nåbara från gränssnitt associerade med ELF-symboler som är definierade och exporterade av binären. Det är detta slutliga ABI-korpus som libabigail ser som representerande ABI:t för den analyserade binären.

Libabigail kan sedan generera textuella representationer av ABI-korpora, jämföra dem, analysera förändringar och rapportera om dem.

ANROP

abidiff [alternativ] <första-delade-biblioteket> <andra-delade-biblioteket>

MILJÖ

abidiff laddar två standardfiler för suppression specifications (undertryckningsspecifikationer), slår ihop deras innehåll och använder dem för att filtrera bort ABI-ändringsrapporter som kan betraktas som falska positiva.

Standard systemomfattande undertryckningsfil

Den hittas via den valfria miljövariabeln LIBABIGAIL_DEFAULT_SYSTEM_SUPPRESSION_FILE. Om den variabeln inte är satt försöker abidiff ladda filen

$libdir/libabigail/libabigail-default.abignore

. Om filen inte finns laddas ingen systemomfattande standardfil.

Standard undertryckningsfil för användaren

Den hittas via den valfria miljövariabeln LIBABIGAIL_DEFAULT_USER_SUPPRESSION_FILE. Om den variabeln inte är satt försöker abidiff ladda filen

$HOME/.abignore

. Om filen inte finns laddas ingen användarstandardfil.

ALTERNATIV

--add-binaries1 <bin1,bin2,bin3,..>

För varje kommaseparerad binär i argumentet: om binären hittas i katalogen som anges av --added-binaries-dir1, laddar abidiff ABI-korpuset för binären och lägger till det i en uppsättning korpora (en ”ABI Corpus Group”) som inkluderar första argumentet till abidiff.
Denna ABI-korpusgrupp jämförs sedan mot den andra korpusgruppen som ges som andra argument till abidiff.

--add-binaries2 <bin1,bin2,bin3,..>

För varje kommaseparerad binär i argumentet: om binären hittas i katalogen som anges av --added-binaries-dir2, laddar abidiff ABI-korpuset för binären och lägger till det i en uppsättning korpora (en ”ABI Corpus Group”) som inkluderar andra argumentet till abidiff.
Denna ABI-korpusgrupp jämförs sedan mot den första korpusgruppen som ges som första argument till abidiff.

--added-binaries-dir1 | --abd1 <katalog-1>

Används tillsammans med --add-binaries1, --follow-dependencies och --list-dependencies. Binärer som refereras av dessa alternativ laddas som ABI-korpus om de finns i katalog-1, och läggs till i den första ABI-korpusgruppen som används i jämförelsen.

--added-binaries-dir2 | --abd2 <katalog-2>

Används tillsammans med --add-binaries2, --follow-dependencies och --list-dependencies. Binärer som refereras av dessa alternativ laddas som ABI-korpus om de finns i katalog-2, och läggs till i den andra ABI-korpusgruppen som används i jämförelsen.

--added-fns

I rapporten, visa endast globalt definierade funktioner som lades till i andra-delade-biblioteket.

--added-vars

I rapporten, visa endast globala variabler som lades till (definierades) i andra-delade-biblioteket.

--allow-non-exported-interfaces

När verktyget läser debug-info analyseras typer nåbara från gränssnitt synliga utanför sin översättningsenhet. Därefter byggs ABI-korpus normalt bara från typer nåbara från gränssnitt associerade med definierade och exporterade ELF-symboler, och det är de ABI-korpora som jämförs.
Nackdelen är att analys av ”alla synliga gränssnitt” kan bli enorm, särskilt för applikationer (t.ex. Linux-kärnan), vilket kan bli mycket långsamt.
Med ”lagom stora” binärer kan man dock ha råd att analysera alla sådana gränssnitt med detta alternativ.
Obs: detta alternativ är aktiverat som standard, om man inte är i närvaro av Linux-kärnan.

--btf

Vid jämförelse av binärer, extrahera ABI-information från BTF-debug-info, om den finns.

--changed-fns

I rapporten, visa endast ändringar i undertyper för globala funktioner definierade i första-delade-biblioteket.

--changed-vars

I rapporten, visa endast ändringar i undertyper för globala variabler definierade i första-delade-biblioteket.

--ctf

Vid jämförelse av binärer, extrahera ABI-information från CTF-debug-info, om den finns.

--debug-info-dir1 | --d1 <di-sökväg1>

För fall där debug-information för första-delade-biblioteket är uppdelad i en separat fil anger detta var den separata debug-filen finns.
di-sökväg1 måste peka på rotkatalogen där debug-info ligger i en trädstruktur; på Red Hat-baserade system brukar det vara
<rot>/usr/lib/debug
.
Kan anges flera gånger med olika rotkataloger; då letar abidiff i alla.
Alternativet är normalt inte nödvändigt om split debug-info installerats via paket­hanteraren, eftersom abidiff då vet var den finns.

--debug-info-dir2 | --d2 <di-sökväg2>

Som --debug-info-dir1, men för andra-delade-biblioteket. Kan också anges flera gånger.

--debug-self-comparison

I detta läge skrivs felmeddelanden för typer som misslyckas med typkanonisering när en binär jämförs med sig själv. Vid diskrepanser skickas abort-signal och körningen stoppas. Avsett för felsökning i debugger.
Kräver att libabigail byggts med configure-alternativet
--enable-debug-self-comparison
.

--debug-tc

Skärper granskningen av typkanonisering: varje typjämförelse görs två gånger (strukturellt och kanoniskt). Om resultaten skiljer aborteras processen. Avsett för felsökning.
Kräver att libabigail byggts med
--enable-debug-type-canonicalization
.

--deleted-fns

I rapporten, visa endast globalt definierade funktioner som togs bort från första-delade-biblioteket.

--deleted-vars

I rapporten, visa endast globalt definierade variabler som togs bort från första-delade-biblioteket.

--drop <regex>

När ELF-indata läses: droppa globalt definierade funktioner och variabler vars namn matchar regex. Då rapporteras inga ändringar som rör dem.

--drop-fn <regex>

Som --drop, men endast funktioner.

--drop-var <regex>

Som --drop, men endast variabler.

--drop-private-types

Används med --headers-dir1, --header-file1, --header-file2 och --headers-dir2. Med detta alternativ droppas typer som inte definieras i headers helt från libabigails interna representation. Utan alternativet behålls de internt och filtreras senare ur rapporten.
Kan minska minnesåtgången och är främst tänkt att optimera minnesförbrukning för binärer med många publika exporterade typer.

--dump-diff-tree

Efter diff-rapporten, skriv en textuell representation av diff-nodträdet som används för att representera ändrade funktioner och variabler. Skickas till felutmatningen (stderr) för felsökning. Gäller endast ändringar med undertypförändringar; tillagda/borttagna symboler har inget sådant träd.

--exported-interfaces-only

Som standard analyseras typer nåbara från gränssnitt synliga utanför sin översättningsenhet, men ABI-korpus byggs från typer nåbara från gränssnitt associerade med definierade och exporterade ELF-symboler – och det är dessa ABI-korpora som jämförs.
Att analysera alla ”extern-synliga gränssnitt” kan vara mycket datatungt för applikationer (t.ex. Linux-kärnan) och långsamt.
Detta alternativ gör att libabigail endast analyserar typer nåbara från gränssnitt associerade med definierade och exporterade ELF-symboler, för bättre prestanda.
Obs: detta alternativ är på som standard när Linux-kärnan analyseras; annars av som standard.

--fail-no-debug-info

Om ingen debug-info hittas, gör detta att programmet misslyckas. Utan alternativet försöker programmet annars jämföra icke-debug-relaterade egenskaper (t.ex. rena ELF-egenskaper).

--follow-dependencies | --fdeps

För varje beroende till första argumentet: om det hittas i katalogen från --added-binaries-dir1, bygg ett ABI-korpus för beroendet och lägg till det i en ABI-korpusgrupp som inkluderar första argumentet.
Motsvarande görs för andra argumentet med --added-binaries-dir2.
Dessa två ABI-korpusgrupper jämförs sedan. Dvs: jämför ”indata + beroenden” för båda sidor.

--harmless

I diff-rapporten, visa endast harmlösa ändringar. Som standard filtreras harmlösa ändringar bort för mindre brus och större chans att se riktiga ABI-problem.

--headers-dir1 | --hd1 <headers-katalog-1>

Anger var publika headers för första biblioteket/binären finns. Verktyget filtrerar då bort ABI-ändringar på typer som inte är definierade i publika headers.
Kan anges flera gånger för flera kataloger. Exempel:
abidiff --headers-dir1 /some/path       \
       --headers-dir1 /some/other/path \
       binary-version-1 binary-version-2

--headers-dir2 | --hd2 <headers-katalog-2>

Som --headers-dir1, men för andra biblioteket. Kan anges flera gånger.

--header-file1 | --hf1 <header-fil-1>

Anger en publik headerfil för första biblioteket som ska beaktas, för filtrering till publika typer.

--header-file2 | --hf2 <header-fil-2>

Anger en publik headerfil för andra biblioteket som ska beaktas.

--help | -h

Visa kort hjälp och avsluta.

--ignore-soname

Ignorera skillnader i SONAME vid jämförelse.

--impacted-interfaces

När ”leaf changes” visas instruerar detta att listan över påverkade gränssnitt ska visas. Ska användas tillsammans med --leaf-changes-only, annars ignoreras det.

--keep <regex>

När ELF-indata läses: behåll globalt definierade funktioner och variabler vars namn matchar regex. Alla andra droppas och syns inte i rapporten.

--keep-fn <regex>

Som --keep, men endast funktioner.

--keep-var <regex>

Som --keep, men endast variabler.

--kmi-whitelist | -w <sökväg-till-whitelist>

Vid analys av Linux-kärna: pekar på en vitlista över ELF-symbolnamn (funktioner/variabler) vars ABI ska beaktas. Kallas ”Kernel Module Interface white list” (KMI), eftersom man för kärnan talar om gränssnittet mellan kärna och moduler.
Symboler som inte finns i vitlistan beaktas inte.
Om alternativet inte ges beaktas hela KMI (alla publikt definierade och exporterade funktioner samt globala variabler i Linux-kärnan).

--leaf-changes-only | -l

Visa endast leaf changes (visa inte impact analysis-rapport). Detta innebär --redundant.
Typisk utmatning kan visa hur en leaf change nås från ett gränssnitt; med detta alternativ visas endast leaf change, och (om --impacted-interfaces används) en lista över påverkade gränssnitt.

--list-dependencies | --ldeps

Lista alla beroenden till indataargumenten som hittas i katalogerna från --added-binaries-dir1 och --added-binaries-dir2.

--no-added-syms

I rapporten, visa inte tillagda funktioner eller variabler. Visa inte heller deras ELF-symboler. Alla andra typer av ändringar visas om de inte förbjuds av andra alternativ.

--no-assume-odr-for-cplusplus

Vid analys av C++-binärer med DWARF antar libabigail One Definition Rule för att snabba upp: flera typer med samma namn antas lika. Detta alternativ stänger av antagandet och tvingar verklig jämförelse.

--no-architecture

Ta inte hänsyn till arkitektur vid ABI-jämförelse.

--no-change-categorization | -x

Stäng av kategorisering i harmlösa/skadliga ändringar. Eftersom kategorisering krävs för filtrering stängs även filtrering av. Syftet är att snabba upp när förändringsgrafen är enorm och man bara vill titta på t.ex. leaf changes utan att bry sig om impact. Används då ofta med --leaf-changes-only.

--no-corpus-path

Skriv inte ut path-attributet för ABI-korpuset.

--no-default-suppression

Ladda inte standardfilerna för undertryckningsspecifikationer.

--no-harmful

Visa inte skadliga ändringar. Som standard är det normalt skadliga ändringar som visas.

--no-leverage-dwarf-factorization

När DWARF-debug-info bearbetats av verktyget DWZ antas typinformationen redan vara faktoriserad och libabigail kan optimera. Detta alternativ stänger av de optimeringarna.

--no-linkage-name

Visa inte länk-namnen (linkage names) för tillagda, borttagna eller ändrade funktioner/variabler.

--no-linux-kernel-mode

Utan detta alternativ, om abidiff upptäcker Linux-kärn-binärer (vmlinux eller moduler), beaktas bara funktioner/variabler vars ELF-symboler listas i sektionerna __ksymtab och __ksymtab_gpl.
Med detta alternativ behandlas binären som en vanlig ELF och då beaktas ELF-definierade och exporterade symboler.

--no-redundant

Visa inte redundanta ändringar (ändringar som redan visats någon annanstans i rapporten). Detta är på som standard.

--no-show-locs

Visa inte information om var i andra biblioteket respektive typ ändrades.

--no-show-relative-offset-changes

Utan detta alternativ, när offset för en datamedlem ändras, visas både gammal/ny offset och med hur många bitar den flyttades. Med detta alternativ visas inte den senare delen.

--no-unreferenced-symbols

Visa inte ändringsinfo om funktions- och variabelsymboler som inte refereras av någon debug-info. För sådana symboler är den info som annars visas endast tillagda eller borttagna symboler.

--non-reachable-types | -t

Analysera och rapportera ändringar för alla typer i binären, inklusive de som inte är nåbara från globala funktioner och variabler.
Kan ge stor prestandasmäll. Om det paras med --headers-dir{1,2} och/eller --header-file{1,2} begränsas extra typer till de som definieras i publika headers, vilket kan göra det mer acceptabelt.
Tillsammans med undertryckningsspecifikationer (--suppressions) kan man hålla mängden analyserade typer under kontroll.
Utan detta alternativ analyseras bara typer nåbara från globala funktioner och variabler.

--redundant

Visa redundanta ändringar (ändringar som redan visats någon annanstans i rapporten).

--show-bits

Visa storlekar och offset i bitar, inte bytes. Detta är aktivt som standard.

--show-bytes

Visa storlekar och offset i bytes, inte bitar.

--show-dec

Visa storlekar och offset i decimal bas. Detta är aktivt som standard.

--show-hex

Visa storlekar och offset i hexadecimal bas.

--stat

Visa endast sammanfattande statistik över skillnader, i stället för detaljerad diff.

--stats

Skriv statistik om olika interna saker.

--suppressions | --suppr <sökväg-till-suppressions>

Använd en undertryckningsspecifikationsfil vid sökväg-till-suppressions. Kan anges flera gånger; då beaktas alla angivna filer.
Om alternativet inte anges laddas standard-undertryckningsfiler som standard.

--symtabs

Visa endast symboltabellerna för första-delade-biblioteket och andra-delade-biblioteket.

--verbose

Skriv utförliga loggar om framsteg och interna saker.

--version | -v

Visa programversion och avsluta.

RETURVÄRDEN

Returkoden från kommandot 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 särskild betydelse.

Första biten (värde 1), ABIDIFF_ERROR, betyder att ett fel inträffade.

Andra biten (värde 2), ABIDIFF_USAGE_ERROR, betyder att användaren anropade verktyget felaktigt (t.ex. okänd flagga, fel antal argument, osv). Om denna bit är satt måste även ABIDIFF_ERROR vara satt.

Tredje biten (värde 4), ABIDIFF_ABI_CHANGE, betyder att ABI:t för de jämförda binärerna skiljer sig.

Fjärde biten (värde 8), ABIDIFF_ABI_INCOMPATIBLE_CHANGE, betyder att 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 och ABIDIFF_INCOMPATIBLE_CHANGE inte är satt innebär det att ABI:erna kan vara kompatibla eller inte – en människa måste granska ändringarna.

Obs: just nu finns bara några få typer av ABI-ändringar som leder till att ABIDIFF_ABI_INCOMPATIBLE_CHANGE sätts:

  • borttagning av symbolen för en funktion eller variabel som är definierad och exporterad
  • ändring av index för en medlem i en virtuell funktionstabell (för C++-program och -bibliotek)

Med tiden, när fler mönster hittas som alltid innebär inkompatibla ABI-ändringar, kommer koden att anpassas för att känna igen dem och sätta ABIDIFF_ABI_INCOMPATIBLE_CHANGE i dessa fall. Om du hittar sådana mönster, tala om det.

Övriga bitar används inte för tillfället.

ANVÄNDNINGSEXEMPEL

1. 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 tredje biten ABIDIFF_ABI_CHANGE med värde 4 är satt. Det betyder att verktyget kategoriserar ABI-ändringen som skadlig och att användaren behöver granska.

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 tredje biten ABIDIFF_ABI_CHANGE (värde 4) och fjärde biten ABIDIFF_ABI_INCOMPATIBLE_CHANGE (värde 8) är satta. Det betyder att verktyget klassar ändringen som inkompatibel – ett ABI-brott.

3. Upptäcka en annan ändring i en undertyp av 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 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 som anges på 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 file2-v1 och file2-v2 ska finnas i dir1 respektive dir2 eller i den aktuella katalogen.

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 som består av foo och dess beroenden mot uppsättningen som består av bar och dess beroenden.

FÖRFATTARE

Dodji Seketeli

UPPHOVSRÄTT

2014–2025, Red Hat, Inc.

KOLOFON

Den här sidan är en del av projektet libabigail (ABI Generic Analysis and Instrumentation Library). Information om projektet finns på ⟨[1](https://sourceware.org/libabigail/⟩). Om du har en felrapport för den här manualsidan, se ⟨[2](http://sourceware.org/bugzilla/enter_bug.cgi?product=libabigail⟩).

Sidslut

Orginalhemsidan på Engelska :https://man7.org/linux/man-pages/man1/abidiff.1.html


Det här är en maskinöversättning av Linux man sidor till svenska. Om du hittar fel är vi tacksamma om du rapporterar dem via formuläret som finns på https://www.linux.se/kontaka-linux-se/

Tack till PC-Service som har sponsrat Linux.se med webbhotell.