这篇文章主要讲解的是解读linux中的strings命令简介,文章内容十分详尽,相信一定可以解决你的问题,须要的同学可以参考下哦
在Linux下搞软件开发的同学linux strings命令,几乎没有不晓得strings命令的。我们先用manstrings来瞧瞧:
strings - print the strings of printable characters in files.
意思是linux strings命令,复印文件中可复印的字符。我来补充一下吧,这个文件可以是文本文件(test.c),可执行文件(test),动态链接库(test.o),静态链接库(test.a)
脱离代码地短篇大论而不去实际验证,不是我的风格。还是搞点代码下菜吧(代码存在test.c中):
#include int add(int x, int y) { return x + y; } int main() { int a = 1; int b = 2; int c = add(a, b); printf("oh, my dear, c is %dn", c); return 0; }
我们来瞧瞧stringstest.c的结果:
[taoge@localhost learn_c]$ strings test.c #include int add(int x, int y) return x + y; int main() int a = 1; int b = 2; int c = add(a, b); printf("oh, my dear, c is %dn", c); return 0; [taoge@localhost learn_c]$
可以看见,确实复印出了test.c中的好多字符。
下边,我们对可执行文件用strings试试linux多线程编程,如下:
[taoge@localhost learn_c]$ gcc test.c [taoge@localhost learn_c]$ strings a.out /lib/ld-linux.so.2 =$TsU __gmon_start__ libc.so.6 _IO_stdin_used printf __libc_start_main GLIBC_2.0 PTRh [^_] oh, my dear, c is %d [taoge@localhost learn_c]$
可以看见,复印出了a.out中好多字符。
实际上,假如有目标文件、静态库或动态库,,也是可以用strings命令进行复印操作的。我们来瞧瞧:
xxx.h文件:
void print();
xxx.c文件:
#include #include "xxx.h" void print() { printf("rainy daysn"); }
之后,我们来瞧瞧如何制做静态、动态库吧(在后续博文中会继续详尽介绍):
[taoge@localhost learn_strings]$ ls xxx.c xxx.h [taoge@localhost learn_strings]$ gcc -c xxx.c [taoge@localhost learn_strings]$ ar rcs libxxx.a xxx.o [taoge@localhost learn_strings]$ gcc -shared -fPIC -o libxxx.so xxx.o [taoge@localhost learn_strings]$ ls libxxx.a libxxx.so xxx.c xxx.h xxx.o [taoge@localhost learn_strings]$ strings xxx.o rainy days [taoge@localhost learn_strings]$ strings libxxx.a ! / 1437887339 0 0 0 14 ` Rprint xxx.o/ 1437887333 501 502 100664 848 ` rainy days GCC: (GNU) 4.4.4 20100726 (Red Hat 4.4.4-13) .symtab .strtab .shstrtab .rel.text .data .bss .rodata .comment .note.GNU-stack xxx.c print puts [taoge@localhost learn_strings]$ [taoge@localhost learn_strings]$ [taoge@localhost learn_strings]$ strings libxxx.so __gmon_start__ _init _fini __cxa_finalize _Jv_RegisterClasses print puts libc.so.6 _edata __bss_start _end GLIBC_2.1.3 GLIBC_2.0 rainy days [taoge@localhost learn_strings]$
见到了吧。
strings命令很简单,看上去似乎没哪些,但实际有好多用途。下边,我来举一个反例。在小型的软件开发中,假定有100个.c/.cpp文件,这个.cpp文件最终生成10个.so库,这么如何能够快速晓得某个.c/.cpp文件编译到哪个.so库中去了呢?其实,你可能要说,看makefile不就晓得了。对,看makefile肯定可以arm linux,但如下方式更好,直接用命令:
strings -f "*.so" | grep "xxxxxx"
假如还不明白,那就就以里面的小程序为例为说明,不过,此处我们考虑所有的文件,如下:
[taoge@localhost learn_c]$ strings -f * | grep "my dear" a.out: oh, my dear, c is %d test.c: printf("oh, my dear, c is %dn", c); [taoge@localhost learn_c]$
可以看见,源文件test.c和可执行文件中皆有”mydear”串,一下子就找到了对应的文件,清楚了吧。假如某.c/.cpp文件编译进了.so库,这么,strings-f*|grep”mydear”必将可以找到对应的.so文件,其中”mydear”为该.c/.cpp文件中的某个日志串(例如以printf为复印)。
strings的作用先介绍到此,算是抛砖引玉地熟悉一下strings吧。
以上就是本文的全部内容,希望对你们的学习有所帮助,也希望你们多多支持它帮你网。