标题:[实践OK]linux中的strings命令简介 出处:向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除 时间:Mon, 17 Sep 2018 11:56:23 +0000 作者:jackxiang 地址:http://jackxiang.com/post/9891/ 内容: 在linux下搞软件开发的朋友, 几乎没有不知道strings命令的。我们先用man strings来看看: strings - print the strings of printable characters in files. 意思是, 打印文件中可打印的字符。 我来补充一下吧, 这个文件可以是文本文件(test.c), 可执行文件(test), 动态链接库(test.o), 静态链接库(test.a) 脱离代码地长篇大论而不去实际验证, 不是我的风格。 还是搞点代码下菜吧(代码存在test.c中): cat 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 isd\n", c); return 0; } 我们来看看strings test.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 isd\n", c); return 0; 可以看到, 确实打印出了test.c中的很多字符。 下面, 我们对可执行文件用strings试试, 如下: gcc test.c strings a.out /lib64/ld-linux-x86-64.so.2 __gmon_start__ libc.so.6 printf __libc_start_main GLIBC_2.2.5 fff. fffff. l$ L t$(L |$0H oh, my dear, c isd 可以看到, 打印出了a.out中很多字符。 实际上, 如果有目标文件、静态库或动态库,, 也是可以用strings命令进行打印操作的。 我们来看看: xxx.h文件: void print(); xxx.c文件: cat xxx.c #include #include "xxx.h" void print() { printf("rainy days\n"); } 然后, 我们来看看怎么制作静态、动态库吧(在后续博文中会继续详细介绍): gcc -shared -fPIC -c xxx.c #-fPI得加上,否则会报relocation R_X86_64_32 against `.rodata' gcc -shared -fPIC -o libxxx.so xxx.o 问题: gcc -shared -fPIC -o libxxx.so xxx.o /usr/bin/ld: xxx.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC 解决办法: gcc默认没加-fPIC参数,得手工加上即可。 strings xxx.o rainy days strings libxxx.a ! / 1537155736 0 0 0 14 ` Rprint xxx.o/ 1537155717 0 0 100644 1496 ` rainy days GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-18) .symtab .strtab .shstrtab .rela.text .data .bss .rodata .comment .note.GNU-stack .rela.eh_frame xxx.c print puts strings libxxx.so strings libxxx.so __gmon_start__ _init _fini __cxa_finalize _Jv_RegisterClasses print puts libc.so.6 _edata __bss_start _end GLIBC_2.2.5 ATSubH rainy days trings命令很简单, 看起来好像没什么, 但实际有很多用途。 下面, 我来举一个例子。 在大型的软件开发中, 假设有100个.c/.cpp文件, 这个.cpp文件最终生成10个.so库, 那么怎样才能快速知道某个.c/.cpp文件编译到那个.so库中去了呢? 当然, 你可能要说, 看makefile不就知道了。 对, 看makefile肯定可以, 但如下方法更好, 直接用命令: strings -f "*.so" | grep "xxxxxx" 如果还不明白, 那就就以上面的小程序为例为说明, 不过, 此处我们考虑所有的文件, 如下: strings -f * | grep "my dear" a.out: oh, my dear, c isd test.c: printf("oh, my dear, c isd\n", c); 可以看到, 源文件test.c和可执行文件中皆有"my dear"串, 一下子就找到了对应的文件,清楚了吧。如果某.c/.cpp文件编译进了.so库, 那么,strings -f * | grep "my dear"必定可以找到对应的.so文件, 其中"my dear"为该.c/.cpp文件中的某个日志串(比如以printf为打印)。 来自:https://blog.csdn.net/stpeace/article/details/46641069 Generated by Jackxiang's Bo-blog 2.1.1 Release