Pokud jste uživatelem Linuxu, který se také zabývá vývojem softwaru na systémové úrovni, můžete se ocitnout v situacích, kdy potřebujete informace související se symboly v objektovém souboru. Budete rádi, že existuje nástroj příkazového řádku - nazvaný nm - které můžete v těchto situacích použít.
V tomto tutoriálu probereme základy tohoto nástroje pomocí několika snadno srozumitelných příkladů. Ale než to uděláme, stojí za zmínku, že všechny příklady zde byly testovány na počítači Ubuntu 16.04 LTS.
Linux nm příkaz
Nástroj příkazového řádku nm v podstatě vypisuje symboly ze souborů objektů. Zde je syntaxe nástroje:
nm [OPTIONS] OBJECT-FILENAME
A následuje, jak to vysvětluje manuálová stránka příkazu:
GNU nm lists the symbols from object files objfile.... If no object
files are listed as arguments, nm assumes the file a.out.
Následuje několik příkladů ve stylu otázek a odpovědí, které vám poskytnou lepší představu o tom, jak nm funguje.
Q1. Jak funguje příkaz nm?
Základní použití tohoto příkazu je velmi přímočaré - vše, co musíte udělat, je spustit příkaz 'nm' a předat mu jako vstup jméno souboru objektu. Například jsem použil příkaz nm s binárním souborem 'apl':
nm apl
Následující snímek obrazovky ukazuje druh výstupu vytvořeného výše uvedeným příkazem:
Tři sloupce vytvořené na výstupu představují hodnotu symbolu, typ symbolu a název symbolu. Existuje několik typů symbolů – chcete-li znát úplné podrobnosti, přejděte na manuálovou stránku příkazu nm.
O2. Jak umístit názvy souborů před každý symbol ve výstupu?
To můžete provést pomocí -A možnost příkazového řádku.
nm -A [obj-file]
Například:
nm -A apl
Takže můžete vidět, že název souboru byl přidán na začátek každého řádku.
Q3. Jak vytvořit nm také symboly ladicího programu?
Chcete-li, aby nm ve výstupu zobrazovaly i symboly ladicího programu, použijte -a možnost příkazového řádku.
nm -a [obj-filename]
Například:
nm -a apl
Výše uvedený příkaz zobrazí všechny symboly, včetně symbolů pouze pro ladicí program, které normálně nejsou uvedeny.
4. Jak přimět nm dekódovat názvy symbolů nízké úrovně?
Pokud chcete, můžete dokonce donutit nm k dekódování názvů symbolů nízké úrovně na názvy na uživatelské úrovni. To můžete provést pomocí volby příkazového řádku -C.
nm -C [obj-file]
Například:
nm -C apl
Zde je to, co o této možnosti říká manuálová stránka:
Besides removing any initial underscore prepended by the system,
this makes C++ function names readable. Different compilers have
different mangling styles. The optional demangling style argument
can be used to choose an appropriate demangling style for your
compiler.
O5. Jak zajistit, aby nm zobrazoval pouze dynamické symboly?
V případě, že chcete, aby nm zobrazovalo pouze dynamické symboly , nikoli normální symboly, použijte -D možnost příkazového řádku.
nm -D [obj-file]
Například:
nm -D apl
Takže můžete vidět, že nm na výstupu byly vytvořeny pouze dynamické symboly.
O6. Jak používat různé výstupní formáty nm?
Chcete-li povolit různé výstupní formáty, použijte volbu -f příkazového řádku. Ve výchozím nastavení je výstup vytvářen ve formátu bsd, pokud však chcete, můžete povolit také formáty 'sysv' a 'posix'.
nm -f [format] [obj-filename]
Například:
nm -f posix apl
Pozorujte nyní změnu formátu.
O7. Jak přimět nm, aby zobrazoval pouze externí symboly?
Toho můžete dosáhnout pomocí volby příkazového řádku -g.
nm -g [obj-file]
Například:
nm -g apl
O8. Jaké všechny možnosti řazení nm poskytuje?
Ve výchozím nastavení jsou symboly seřazeny podle abecedy. Pokud však chcete, můžete je seřadit číselně podle jejich adres pomocí -n možnost příkazového řádku.
nm -n [objfile]
Například:
nm -n apl
Takže můžete vidět, že výstup je nyní seřazen podle adres.
V případě, že nechcete, aby nm použil jakýkoli druh řazení (včetně výchozího, které používá), použijte volbu -p příkazového řádku. Pokud chcete zvrátit jakékoli existující řazení, použijte volbu -r příkazového řádku.
O9. Jak zajistit, aby nm zobrazoval pouze nedefinované symboly?
To můžete provést pomocí -u možnost příkazového řádku.
nm -u [obj-file]
Například:
nm -u apl
O10. Jak zajistit, aby nm zobrazoval pouze definované symboly?
Chcete-li, aby nm zobrazoval pouze definované symboly, použijte --defined-only možnost příkazového řádku.
nm --defined-only [obj-file]
Například:
nm --defined-only apl
Závěr
Souhlasím, příkaz nm má specifické publikum, ale moje osobní zkušenost říká, že i když se nepovažujete za součást tohoto publika, mějte na paměti, že takový nástroj existuje. A pro ty, kteří chtějí tuto pomůcku používat, jakmile si zde procvičíte všechny příklady, přejděte na manuálovou stránku nm, kde se dozvíte více.