这篇文章主要讲解的是解读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中):

命令提示符_linux strings命令_命令方块获取指令

#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中的好多字符。

命令提示符_命令方块获取指令_linux strings命令

下边,我们对可执行文件用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"); 
} 

命令提示符_linux strings命令_命令方块获取指令

之后,我们来瞧瞧如何制做静态、动态库吧(在后续博文中会继续详尽介绍):

[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吧。

以上就是本文的全部内容,希望对你们的学习有所帮助,也希望你们多多支持它帮你网。

Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复