abidiff(1): Skillnad mellan sidversioner

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök
Ingen redigeringssammanfattning
Ingen redigeringssammanfattning
Rad 1: Rad 1:
Här är en **fullständig svensk översättning av hela manualsidan `abidiff(1)` i MediaWiki-format**, strikt anpassad till **din etablerade stil**:
Absolut — det som “blir fel” här är att texten har **hårda radbrytningar mitt i meningar** (från HTML/terminal-wrap). Nedan får du en version där jag:


* `==`-rubriker
* tar bort “wrap-radbrytningar” i brödtext (varje stycke blir ett sammanhängande stycke)
* inga HTML-taggar
* gör **en ren rad per flagga** och låter beskrivningen följa på egna rader utan konstiga brytningar
* `<pre>` endast för kod/exempel
* lägger **exempel i `<pre>`** (där radbrytningar ska bevaras)
* flaggor i fet stil, beskrivningar direkt efter
* använder tomrad mellan stycken/alternativ för bättre läsbarhet i MediaWiki
* inga entity- eller bildinslag
 
* hela innehållet med: NAMN, ANROP, MILJÖ, ALTERNATIV, RETURVÄRDEN, EXEMPEL, UPPHOV, COPYRIGHT, COLOFON
Kopiera/klistra in som den är:


