<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[[实践OK]linux中的strings命令简介]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[Unix/LinuxC技术]]></category>
<pubDate>Mon, 17 Sep 2018 03:56:23 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	在linux下搞软件开发的朋友， 几乎没有不知道strings命令的。我们先用man strings来看看：<br/><br/>strings - print the strings of printable characters in files.&nbsp;&nbsp;<br/><br/>意思是， 打印文件中可打印的字符。&nbsp;&nbsp;我来补充一下吧， 这个文件可以是文本文件（test.c）, 可执行文件(test),&nbsp;&nbsp;动态链接库(test.o), 静态链接库(test.a)<br/><br/><br/>脱离代码地长篇大论而不去实际验证， 不是我的风格。 还是搞点代码下菜吧（代码存在test.c中）：<br/><br/>cat test.c<br/><textarea name="code" class="php" rows="15" cols="100">
#include &lt;stdio.h&gt;
 
int add(int x, int y)
&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return x + y;
&#125;
 
int main()
&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int a = 1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int b = 2;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int c = add(a, b);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;oh, my dear, c isd&#92;n&quot;, c);
 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;
&#125;
</textarea><br/><br/><br/> 我们来看看strings test.c的结果：<br/>strings test.c<br/><textarea name="code" class="php" rows="15" cols="100">
#include &lt;stdio.h&gt;
int add(int x, int y)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return x + y;
int main()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int a = 1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int b = 2;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int c = add(a, b);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;oh, my dear, c isd&#92;n&quot;, c);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;
</textarea><br/><br/>可以看到， 确实打印出了test.c中的很多字符。<br/>下面， 我们对可执行文件用strings试试， 如下：<br/>gcc test.c<br/>strings a.out <br/>/lib64/ld-linux-x86-64.so.2<br/>__gmon_start__<br/>libc.so.6<br/>printf<br/>__libc_start_main<br/>GLIBC_2.2.5<br/>fff.<br/>fffff.<br/>l$ L<br/>t$(L<br/>&#124;$0H<br/>oh, my dear, c isd<br/><br/> 可以看到， 打印出了a.out中很多字符。<br/>实际上， 如果有目标文件、静态库或动态库，， 也是可以用strings命令进行打印操作的。 我们来看看：<br/>xxx.h文件：<br/><textarea name="code" class="php" rows="15" cols="100">
void print();
</textarea><br/> xxx.c文件：<br/> cat&nbsp;&nbsp;xxx.c<br/><textarea name="code" class="php" rows="15" cols="100">
#include &lt;stdio.h&gt;
#include &quot;xxx.h&quot;
 
void print()
&#123;
&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;rainy days&#92;n&quot;);
&#125;
</textarea><br/><br/> 然后， 我们来看看怎么制作静态、动态库吧（在后续博文中会继续详细介绍）：<br/>gcc -shared -fPIC -c xxx.c&nbsp;&nbsp;#-fPI得加上，否则会报relocation R_X86_64_32 against `.rodata&#039;<br/>gcc -shared -fPIC -o libxxx.so xxx.o<br/><br/>问题：<br/> gcc -shared -fPIC -o libxxx.so xxx.o<br/>/usr/bin/ld: xxx.o: relocation R_X86_64_32 against `.rodata&#039; can not be used when making a shared object; recompile with -fPIC<br/>解决办法：<br/>gcc默认没加-fPIC参数，得手工加上即可。<br/>strings xxx.o<br/>rainy days<br/><br/>strings libxxx.a<br/><textarea name="code" class="php" rows="15" cols="100">
!&lt;arch&gt;
/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1537155736&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`
Rprint
xxx.o/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1537155717&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp; 100644&nbsp;&nbsp;1496&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`
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
</textarea><br/><br/>strings libxxx.so<br/><textarea name="code" class="php" rows="15" cols="100">
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
</textarea><br/>trings命令很简单， 看起来好像没什么， 但实际有很多用途。 下面， 我来举一个例子。&nbsp;&nbsp;在大型的软件开发中， 假设有100个.c/.cpp文件， 这个.cpp文件最终生成10个.so库， 那么怎样才能快速知道某个.c/.cpp文件编译到那个.so库中去了呢？ 当然， 你可能要说， 看makefile不就知道了。 对， 看makefile肯定可以， 但如下方法更好， 直接用命令：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strings -f &quot;*.so&quot; &#124; grep &quot;xxxxxx&quot;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果还不明白， 那就就以上面的小程序为例为说明， 不过， 此处我们考虑所有的文件， 如下：<br/><br/>strings -f * &#124; grep &quot;my dear&quot;<br/>a.out: oh, my dear, c isd<br/>test.c:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;oh, my dear, c isd&#92;n&quot;, c);<br/><br/>可以看到， 源文件test.c和可执行文件中皆有&quot;my dear&quot;串， 一下子就找到了对应的文件，清楚了吧。如果某.c/.cpp文件编译进了.so库， 那么，strings -f * &#124; grep &quot;my dear&quot;必定可以找到对应的.so文件， 其中&quot;my dear&quot;为该.c/.cpp文件中的某个日志串（比如以printf为打印）。<br/><br/>来自：https://blog.csdn.net/stpeace/article/details/46641069<br/>
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [实践OK]linux中的strings命令简介]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>