详解linux中的strings命令简介_Linux

在Linux下搞软件开发的朋友, 几乎没有不知道strings命令的。我们先用man strings来看看:

strings - print the strings of printable characters in files. 

 意思是, 打印文件中可打印的字符。  我来补充一下吧, 这个文件可以是文本文件(test.c), 可执行文件(test),  动态链接库(test.o), 静态链接库(test.a)

脱离代码地长篇大论而不去实际验证, 不是我的风格。 还是搞点代码下菜吧(代码存在test.c中):

#include <stdio.h> 

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 %d\n", c); 

    return 0;
}

 我们来看看strings test.c的结果:

[taoge@localhost learn_c]$ strings test.c
#include <stdio.h>
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 %d\n", c);
  return 0;
[taoge@localhost learn_c]$  

可以看到, 确实打印出了test.c中的很多字符。

下面, 我们对可执行文件用strings试试, 如下:

[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 <stdio.h>
#include "xxx.h" 

void print()
{
  printf("rainy days\n");
}

然后, 我们来看看怎么制作静态、动态库吧(在后续博文中会继续详细介绍):

[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
!<arch>
/        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肯定可以, 但如下方法更好, 直接用命令:

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 %d\n", c);
[taoge@localhost learn_c]$  

可以看到, 源文件test.c和可执行文件中皆有"my dear"串, 一下子就找到了对应的文件,清楚了吧。如果某.c/.cpp文件编译进了.so库, 那么,strings -f * | grep "my dear"必定可以找到对应的.so文件, 其中"my dear"为该.c/.cpp文件中的某个日志串(比如以printf为打印)。

 strings的作用先介绍到此, 算是抛砖引玉地熟悉一下strings吧。

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索linux
, linux
, strings
strings命令
linux strings命令、linux top命令详解、linux ps 命令详解、linux route命令详解、linux命令详解词典,以便于您获取更多的相关知识。

时间: 2024-08-02 12:54:28

详解linux中的strings命令简介_Linux的相关文章

详解LINUX中的fdisk命令

fdisk 操作硬盘的命令格式如下: [root@localhost beinan]# fdisk 设备 比如我们通过 fdisk -l 得知 /dev/hda 或者 /dev/sda设备:我们如果想再添加或者删除一些分区,可以用 [root@localhost beinan]# fdisk /dev/hda 或 [root@localhost beinan]# fdisk /dev/sda 注 在以后的例子中,我们要以 /dev/sda设备为例,来讲解如何用fdisk 来操作添加.删除分区等动

详解Linux中清屏命令的使用

1. clear $ clear 屏幕刷新了,这个命令本质上只是让终端页向后翻了一页,向上滚动屏幕还是能看到之前终端屏幕的残留信息. 2.reset $reset 屏幕刷新了,之前的终端屏幕信息没有了,缺点是很慢,大概要一秒钟.

详解Linux中vi命令大全_linux shell

vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于 对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您可以在其他任何介绍vi的地方进一步了解它.Vi也是Linux中最基本的文本编 辑器,学会它后,您将在Linux的世界里畅行无阻. vi的基本概念 基本上vi可以分为三种状态,分别是命令模式(command mode).插入模式(Insert mode)和底行模式(last line m

详解CentOS中的route命令_Linux

介绍 Linux系统中的route命令能够用于IP路由表的显示和操作.它的主要作用是创建一个静态路由让指定一个主机或者一个网络通过一个网络接口,如eth0.当使用"add"或者"del"参数时,路由表被修改,如果没有参数,则显示路由表当前的内容.在一个网络中,需要一个路由器来转发不同广播域之间的数据,或是转发lan和internet之间的数据.有时我们需要设定这个路由器作为linux系统的默认路由,那么就可以通过route命令来操作.甚至我们也可以用我们的linux

实例详解Linux下的Make命令_Linux

前言 无论是在linux 还是在Unix环境 中,make都是一个非常重要的编译命令.不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或make install.利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和 makefile工具就可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系.而且如此多的源文件,如果每次都要键入gcc命令进行编译的话,那对程序员 来说简直就是一场灾难.而make工具则可自动完成编译

详解linux中的信号

SIGHUP 终止进程 终端线路挂断 SIGINT 终止进程 中断进程 SIGQUIT 建立CORE文件终止进程,并且生成core文件 SIGILL 建立CORE文件 非法指令 SIGTRAP 建立CORE文件 跟踪自陷 SIGBUS 建立CORE文件 总线错误 SIGSEGV 建立CORE文件 段非法错误 SIGFPE 建立CORE文件 浮点异常 SIGIOT 建立CORE文件 执行I/O自陷 SIGKILL 终止进程 杀死进程 SIGPIPE 终止进程 向一个没有读进程的管道写数据 SIGA

linux中的strip命令简介------给文件脱衣服【转】

转自:http://blog.csdn.net/stpeace/article/details/47090255 版权声明:本文为博主原创文章,转载时请务必注明本文地址, 禁止用于任何商业用途, 否则会用法律维权. 作为一名Linux开发人员, 如果没有听说过strip命令, 那是很不应该的. strip这个单词, 大家应该早就学过了, 你就记住是脱衣服就行了, 别的不要多想. 在linux中, strip也有脱衣服的含义, 具体就是从特定文件中剥掉一些符号信息和调试信息. 我们来看main.c

详解ES6中的let命令_javascript技巧

let是ES6里面新的复制命令,let赋值命令只可以在{}代码块中被调用.下面通过实例给大家讲解es6中的let命令,具体内容如下所示: 1.let命令的用法和var命令类似,但let命令声明的变量只在let所在的代码块内有效 { let a=10; var b=1; } console.log(a);//Uncaught ReferenceError: a is not defined console.log(b); 2.let命令不存"声明提前"现象,因此变量一定要先声明,后使用

详解Linux中查找目录和文件的find和locate命令

  find find 路径 -命令参数 [输出形式] 参数说明: 路径:告诉find在哪儿去找你要的东西, 命令参数:参数很多下面会说到 输出形式:输出形式很多,-print,-printf,-print0,-exec,-ok,-ls反正很多自己看手册吧. 说一下exec, -exec find命令对匹配的文件执行该参数所给出的其他linux命令.相应命令的形式为' 命令 - and' {} ;,注意{ }和;之间的空格. -ok 和- exec的作用相同,只不过和会人交互而已,OK执行前会向