Linux常用命令中有一些命令可以在开发或调试过程中起到很好的帮助作用,有些可以帮助了解或优化我们的程序,有些可以帮我们定位疑难问题。本文将简单介绍一下这些命令。
我们用一个小程序,来帮助后面我们对这些命令的描述,程序清单cmdTest.c如下:
#include<stdio.h>
int?test(int?a,int?b)
{
????return?a/b;
}
int?main(int?argc,char?*argv[])
{
????int?a?=?10;
????int?b?=?0;
????printf("a=%d,b=%d\n",a,b);
????test(a,b);
????return?0;
}
编译获得elf文件cmdTest并运行:
gcc?-g?-o?cmdTest?cmdTest.c
./cmdTest
a=10,b=0
Floating?point?exception?(core?dumped)
程序内容是在main函数中调用test,计算a/b的值,其中b的值为0,因此程序由于除0错误异常终止。
file?cmdTest
cmdTest:?ELF?64-bit?LSB??executable,?x86-64,?version?1?(SYSV),?dynamically?linked?(uses?shared?libs),?for?GNU/Linux?2.6.24,?BuildID[sha1]=448e1c34b4c548120e2c04f6a2bfce4e6d2281a3,?not?stripped
通过file命令可以看到cmdTest的类型为elf,是64位、运行于x86-64的程序,not striped表明elf文件中还保留着符号信息以及调试信息等不影响程序运行的内容。
ldd?cmdTest
???????linux-vdso.so.1?=>??(0x00007ffc8e548000)
???????libc.so.6?=>?/lib/x86_64-linux-gnu/libc.so.6?(0x00007f0621931000)
???????/lib64/ld-linux-x86-64.so.2?(0x00007f0621cf6000)
我们可以看到cmdTest依赖了libc.so等库。
nm命令用于查看elf文件的符号信息。文件编译出来之后,我们可能不知道新增加的函数或者全局变量是否已经成功编译进去。这时候,我们可以使用nm命令来查看。
例如,查看前面所提到的elf文件有没有test函数,可以用命令:
nm?cmdTest|grep?test
000000000040052d?T?test??#打印结果
按照地址顺序列出符号信息:
nm?-n?cmdTest
?????????????????w?_ITM_deregisterTMCloneTable
?????????????????w?_ITM_registerTMCloneTable
?????????????????w?_Jv_RegisterClasses
?????????????????w?__gmon_start__
?????????????????U?__libc_start_main@@GLIBC_2.2.5
?????????????????U?printf@@GLIBC_2.2.5
00000000004003e0?T?_init
0000000000400440?T?_start
0000000000400470?t?deregister_tm_clones
00000000004004a0?t?register_tm_clones
00000000004004e0?t?__do_global_dtors_aux
0000000000400500?t?frame_dummy
000000000040052d?T?test
0000000000400540?T?main
0000000000400590?T?__libc_csu_init
0000000000400600?T?__libc_csu_fini
(列出部分内容)
下一个教程:Linux常用命令 - cat命令用法详解