---
---
Rad 13: Rad 13:
'''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*). Programmet genererar en meningsfull rapport som beskriver skillnaderna mellan de två ABI:erna.
'''abidiff''' jämför *Application Binary Interface* (ABI) för två delade bibliotek i ELF-format (*Executable and Linkable Format*). Den genererar en meningsfull rapport som beskriver skillnaderna mellan de två ABI:erna.


Verktyget kan även jämföra textuella representationer av ABI:t för två ELF-binärer (som genereras av '''abidw'''), eller jämföra en ELF-binär med en textuell representation av en annan ELF-binär.
Verktyget kan också jämföra textuella representationer 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.


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örs 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 avser enbart tillägg eller borttagning av symboler.
För en omfattande ABI-ändringsrapport mellan två inmatade delade bibliotek som inkluderar ändringar i funktioners och variablers undertyper använder '''abidiff''' som standard felsökningsinformation i DWARF-format, om sådan finns. Annars 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 om att symboler lagts till eller tagits bort.


Verktyget använder biblioteket '''libabigail''' för att analysera binären samt dess tillhörande felsökningsinformation.
Verktyget använder biblioteket '''libabigail''' för att analysera binären samt dess tillhörande felsökningsinformation. Här är det generella arbetssättet.


När en binär analyseras granskar libabigail som standard de typer som är nåbara från gränssnitt (funktioner och variabler) som är synliga utanför sin översättningsenhet. Därefter konstrueras en ABI-korpus som endast omfattar de typer som är nåbara från definierade och exporterade ELF-symboler. Det är denna ABI-korpus som betraktas som binärens ABI.
När verktyget instrueras att göra det läses en binär och dess felsökningsinformation in och analyseras. För detta analyserar libabigail som standard beskrivningarna 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 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 denna slutliga ABI-korpus som libabigail betraktar som representerande ABI:t för den analyserade binären.


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


== ANROP ==
== ANROP ==
Rad 29: Rad 29:


== MILJÖ ==
== MILJÖ ==
'''abidiff''' laddar två standardfiler för *undertryckningsspecifikationer*, slår samman deras innehåll och använder dem för att filtrera bort ABI-ändringar som kan betraktas som falska positiva.
'''abidiff''' laddar två standardfiler med *undertryckningsspecifikationer* (*suppression specification files*), slår samman deras innehåll och använder det för att filtrera bort ABI-ändringsrapporter som kan uppfattas som falska positiva.


'''Standardfil för systemomfattande undertryckningar'''
'''Standardfil för systemomfattande undertryckningsspecifikation'''
Styrs av miljövariabeln '''LIBABIGAIL_DEFAULT_SYSTEM_SUPPRESSION_FILE'''.
Den hittas via den valfria 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 systemomfattande standardfil.
Om den inte är satt försöker abidiff läsa filen
'''$libdir/libabigail/libabigail-default.abignore'''.
Om filen saknas laddas ingen systemomfattande standardfil.


'''Standardfil för användarundertryckningar'''
'''Standardfil för användarundertryckningsspecifikation'''
Styrs av miljövariabeln '''LIBABIGAIL_DEFAULT_USER_SUPPRESSION_FILE'''.
Den hittas via den valfria 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 användarstandardfil.
Om den inte är satt försöker abidiff läsa filen
'''$HOME/.abignore'''.
Om filen saknas laddas ingen användarspecifik standardfil.


== ALTERNATIV ==
== ALTERNATIV ==
'''--add-binaries1''' <bin1,bin2,...>
'''--add-binaries1''' <bin1,bin2,bin3,..>
Läser in ABI-korpusar för angivna binärer (om de hittas via '''--added-binaries-dir1''') och lägger dem till i den första ABI-korpusgruppen.
För varje kommaseparerad binär som anges: om binären hittas i katalogen som anges med '''--added-binaries-dir1''' så läser '''abidiff''' in ABI-korpusen för binären och lägger till den i en uppsättning korpusar (en *ABI Corpus Group*) som inkluderar första argumentet till '''abidiff'''.
Denna ABI-korpusgrupp jämförs sedan mot den andra korpusgruppen som anges som argument till '''abidiff'''.


'''--add-binaries2''' <bin1,bin2,...>
'''--add-binaries2''' <bin1,bin2,bin3,..>
Som '''--add-binaries1''', men för den andra ABI-korpusgruppen.
Som '''--add-binaries1''', men lägger till binärer i gruppen som inkluderar andra argumentet till '''abidiff'''. Denna grupp jämförs sedan mot den första gruppen.


'''--added-binaries-dir1''', '''--abd1''' <katalog>
'''--added-binaries-dir1''', '''--abd1''' <katalog-1>
Katalog där extra binärer för första gruppen söks.
Används tillsammans med '''--add-binaries1''', '''--follow-dependencies''' och '''--list-dependencies'''. Binärer som refereras av dessa alternativ och som hittas i katalog-1 läses in som ABI-korpus och läggs till i första ABI-korpusgruppen.


'''--added-binaries-dir2''', '''--abd2''' <katalog>
'''--added-binaries-dir2''', '''--abd2''' <katalog-2>
Katalog där extra binärer för andra gruppen söks.
Som '''--added-binaries-dir1''', men för andra ABI-korpusgruppen.


'''--added-fns'''
'''--added-fns'''
Visa endast globalt definierade funktioner som lagts till i det andra biblioteket.
Visa endast globalt definierade funktioner som lades till i <andra-delade-bibliotek>.


'''--added-vars'''
'''--added-vars'''
Visa endast globala variabler som lagts till i det andra biblioteket.
Visa endast globala variabler som lades till (definierades) i <andra-delade-bibliotek>.


'''--allow-non-exported-interfaces'''
'''--allow-non-exported-interfaces'''
Analysera även gränssnitt som inte är exporterade. Aktiverat som standard, utom vid analys av Linux-kärnan.
När verktyget analyserar felsökningsinformation analyseras typer nåbara från gränssnitt synliga utanför sin översättningsenhet. Därefter byggs en ABI-korpus av typer nåbara från gränssnitt kopplade till definierade och exporterade ELF-symboler, och det är dessa ABI-korpusar som jämförs.
Detta kan bli mycket data (och långsamt) för applikationer, t.ex. Linux-kärnan. För “normalstora” binärer kan man ofta analysera alla synliga gränssnitt genom att använda detta alternativ.
Observera att detta alternativ är aktiverat som standard, utom när Linux-kärnan analyseras.


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


'''--changed-fns'''
'''--changed-fns'''
Visa endast ändringar i undertyper för globala funktioner.
Visa endast ändringar i undertyper för globalt definierade funktioner i <första-delade-bibliotek>.


'''--changed-vars'''
'''--changed-vars'''
Visa endast ändringar i undertyper för globala variabler.
Visa endast ändringar i undertyper för globalt definierade variabler i <första-delade-bibliotek>.


'''--ctf'''
'''--ctf'''
Extrahera ABI-information från CTF-felsökningsinformation.
Vid jämförelse av binärer: extrahera ABI-information från CTF-felsökningsinformation, om sådan finns.


'''--debug-info-dir1''', '''--d1''' <sökväg>
'''--debug-info-dir1''', '''--d1''' <di-sökväg1>
Anger rotkatalog för separerad felsökningsinformation för första biblioteket.
Om felsökningsinformation för <första-delade-bibliotek> ligger i en separat fil anger detta var abidiff ska hitta den filen.
di-sökväg måste peka på rotkatalogen under vilken felsökningsinformationen ligger i en trädstruktur (på Red Hat-baserade system ofta <root>/usr/lib/debug).
Alternativet kan anges flera gånger med olika rotkataloger; då letar abidiff i alla dessa.


'''--debug-info-dir2''', '''--d2''' <sökväg>
'''--debug-info-dir2''', '''--d2''' <di-sökväg2>
Som ovan, men för andra biblioteket.
Som '''--debug-info-dir1''', men för <andra-delade-bibliotek>.


'''--debug-self-comparison'''
'''--debug-self-comparison'''
Felsökningsläge för självjämförelse; aborterar vid typinkonsekvenser.
Felsökningsläge som kan abortera körningen om avvikelser upptäcks när en binär jämförs med sig själv. Avsett för felsökning i debugger. Kräver att libabigail byggts med --enable-debug-self-comparison.


'''--debug-tc'''
'''--debug-tc'''
Noggrann granskning av typkanonisering; utför dubbel jämförelse av typer.
Felsökningsläge som granskar typkanonisering: varje typjämförelse görs både strukturellt och kanoniskt och resultaten måste matcha, annars aborteras körningen. Kräver --enable-debug-type-canonicalization.


'''--deleted-fns'''
'''--deleted-fns'''
Visa endast funktioner som tagits bort.
Visa endast globalt definierade funktioner som togs bort från <första-delade-bibliotek>.


'''--deleted-vars'''
'''--deleted-vars'''
Visa endast variabler som tagits bort.
Visa endast globalt definierade variabler som togs bort från <första-delade-bibliotek>.


'''--drop''' <regex>
'''--drop''' <regex>
Uteslut funktioner och variabler vars namn matchar uttrycket.
Vid inläsning av ELF-filerna: uteslut globalt definierade funktioner och variabler vars namn matchar regex. Då rapporteras inga ändringar som involverar dessa.


'''--drop-fn''' <regex>
'''--drop-fn''' <regex>
Rad 105: Rad 104:


'''--drop-private-types'''
'''--drop-private-types'''
Uteslut helt typer som inte definieras i publika headerfiler.
Används med '''--headers-dir1''', '''--headers-dir2''', '''--header-file1''' och '''--header-file2'''. Med detta alternativ tas typer som INTE är definierade i publika headers bort helt ur libabigails interna ABI-representation, så de behöver inte filtreras bort senare. Detta kan minska minnesåtgången.


'''--dump-diff-tree'''
'''--dump-diff-tree'''
Visa det interna diff-trädet efter rapporten (felsökning).
Efter diff-rapporten: skriv en textuell representation av diff-nodträdet (felsökningssyfte) till felutmatningen. Relevant endast för funktioner/variabler som har undertypsändringar.


'''--exported-interfaces-only'''
'''--exported-interfaces-only'''
Analysera endast typer som är nåbara från exporterade ELF-symboler.
För att minska mängden data kan detta alternativ begränsa analysen till typer som är nåbara från gränssnitt kopplade till definierade och exporterade ELF-symboler. Detta är aktiverat som standard för Linux-kärnan, annars avstängt som standard.


'''--fail-no-debug-info'''
'''--fail-no-debug-info'''
Avsluta med fel om ingen felsökningsinformation hittas.
Om ingen felsökningsinformation hittas: avsluta med fel. Utan detta alternativ försöker programmet jämföra icke-debug-relaterade egenskaper (t.ex. rena ELF-egenskaper).


'''--follow-dependencies''', '''--fdeps'''
'''--follow-dependencies''', '''--fdeps'''
Jämför även beroenden till inmatade binärer.
Konstruera ABI-korpusar även för beroenden som hittas via '''--added-binaries-dir1''' respektive '''--added-binaries-dir2''', och jämför sedan de två uppsättningarna (inmatning + beroenden).


'''--harmless'''
'''--harmless'''
Visa endast ofarliga ändringar.
Visa endast ofarliga (*harmless*) ändringar. Som standard filtreras ofarliga ändringar bort för att göra rapporten mindre rörig.


'''--headers-dir1''', '''--hd1''' <katalog>
'''--headers-dir1''', '''--hd1''' <headers-katalog-1>
Katalog(er) med publika headerfiler för första biblioteket.
Anger var publika headers för första biblioteket finns. ABI-ändringar för typer som inte definieras i publika headers filtreras bort. Kan anges flera gånger.


'''--headers-dir2''', '''--hd2''' <katalog>
<pre>
Som ovan, men för andra biblioteket.
$ abidiff --headers-dir1 /some/path      \
          --headers-dir1 /some/other/path \
          binary-version-1 binary-version-2
</pre>


'''--header-file1''', '''--hf1''' <fil>
'''--headers-dir2''', '''--hd2''' <headers-katalog-2>
Specifik publik headerfil för första biblioteket.
Som '''--headers-dir1''', men för andra biblioteket. Kan anges flera gånger.


'''--header-file2''', '''--hf2''' <fil>
'''--header-file1''', '''--hf1''' <header-fil-1>
Specifik publik headerfil för andra biblioteket.
Anger en publik headerfil för första biblioteket.
 
'''--header-file2''', '''--hf2''' <header-fil-2>
Anger en publik headerfil för andra biblioteket.


'''--help''', '''-h'''
'''--help''', '''-h'''
Visa hjälpinformation och avsluta.
Visa kort hjälp och avsluta.


'''--ignore-soname'''
'''--ignore-soname'''
Rad 141: Rad 146:


'''--impacted-interfaces'''
'''--impacted-interfaces'''
Visa vilka gränssnitt som påverkas av leaf-ändringar.
Vid visning av leaf-ändringar: visa lista över påverkade gränssnitt. Används tillsammans med '''--leaf-changes-only''', annars ignoreras det.


'''--keep''' <regex>
'''--keep''' <regex>
Behåll endast symboler som matchar uttrycket.
Behåll endast globalt definierade funktioner/variabler vars namn matchar regex. Alla andra utesluts och syns inte i rapporten.


'''--keep-fn''' <regex>
'''--keep-fn''' <regex>
Rad 152: Rad 157:
Som '''--keep''', men endast variabler.
Som '''--keep''', men endast variabler.


'''--kmi-whitelist''', '''-w''' <fil>
'''--kmi-whitelist''', '''-w''' <vitlista>
Vitlista ELF-symboler vid analys av Linux-kärnan (KMI).
Vid analys av Linux-kärnans binär: vitlista ELF-symbolnamn för funktioner/variabler vars gränssnitt ska beaktas (KMI). Om ingen vitlista anges beaktas hela KMI:t.


'''--leaf-changes-only''', '''-l'''
'''--leaf-changes-only''', '''-l'''
Visa endast leaf-ändringar, utan konsekvensanalys.
Visa endast leaf-ändringar (ingen konsekvens-/påverkansanalys). Detta alternativ implicerar '''--redundant'''.
 
Typisk utdata:
 
<pre>
$ abidiff libtest-v0.so libtest-v1.so
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 fn(C&)' at test-v1.cc:13:1 has some indirect sub-type changes:
    parameter 1 of type 'C&' has sub-type changes:
      in referenced type 'struct C' at test-v1.cc:7:1:
        type size hasn't changed
        1 data member change:
        type of 'leaf* C::m0' changed:
          in pointed to type 'struct leaf' at test-v1.cc:1:1:
            type size changed from 32 to 64 bits
            1 data member insertion:
              'char leaf::m1', at offset 32 (in bits) at test-v1.cc:4:1
$
</pre>
 
Med leaf-läge:
 
<pre>
$ abidiff -l libtest-v0.so libtest-v1.so
'struct leaf' changed:
  type size changed from 32 to 64 bits
  1 data member insertion:
    'char leaf::m1', at offset 32 (in bits) at test-v1.cc:4:1
 
  one impacted interface:
    function void fn(C&)
$
</pre>


'''--list-dependencies''', '''--ldeps'''
'''--list-dependencies''', '''--ldeps'''
Lista beroenden som hittas via tilläggskataloger.
Lista alla beroenden till indataargumenten som hittas i katalogerna angivna med '''--added-binaries-dir1''' och '''--added-binaries-dir2'''.


'''--no-added-syms'''
'''--no-added-syms'''
Visa inte tillagda symboler.
Visa inte tillagda funktioner/variabler och inte heller deras ELF-symboler. Andra ändringar visas om de inte stoppas av andra alternativ.


'''--no-assume-odr-for-cplusplus'''
'''--no-assume-odr-for-cplusplus'''
Inaktivera antagandet om *One Definition Rule* för C++.
Inaktivera antagandet om *One Definition Rule* (ODR) vid analys av C++ med DWARF; libabigail jämför då faktiskt typer med samma namn istället för att anta att de är lika.


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


'''--no-change-categorization''', '''-x'''
'''--no-change-categorization''', '''-x'''
Inaktivera kategorisering av ändringar.
Inaktivera kategorisering (harmless/harmful). Eftersom kategorisering krävs för filtrering stänger detta även av filtrering. Användbart för stora ändringsgrafer och tillsammans med '''--leaf-changes-only'''.


'''--no-corpus-path'''
'''--no-corpus-path'''
Visa inte sökväg för ABI-korpus.
Skriv inte ut path-attributet för ABI-korpusen.


'''--no-default-suppression'''
'''--no-default-suppression'''
Ladda inga standardfiler för undertryckningar.
Ladda inte standardfilerna för undertryckningar.


'''--no-harmful'''
'''--no-harmful'''
Visa inte skadliga ändringar.
Visa inte skadliga (*harmful*) ändringar. Som standard visas annars endast skadliga ändringar.


'''--no-leverage-dwarf-factorization'''
'''--no-leverage-dwarf-factorization'''
Inaktivera DWZ-relaterade optimeringar.
Inaktivera optimeringar som används när DWARF har faktoriserats med DWZ.


'''--no-linkage-name'''
'''--no-linkage-name'''
Visa inte länk-namn i rapporten.
Visa inte länk-namn (*linkage names*) för tillagda/borttagna/ändrade symboler.


'''--no-linux-kernel-mode'''
'''--no-linux-kernel-mode'''
Behandla Linux-kärnan som vanlig ELF-binär.
Behandla Linux-kärnans binärer som vanliga ELF-binärer och använd ELF-exportlogik istället för __ksymtab/__ksymtab_gpl.


'''--no-redundant'''
'''--no-redundant'''
Visa inte redundanta ändringar (standard).
Visa INTE redundanta ändringar (aktiverat som standard).


'''--no-show-locs'''
'''--no-show-locs'''
Visa inte platsinformation för ändringar.
Visa inte var i det andra biblioteket respektive typ ändrades.


'''--no-show-relative-offset-changes'''
'''--no-show-relative-offset-changes'''
Visa inte relativa offset-förändringar.
Visa inte hur många bitar en offset flyttats (visa bara gamla och nya offset).


'''--no-unreferenced-symbols'''
'''--no-unreferenced-symbols'''
Visa inte symboler utan kopplad felsökningsinformation.
Visa inte ändringar för symboler som inte refereras av någon felsökningsinformation (för dessa visas annars endast tillägg/borttagning).


'''--non-reachable-types''', '''-t'''
'''--non-reachable-types''', '''-t'''
Analysera även typer som inte är nåbara från globala symboler.
Analysera och rapportera även typer som inte är nåbara från globala funktioner/variabler. Kan påverka prestanda kraftigt, men kan begränsas med headers/suppressions.


'''--redundant'''
'''--redundant'''
Visa även redundanta ändringar.
Visa redundanta ändringar.


'''--show-bits'''
'''--show-bits'''
Visa storlekar i bitar (standard).
Visa storlekar och offset i bitar (standard).


'''--show-bytes'''
'''--show-bytes'''
Visa storlekar i byte.
Visa storlekar och offset i byte.


'''--show-dec'''
'''--show-dec'''
Visa värden i decimalform (standard).
Visa i decimal form (standard).


'''--show-hex'''
'''--show-hex'''
Visa värden i hexadecimal form.
Visa i hexadecimal form.


'''--stat'''
'''--stat'''
Visa endast sammanfattande statistik.
Visa endast sammanfattande statistik istället för detaljerad diff.


'''--stats'''
'''--stats'''
Visa intern statistik.
Skriv ut intern statistik.


'''--suppressions''', '''--suppr''' <fil>
'''--suppressions''', '''--suppr''' <suppressions-fil>
Använd angivna undertryckningsfiler.
Använd undertryckningsfil. Kan anges flera gånger; då används alla. Om detta inte anges laddas standardfiler.


'''--symtabs'''
'''--symtabs'''
Visa endast symboltabeller.
Visa endast symboltabellerna för första och andra biblioteket.


'''--verbose'''
'''--verbose'''
Visa utförliga loggar.
Skriv ut utförliga loggar.


'''--version''', '''-v'''
'''--version''', '''-v'''
Visa version och avsluta.
Visa programversion och avsluta.


== RETURVÄRDEN ==
== RETURVÄRDEN ==
0
Returkoden är 0 om ABI:erna är lika, annars icke-noll om de skiljer sig eller om ett fel inträffade.
ABI:erna är identiska.
 
Vid icke-noll är returkoden ett 8-bitars bitfält där varje bit har en betydelse:
 
* 1 – '''ABIDIFF_ERROR''' – ett fel inträffade
* 2 – '''ABIDIFF_USAGE_ERROR''' – fel i hur kommandot anropades (okänd flagga, fel antal argument, osv.); om denna bit är satt måste även '''ABIDIFF_ERROR''' vara satt
* 4 – '''ABIDIFF_ABI_CHANGE''' – ABI:erna skiljer sig
* 8 – '''ABIDIFF_ABI_INCOMPATIBLE_CHANGE''' – ABI:erna skiljer sig på ett inkompatibelt sätt; om denna bit är satt måste även '''ABIDIFF_ABI_CHANGE''' vara satt


≠ 0
För närvarande finns bara några få typer av ABI-ändringar som alltid sätter '''ABIDIFF_ABI_INCOMPATIBLE_CHANGE''':
ABI:erna skiljer sig eller ett fel inträffade.


Returkoden är ett 8-bitars bitfält:
* borttagning av symbol för en funktion/variabel som varit definierad och exporterad
* ändring av index för en medlem i en virtuell funktionstabell (C++)


* 1 – '''ABIDIFF_ERROR''' – fel inträffade
Övriga bitar används inte för närvarande.
* 2 – '''ABIDIFF_USAGE_ERROR''' – felaktig användning
* 4 – '''ABIDIFF_ABI_CHANGE''' – ABI-ändring upptäckt
* 8 – '''ABIDIFF_ABI_INCOMPATIBLE_CHANGE''' – inkompatibel ABI-ändring


== EXEMPEL ==
== EXEMPEL ==
(Alla exempelblock i originalmanualen återges oförändrade som kod och har utelämnats här av utrymmesskäl. Säg till om du vill ha dem infogade exakt som `<pre>`.)
 
1. Upptäcka 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>
 
Observera att returkoden 4 betyder att tredje biten (ABIDIFF_ABI_CHANGE, värde 4) är satt. Detta betyder att verktyget kategoriserar ändringen som skadlig (*harmful*) och att användargranskning krävs.
 
2. Upptäcka inkompatibel ABI-ändring i typ 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>
 
Observera att returkoden 12 betyder att både bit 4 (ABIDIFF_ABI_CHANGE) och bit 8 (ABIDIFF_ABI_INCOMPATIBLE_CHANGE) är satta. Detta innebär ett ABI-brott.
 
3. Upptäcka en annan ändring i en undertyp:
 
<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 borttagna och tillagda funktioner:
 
<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 aktuell katalog.
 
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 binärer som består av '''bar''' och dess beroenden.


== UPPHOV ==
== UPPHOV ==
Rad 263: Rad 560:


== COLOFON ==
== COLOFON ==
Denna manualsida är en del av projektet '''libabigail''' (*ABI Generic Analysis and Instrumentation Library*).
Denna sida ä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/).
Projektinformation finns på: [https://sourceware.org/libabigail/](https://sourceware.org/libabigail/)
 
Manualsidan hämtades från projektets Git-förråd den 11 augusti 2025.


= Sidslut =
Felrapporter för denna manualsida hänvisas till [https://sourceware.org/bugzilla/enter_bug.cgi?product=libabigail](https://sourceware.org/bugzilla/enter_bug.cgi?product=libabigail).


Orginalhemsidan på Engelska :https://man7.org/linux/man-pages/man1/cpp.1.html
Sidan hämtades från projektets upstream Git-förråd (git://sourceware.org/git/libabigail.git) den 11 augusti 2025. Vid den tidpunkten var datumet för den senaste committen som hittades i förrådet 28 juli 2025.
<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.


[[Kategori:Linuxmanual grupp 1]]
Om du upptäcker renderingsproblem i HTML-versionen, om du anser att det finns en bättre eller mer uppdaterad källa, eller om du har korrigeringar/förbättringar för denna COLOFON (som inte är del av originalmanualen), skicka e-post till [man-pages@man7.org](mailto:man-pages@man7.org).
[[Kategori:Linuxmanual]]

Versionen från 10 januari 2026 kl. 06.17

Absolut — det som “blir fel” här är att texten har **hårda radbrytningar mitt i meningar** (från HTML/terminal-wrap). Nedan får du en version där jag:

  • tar bort “wrap-radbrytningar” i brödtext (varje stycke blir ett sammanhängande stycke)
  • gör **en ren rad per flagga** och låter beskrivningen följa på egna rader utan konstiga brytningar
  • lägger **exempel i `
    `** (där radbrytningar ska bevaras)

* använder tomrad mellan stycken/alternativ för bättre läsbarhet i MediaWiki Kopiera/klistra in som den är: --- == 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*). Den genererar en meningsfull rapport som beskriver skillnaderna mellan de två ABI:erna. Verktyget kan också jämföra textuella representationer 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. För en omfattande ABI-ändringsrapport mellan två inmatade delade bibliotek som inkluderar ändringar i funktioners och variablers undertyper använder '''abidiff''' som standard felsökningsinformation i DWARF-format, om sådan finns. Annars 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 lagts till eller tagits bort. Verktyget använder biblioteket '''libabigail''' för att analysera binären samt dess tillhörande felsökningsinformation. Här är det generella arbetssättet. När verktyget instrueras att göra det läses en binär och dess felsökningsinformation in och analyseras. För detta analyserar libabigail som standard beskrivningarna 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 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 denna slutliga ABI-korpus som libabigail betraktar 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 förändringar och rapportera om dem. == ANROP == '''abidiff''' [*alternativ*] <första-delade-bibliotek> <andra-delade-bibliotek> == MILJÖ == '''abidiff''' laddar två standardfiler med *undertryckningsspecifikationer* (*suppression specification files*), slår samman deras innehåll och använder det för att filtrera bort ABI-ändringsrapporter som kan uppfattas som falska positiva. '''Standardfil för systemomfattande undertryckningsspecifikation''' Den hittas via den valfria 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 systemomfattande standardfil. '''Standardfil för användarundertryckningsspecifikation''' Den hittas via den valfria 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 användarstandardfil. == ALTERNATIV == '''--add-binaries1''' <bin1,bin2,bin3,..> För varje kommaseparerad binär som anges: om binären hittas i katalogen som anges med '''--added-binaries-dir1''' så läser '''abidiff''' in ABI-korpusen för binären och lägger till den i en uppsättning korpusar (en *ABI Corpus Group*) som inkluderar första argumentet till '''abidiff'''. Denna ABI-korpusgrupp jämförs sedan mot den andra korpusgruppen som anges som argument till '''abidiff'''. '''--add-binaries2''' <bin1,bin2,bin3,..> Som '''--add-binaries1''', men lägger till binärer i gruppen som inkluderar andra argumentet till '''abidiff'''. Denna grupp jämförs sedan mot den första gruppen. '''--added-binaries-dir1''', '''--abd1''' <katalog-1> Används tillsammans med '''--add-binaries1''', '''--follow-dependencies''' och '''--list-dependencies'''. Binärer som refereras av dessa alternativ och som hittas i katalog-1 läses in som ABI-korpus och läggs till i första ABI-korpusgruppen. '''--added-binaries-dir2''', '''--abd2''' <katalog-2> Som '''--added-binaries-dir1''', men för andra ABI-korpusgruppen. '''--added-fns''' Visa endast globalt definierade funktioner som lades till i <andra-delade-bibliotek>. '''--added-vars''' Visa endast globala variabler som lades till (definierades) i <andra-delade-bibliotek>. '''--allow-non-exported-interfaces''' När verktyget analyserar felsökningsinformation analyseras typer nåbara från gränssnitt synliga utanför sin översättningsenhet. Därefter byggs en ABI-korpus av typer nåbara från gränssnitt kopplade till definierade och exporterade ELF-symboler, och det är dessa ABI-korpusar som jämförs. Detta kan bli mycket data (och långsamt) för applikationer, t.ex. Linux-kärnan. För “normalstora” binärer kan man ofta analysera alla synliga gränssnitt genom att använda detta alternativ. Observera att detta alternativ är aktiverat som standard, utom när Linux-kärnan analyseras. '''--btf''' Vid jämförelse av binärer: extrahera ABI-information från BTF-felsökningsinformation, om sådan finns. '''--changed-fns''' Visa endast ändringar i undertyper för globalt definierade funktioner i <första-delade-bibliotek>. '''--changed-vars''' Visa endast ändringar i undertyper för globalt definierade variabler i <första-delade-bibliotek>. '''--ctf''' Vid jämförelse av binärer: extrahera ABI-information från CTF-felsökningsinformation, om sådan finns. '''--debug-info-dir1''', '''--d1''' <di-sökväg1> Om felsökningsinformation för <första-delade-bibliotek> ligger i en separat fil anger detta var abidiff ska hitta den filen. di-sökväg måste peka på rotkatalogen under vilken felsökningsinformationen ligger i en trädstruktur (på Red Hat-baserade system ofta <root>/usr/lib/debug). Alternativet kan anges flera gånger med olika rotkataloger; då letar abidiff i alla dessa. '''--debug-info-dir2''', '''--d2''' <di-sökväg2> Som '''--debug-info-dir1''', men för <andra-delade-bibliotek>. '''--debug-self-comparison''' Felsökningsläge som kan abortera körningen om avvikelser upptäcks när en binär jämförs med sig själv. Avsett för felsökning i debugger. Kräver att libabigail byggts med --enable-debug-self-comparison. '''--debug-tc''' Felsökningsläge som granskar typkanonisering: varje typjämförelse görs både strukturellt och kanoniskt och resultaten måste matcha, annars aborteras körningen. Kräver --enable-debug-type-canonicalization. '''--deleted-fns''' Visa endast globalt definierade funktioner som togs bort från <första-delade-bibliotek>. '''--deleted-vars''' Visa endast globalt definierade variabler som togs bort från <första-delade-bibliotek>. '''--drop''' <regex> Vid inläsning av ELF-filerna: uteslut globalt definierade funktioner och variabler vars namn matchar regex. Då rapporteras inga ändringar som involverar dessa. '''--drop-fn''' <regex> Som '''--drop''', men endast funktioner. '''--drop-var''' <regex> Som '''--drop''', men endast variabler. '''--drop-private-types''' Används med '''--headers-dir1''', '''--headers-dir2''', '''--header-file1''' och '''--header-file2'''. Med detta alternativ tas typer som INTE är definierade i publika headers bort helt ur libabigails interna ABI-representation, så de behöver inte filtreras bort senare. Detta kan minska minnesåtgången. '''--dump-diff-tree''' Efter diff-rapporten: skriv en textuell representation av diff-nodträdet (felsökningssyfte) till felutmatningen. Relevant endast för funktioner/variabler som har undertypsändringar. '''--exported-interfaces-only''' För att minska mängden data kan detta alternativ begränsa analysen till typer som är nåbara från gränssnitt kopplade till definierade och exporterade ELF-symboler. Detta är aktiverat som standard för Linux-kärnan, annars avstängt som standard. '''--fail-no-debug-info''' Om ingen felsökningsinformation hittas: avsluta med fel. Utan detta alternativ försöker programmet jämföra icke-debug-relaterade egenskaper (t.ex. rena ELF-egenskaper). '''--follow-dependencies''', '''--fdeps''' Konstruera ABI-korpusar även för beroenden som hittas via '''--added-binaries-dir1''' respektive '''--added-binaries-dir2''', och jämför sedan de två uppsättningarna (inmatning + beroenden). '''--harmless''' Visa endast ofarliga (*harmless*) ändringar. Som standard filtreras ofarliga ändringar bort för att göra rapporten mindre rörig. '''--headers-dir1''', '''--hd1''' <headers-katalog-1> Anger var publika headers för första biblioteket finns. ABI-ändringar för typer som inte definieras i publika headers filtreras bort. Kan anges flera gånger. <pre> $ 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.

--header-file2, --hf2 <header-fil-2> Anger en publik headerfil för andra biblioteket.

--help, -h Visa kort hjälp och avsluta.

--ignore-soname Ignorera skillnader i SONAME.

--impacted-interfaces Vid visning av leaf-ändringar: visa lista över påverkade gränssnitt. Används tillsammans med --leaf-changes-only, annars ignoreras det.

--keep <regex> Behåll endast globalt definierade funktioner/variabler vars namn matchar regex. Alla andra utesluts och syns inte i rapporten.

--keep-fn <regex> Som --keep, men endast funktioner.

--keep-var <regex> Som --keep, men endast variabler.

--kmi-whitelist, -w <vitlista> Vid analys av Linux-kärnans binär: vitlista ELF-symbolnamn för funktioner/variabler vars gränssnitt ska beaktas (KMI). Om ingen vitlista anges beaktas hela KMI:t.

--leaf-changes-only, -l Visa endast leaf-ändringar (ingen konsekvens-/påverkansanalys). Detta alternativ implicerar --redundant.

Typisk utdata:

$ abidiff libtest-v0.so libtest-v1.so
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 fn(C&)' at test-v1.cc:13:1 has some indirect sub-type changes:
    parameter 1 of type 'C&' has sub-type changes:
      in referenced type 'struct C' at test-v1.cc:7:1:
        type size hasn't changed
        1 data member change:
         type of 'leaf* C::m0' changed:
           in pointed to type 'struct leaf' at test-v1.cc:1:1:
             type size changed from 32 to 64 bits
             1 data member insertion:
               'char leaf::m1', at offset 32 (in bits) at test-v1.cc:4:1
$

Med leaf-läge:

$ abidiff -l libtest-v0.so libtest-v1.so
'struct leaf' changed:
  type size changed from 32 to 64 bits
  1 data member insertion:
    'char leaf::m1', at offset 32 (in bits) at test-v1.cc:4:1

  one impacted interface:
    function void fn(C&)
$

--list-dependencies, --ldeps Lista alla beroenden till indataargumenten som hittas i katalogerna angivna med --added-binaries-dir1 och --added-binaries-dir2.

--no-added-syms Visa inte tillagda funktioner/variabler och inte heller deras ELF-symboler. Andra ändringar visas om de inte stoppas av andra alternativ.

--no-assume-odr-for-cplusplus Inaktivera antagandet om *One Definition Rule* (ODR) vid analys av C++ med DWARF; libabigail jämför då faktiskt typer med samma namn istället för att anta att de är lika.

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

--no-change-categorization, -x Inaktivera kategorisering (harmless/harmful). Eftersom kategorisering krävs för filtrering stänger detta även av filtrering. Användbart för stora ändringsgrafer och tillsammans med --leaf-changes-only.

--no-corpus-path Skriv inte ut path-attributet för ABI-korpusen.

--no-default-suppression Ladda inte standardfilerna för undertryckningar.

--no-harmful Visa inte skadliga (*harmful*) ändringar. Som standard visas annars endast skadliga ändringar.

--no-leverage-dwarf-factorization Inaktivera optimeringar som används när DWARF har faktoriserats med DWZ.

--no-linkage-name Visa inte länk-namn (*linkage names*) för tillagda/borttagna/ändrade symboler.

--no-linux-kernel-mode Behandla Linux-kärnans binärer som vanliga ELF-binärer och använd ELF-exportlogik istället för __ksymtab/__ksymtab_gpl.

--no-redundant Visa INTE redundanta ändringar (aktiverat som standard).

--no-show-locs Visa inte var i det andra biblioteket respektive typ ändrades.

--no-show-relative-offset-changes Visa inte hur många bitar en offset flyttats (visa bara gamla och nya offset).

--no-unreferenced-symbols Visa inte ändringar för symboler som inte refereras av någon felsökningsinformation (för dessa visas annars endast tillägg/borttagning).

--non-reachable-types, -t Analysera och rapportera även typer som inte är nåbara från globala funktioner/variabler. Kan påverka prestanda kraftigt, men kan begränsas med headers/suppressions.

--redundant Visa redundanta ändringar.

--show-bits Visa storlekar och offset i bitar (standard).

--show-bytes Visa storlekar och offset i byte.

--show-dec Visa i decimal form (standard).

--show-hex Visa i hexadecimal form.

--stat Visa endast sammanfattande statistik istället för detaljerad diff.

--stats Skriv ut intern statistik.

--suppressions, --suppr <suppressions-fil> Använd undertryckningsfil. Kan anges flera gånger; då används alla. Om detta inte anges laddas standardfiler.

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

--verbose Skriv ut utförliga loggar.

--version, -v Visa programversion och avsluta.

RETURVÄRDEN

Returkoden är 0 om ABI:erna är lika, annars icke-noll om de skiljer sig eller om ett fel inträffade.

Vid icke-noll är returkoden ett 8-bitars bitfält där varje bit har en betydelse:

  • 1 – ABIDIFF_ERROR – ett fel inträffade
  • 2 – ABIDIFF_USAGE_ERROR – fel i hur kommandot anropades (okänd flagga, fel antal argument, osv.); om denna bit är satt måste även ABIDIFF_ERROR vara satt
  • 4 – ABIDIFF_ABI_CHANGE – ABI:erna skiljer sig
  • 8 – ABIDIFF_ABI_INCOMPATIBLE_CHANGE – ABI:erna skiljer sig på ett inkompatibelt sätt; om denna bit är satt måste även ABIDIFF_ABI_CHANGE vara satt

För närvarande finns bara några få typer av ABI-ändringar som alltid sätter ABIDIFF_ABI_INCOMPATIBLE_CHANGE:

  • borttagning av symbol för en funktion/variabel som varit definierad och exporterad
  • ändring av index för en medlem i en virtuell funktionstabell (C++)

Övriga bitar används inte för närvarande.

EXEMPEL

1. Upptäcka 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
$

Observera att returkoden 4 betyder att tredje biten (ABIDIFF_ABI_CHANGE, värde 4) är satt. Detta betyder att verktyget kategoriserar ändringen som skadlig (*harmful*) och att användargranskning krävs.

2. Upptäcka inkompatibel ABI-ändring i typ 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
$

Observera att returkoden 12 betyder att både bit 4 (ABIDIFF_ABI_CHANGE) och bit 8 (ABIDIFF_ABI_INCOMPATIBLE_CHANGE) är satta. Detta innebär ett ABI-brott.

3. Upptäcka en annan ändring i en undertyp:

$ 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 borttagna och tillagda funktioner:

$ 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 aktuell katalog.

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 binärer som består av bar och dess beroenden.

UPPHOV

Dodji Seketeli

COPYRIGHT

2014–2025, Red Hat, Inc.

COLOFON

Denna sida är en del av projektet libabigail (*ABI Generic Analysis and Instrumentation Library*). Information om projektet finns på [1](https://sourceware.org/libabigail/).

Felrapporter för denna manualsida hänvisas till [2](https://sourceware.org/bugzilla/enter_bug.cgi?product=libabigail).

Sidan hämtades från projektets upstream Git-förråd (git://sourceware.org/git/libabigail.git) den 11 augusti 2025. Vid den tidpunkten var datumet för den senaste committen som hittades i förrådet 28 juli 2025.

Om du upptäcker renderingsproblem i HTML-versionen, om du anser att det finns en bättre eller mer uppdaterad källa, eller om du har korrigeringar/förbättringar för denna COLOFON (som inte är del av originalmanualen), skicka e-post till [man-pages@man7.org](mailto:man-pages@man7.org).