﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-terrycpp-随笔分类-linux</title><link>http://www.cppblog.com/terrycpp/category/15374.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 09 Jan 2011 15:01:54 GMT</lastBuildDate><pubDate>Sun, 09 Jan 2011 15:01:54 GMT</pubDate><ttl>60</ttl><item><title>Problem about apt-get update</title><link>http://www.cppblog.com/terrycpp/archive/2011/01/08/138174.html</link><dc:creator>terrycpp</dc:creator><author>terrycpp</author><pubDate>Sat, 08 Jan 2011 15:44:00 GMT</pubDate><guid>http://www.cppblog.com/terrycpp/archive/2011/01/08/138174.html</guid><wfw:comment>http://www.cppblog.com/terrycpp/comments/138174.html</wfw:comment><comments>http://www.cppblog.com/terrycpp/archive/2011/01/08/138174.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/terrycpp/comments/commentRss/138174.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/terrycpp/services/trackbacks/138174.html</trackback:ping><description><![CDATA[Today I came across a problem about apt-get update.<br>E: Could not get lock /var/lib/apt/lists/lock - open (11 Resource temporarily unavailable)<br>
E: Unable to lock the list directory<br><br>This is because another process like synaptic or update had quit without clean the lock.<br>So .. There will be two ways to solve the problem.<br>1.If the process mentioned above quited without reboot,<br>just $ps -e |grep apt<br>and then.. kill them.<br>2.Remove /var/lib/apt/lists/lock directly..<br><br>There is no Chinese input method in my PC currently,<br>so..<br>Welcome to the English world,and improve my poor English..<br><br><img src ="http://www.cppblog.com/terrycpp/aggbug/138174.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/terrycpp/" target="_blank">terrycpp</a> 2011-01-08 23:44 <a href="http://www.cppblog.com/terrycpp/archive/2011/01/08/138174.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）linux平台gcc和动态共享库基础知识</title><link>http://www.cppblog.com/terrycpp/archive/2010/11/08/133003.html</link><dc:creator>terrycpp</dc:creator><author>terrycpp</author><pubDate>Mon, 08 Nov 2010 08:31:00 GMT</pubDate><guid>http://www.cppblog.com/terrycpp/archive/2010/11/08/133003.html</guid><wfw:comment>http://www.cppblog.com/terrycpp/comments/133003.html</wfw:comment><comments>http://www.cppblog.com/terrycpp/archive/2010/11/08/133003.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/terrycpp/comments/commentRss/133003.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/terrycpp/services/trackbacks/133003.html</trackback:ping><description><![CDATA[<p>原文出自javaeye robin，<a href="http://robbin.javaeye.com/blog/261176">http://robbin.javaeye.com/blog/261176</a><br><br>对大多数不从事Linux平台C语言开发的人来说，GNU gcc的一套工具和Linux平台的共享库的使用还是十分陌生的，其实我也不太熟悉，姑且写点基础知识，权当做备忘吧。 </p>
<p><span style="FONT-SIZE: large"><font size=4>一、GNU gcc的编译工具用法</font></span>&nbsp;<br><br>我们先来写一个简单的C程序：hello.c </p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img id=Codehighlighter1_44_80_Open_Image onclick="this.style.display='none'; Codehighlighter1_44_80_Open_Text.style.display='none'; Codehighlighter1_44_80_Closed_Image.style.display='inline'; Codehighlighter1_44_80_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_44_80_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_44_80_Closed_Text.style.display='none'; Codehighlighter1_44_80_Open_Image.style.display='inline'; Codehighlighter1_44_80_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;print_hello()&nbsp;</span><span id=Codehighlighter1_44_80_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_44_80_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Hello&nbsp;World\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img id=Codehighlighter1_120_160_Open_Image onclick="this.style.display='none'; Codehighlighter1_120_160_Open_Text.style.display='none'; Codehighlighter1_120_160_Closed_Image.style.display='inline'; Codehighlighter1_120_160_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_120_160_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_120_160_Closed_Text.style.display='none'; Codehighlighter1_120_160_Open_Image.style.display='inline'; Codehighlighter1_120_160_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;argv[])&nbsp;</span><span id=Codehighlighter1_120_160_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_120_160_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;print_hello();&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<br>定义了一个print_hello函数，调用main函数打印Hello World。 <br><br>如何编译它呢？<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">gcc&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">o&nbsp;hello&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">O2&nbsp;hello.c&nbsp;&nbsp;<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<br>-o参数指定生成的可执行程序的文件名， -O2是优化级别。该命令会编译生成hello可执行程序，看看这个文件：ls -l hello <br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">-</span><span style="COLOR: #000000">rwxr</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">xr</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">x&nbsp;&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;robbin&nbsp;users&nbsp;</span><span style="COLOR: #000000">11939</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2008</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">11</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">02</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">13</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">48</span><span style="COLOR: #000000">&nbsp;hello&nbsp;&nbsp;</span></div>
有11KB大小。 <br><br>看看他链接了哪些系统动态链接库，用ldd命令： <br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">ldd&nbsp;hello&nbsp;&nbsp;</span></div>
<br>输出信息为： <br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">libc.so.</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">lib64</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">tls</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">libc.so.</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">0x0000002a9566d000</span><span style="COLOR: #000000">)&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">lib64</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">ld</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">linux</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">x86</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">64</span><span style="COLOR: #000000">.so.</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">0x0000002a95556000</span><span style="COLOR: #000000">)&nbsp;&nbsp;<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<br>libc是C语言标准函数库，ld是动态链接器。<br>&nbsp;<br>接着我们看看hello这个程序里面有哪些符号，用nm命令：<br>&nbsp;<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">nm&nbsp;hello&nbsp;&nbsp;</span></div>
<br>输出： <br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">00000000005008f8&nbsp;A&nbsp;__bss_start&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>000000000040043c&nbsp;t&nbsp;call_gmon_start&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><img src="http://www.cppblog.com/Images/dot.gif"><img src="http://www.cppblog.com/Images/dot.gif">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>00000000004004f0&nbsp;T&nbsp;main&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">0000000000500658</span><span style="COLOR: #000000">&nbsp;d&nbsp;p.</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>00000000004004e0&nbsp;T&nbsp;print_hello&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;U&nbsp;puts@@GLIBC_2.</span><span style="COLOR: #000000">2.5</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">0000000000400410</span><span style="COLOR: #000000">&nbsp;T&nbsp;_start&nbsp;&nbsp;</span></div>
<br>中间省略了一些，不过我们还是可以在符号表里面找到函数定义。 <br>hello有11KB，体积偏大，去处符号表可以给它瘦身，我们用strip命令：<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">strip&nbsp;hello</span></div>
<br>然后再ls -l hello，输出为：<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">-</span><span style="COLOR: #000000">rwxr</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">xr</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">x&nbsp;&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;webuser&nbsp;users&nbsp;</span><span style="COLOR: #000000">4464</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2008</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">11</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">02</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">13</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">56</span><span style="COLOR: #000000">&nbsp;hello&nbsp;&nbsp;</span></div>
<br>只有4.4KB了，瘦身效果明显！ 不过这次符号表再也看不到了，nm hello，输出为：nm: hello: no symbols。 <br>最后如果我们想从可执行程序里面提取出来一点什么文本信息的话，还可以用strings命令：<br>&nbsp;<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">strings&nbsp;hello&nbsp;</span></div>
<br>输出信息为：<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">/</span><span style="COLOR: #000000">lib64</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">ld</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">linux</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">x86</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">64</span><span style="COLOR: #000000">.so.</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>SuSE&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>libc.so.</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>puts&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>__libc_start_main&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>__gmon_start__&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>GLIBC_2.</span><span style="COLOR: #000000">2.5</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>t&nbsp;fff&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>Hello&nbsp;World&nbsp;&nbsp;</span></div>
<br>友情提醒一下，如果你用Java写一个HelloWorld.java，编译以后你也可以用strings窥探一番。 <br><br><span style="FONT-SIZE: large"><font size=4>二、动态共享库怎么使用</font></span> <br><br>这次我们把hello.c拆开成为两个文件：hello.c和main.c。hello.c的代码是： <br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img id=Codehighlighter1_44_80_Open_Image onclick="this.style.display='none'; Codehighlighter1_44_80_Open_Text.style.display='none'; Codehighlighter1_44_80_Closed_Image.style.display='inline'; Codehighlighter1_44_80_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_44_80_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_44_80_Closed_Text.style.display='none'; Codehighlighter1_44_80_Open_Image.style.display='inline'; Codehighlighter1_44_80_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;print_hello()&nbsp;</span><span id=Codehighlighter1_44_80_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_44_80_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Hello&nbsp;World\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;<br></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<br>而main.c的代码是：<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img id=Codehighlighter1_32_72_Open_Image onclick="this.style.display='none'; Codehighlighter1_32_72_Open_Text.style.display='none'; Codehighlighter1_32_72_Closed_Image.style.display='inline'; Codehighlighter1_32_72_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_32_72_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_32_72_Closed_Text.style.display='none'; Codehighlighter1_32_72_Open_Image.style.display='inline'; Codehighlighter1_32_72_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;argv[])&nbsp;</span><span id=Codehighlighter1_32_72_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_32_72_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;print_hello();&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;</span></div>
<br>hello.c是我们的动态共享库，在hello.c里面我们声明和实现了各种公用的函数，最后main.c可以去调用这些公用函数。首先我们要把hello.c编译成为动态共享库：<br><br>-fPIC参数声明链接库的代码段是可以共享的，-shared参数声明编译为共享库。请注意这次我们编译的共享库的名字叫做libhello.so，这也是Linux共享库的一个命名的惯例了：后缀使用so，而名称使用libxxxx格式。 <br><br>然后编译main.c的时候，我们需要更多的参数让gcc知道如何寻找共享库： <br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">gcc&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">o&nbsp;main&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">O2&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">L&nbsp;.&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">l&nbsp;hello&nbsp;main.c</span></div>
<br>-L参数指定到哪个附加路径下面去寻找共享库，现在我们指定在当前目录下面寻找； <br>-l参数指定链接到哪个共享库上面，我们传的参数hello，那么gcc就会自动链接到libhello.so这个共享库上面(注意我们上面说的libXXXX.so命名规则)； <br>-I参数指定到哪个附加路径下面去寻找h文件，这个我们没有使用。 <br><br>最后我们成功编译好了main，执行一下，报错： <br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">.</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">main:&nbsp;error&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;loading&nbsp;shared&nbsp;libraries:&nbsp;libhello.so:&nbsp;cannot&nbsp;open&nbsp;shared&nbsp;</span><span style="COLOR: #0000ff">object</span><span style="COLOR: #000000">&nbsp;file:&nbsp;No&nbsp;such&nbsp;file&nbsp;or&nbsp;directory</span></div>
<br>找不到libhello.so这个共享库，怎么回事？这是因为libhello.so并不在操作系统默认的共享库的路径下面，我们可以临时指定一下链接路径：<br>&nbsp;<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">export&nbsp;LD_LIBRARY_PATH</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">.:$LD_LIBRARY_PATH</span></div>
<br>这样就成功了。我们用ldd main看一下： <br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">libhello.so&nbsp;</span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000">&nbsp;.</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">libhello.so&nbsp;(</span><span style="COLOR: #000000">0x0000002a9566d000</span><span style="COLOR: #000000">)&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>libc.so.</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">lib64</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">tls</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">libc.so.</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">0x0000002a9576e000</span><span style="COLOR: #000000">)&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">lib64</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">ld</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">linux</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">x86</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">64</span><span style="COLOR: #000000">.so.</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">0x0000002a95556000</span><span style="COLOR: #000000">)&nbsp;</span></div>
<br>这次main程序链接到了libhello.so这个共享库上面。 <br><br><span style="FONT-SIZE: large"><font size=4>三、关于Linux的动态共享库的设置</font></span> <br><br>可执行程序找不到要链接的动态共享库，这是Linux上面编译和运行程序很容易碰到的问题，通过上面的小例子，我们已经大致了解共享库的一点基本原理，接下来我们要探讨一下怎么设置程序寻找动态共享库的行为。 <br><br>Linux操作系统上面的动态共享库大致分为三类： <br><br><span style="FONT-SIZE: large"><font size=4>1、操作系统级别的共享库和基础的系统工具库</font></span> <br><br>比方说libc.so, libz.so, libpthread.so等等，这些系统库会被放在/lib和/usr/lib目录下面，如果是64位操作系统，还会有/lib64和/usr/lib64目录。如果操作系统带有图形界面，那么还会有/usr/X11R6/lib目录，如果是64位操作系统，还有/usr/X11R6/lib64目录。此外还可能有其他特定Linux版本的系统库目录。 <br><br>这些系统库文件的完整和版本的正确，确保了Linux上面各种程序能够正常的运行。 <br><br><span style="FONT-SIZE: large"><font size=4>2、应用程序级别的系统共享库</font></span> <br><br>并非操作系统自带，但是可能被很多应用程序所共享的库，一般会被放在/usr/local/lib和/usr/local/lib64这两个目录下面。很多你自行编译安装的程序都会在编译的时候自动把/usr/local/lib加入gcc的-L参数，而在运行的时候自动到/usr/local/lib下面去寻找共享库。 <br><br>以上两类的动态共享库，应用程序会自动寻找到他们，并不需要你额外的设置和担心。这是为什么呢？ 因为以上这些目录默认就被加入到动态链接程序的搜索路径里面了。Linux的系统共享库搜索路径定义在/etc/ld.so.conf这个配置文件里面。这个文件的内容格式大致如下：<br>&nbsp;<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">/</span><span style="COLOR: #000000">usr</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">X11R6</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">lib64&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">usr</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">X11R6</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">lib&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">usr</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">local</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">lib&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">lib64&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">lib&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">usr</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">lib64&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">usr</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">lib&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">usr</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">local</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">lib64&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">usr</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">local</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">ImageMagick</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">lib&nbsp;&nbsp;</span></div>
<br>假设我们自己编译安装的ImageMagick图形库在/usr/local/ImageMagick目录下面，并且希望其他应用程序都可以使用ImageMagick的动态共享库，那么我们只需要把/usr/local/ImageMagick/lib目录加入/etc/ld.so.conf文件里面，然后执行：ldconfig 命令即可。 <br><br>ldcofig将搜索以上所有的目录，为共享库建立一个缓存文件/etc/ld.so.cache。为了确认ldconfig已经搜索到ImageMagick的库，我们可以用上面介绍的strings命令从ld.so.cache里面抽取文本信息来检查一下：<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">strings&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">etc</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">ld.so.cache&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;grep&nbsp;ImageMagick&nbsp;&nbsp;&nbsp;</span></div>
<br>输出结果为： <br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">/</span><span style="COLOR: #000000">usr</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">local</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">ImageMagick</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">lib</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">libWand.so.</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">usr</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">local</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">ImageMagick</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">lib</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">libWand.so&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">usr</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">local</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">ImageMagick</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">lib</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">libMagick.so.</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">usr</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">local</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">ImageMagick</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">lib</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">libMagick.so&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">usr</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">local</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">ImageMagick</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">lib</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">libMagick</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">.so.</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">usr</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">local</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">ImageMagick</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">lib</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">libMagick</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">.so&nbsp;&nbsp;</span></div>
<br>已经成功了！ <br><br><span style="FONT-SIZE: large"><font size=4>3、应用程序独享的动态共享库</font></span> <br><br>有很多共享库只被特定的应用程序使用，那么就没有必要加入系统库路径，以免应用程序的共享库之间发生版本冲突。因此Linux还可以通过设置环境变量LD_LIBRARY_PATH来临时指定应用程序的共享库搜索路径，就像我们上面举的那个例子一样，我们可以在应用程序的启动脚本里面预先设置LD_LIBRARY_PATH，指定本应用程序附加的共享库搜索路径，从而让应用程序找到它。 <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
<img src ="http://www.cppblog.com/terrycpp/aggbug/133003.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/terrycpp/" target="_blank">terrycpp</a> 2010-11-08 16:31 <a href="http://www.cppblog.com/terrycpp/archive/2010/11/08/133003.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>list_head</title><link>http://www.cppblog.com/terrycpp/archive/2010/11/08/132978.html</link><dc:creator>terrycpp</dc:creator><author>terrycpp</author><pubDate>Mon, 08 Nov 2010 03:23:00 GMT</pubDate><guid>http://www.cppblog.com/terrycpp/archive/2010/11/08/132978.html</guid><wfw:comment>http://www.cppblog.com/terrycpp/comments/132978.html</wfw:comment><comments>http://www.cppblog.com/terrycpp/archive/2010/11/08/132978.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/terrycpp/comments/commentRss/132978.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/terrycpp/services/trackbacks/132978.html</trackback:ping><description><![CDATA[项目里面用到了list_head结构体，出现了问题，该问题与这篇主题无关，而且尚未解决，可能是&lt;linux/list.h&gt;库没被包含吧，要晚上回去再研究。<br>找问题原因的时候看了看list_head的定义，是下面这样的<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img id=Codehighlighter1_17_54_Open_Image onclick="this.style.display='none'; Codehighlighter1_17_54_Open_Text.style.display='none'; Codehighlighter1_17_54_Closed_Image.style.display='inline'; Codehighlighter1_17_54_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_17_54_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_17_54_Closed_Text.style.display='none'; Codehighlighter1_17_54_Open_Image.style.display='inline'; Codehighlighter1_17_54_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;list_head&nbsp;</span><span id=Codehighlighter1_17_54_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id=Codehighlighter1_17_54_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;list_head&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">next,&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">prev;<br></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;&nbsp;</span></div>
于是觉得奇怪，这个结构怎么来保存数据呢？<br>上网查了之后长见识了，原来还可以这样。<br>list_head在别的结构中是充当&#8220;栏位&#8221;的角色，即拿到list_head之后，可以根据偏移位数来得到原结构变量的起始地址。<br>可以使用list_entry来取得入口地址，list_entry定义如下：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;list_entry(ptr,&nbsp;type,&nbsp;member)&nbsp;\</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>((type&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)((</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)(ptr)</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">(unsigned&nbsp;</span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">)(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">((type&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">member)))&nbsp;</span></div>
使用例子：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">list_entry(&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">sb1.s_list,&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;super_block,&nbsp;s_list)</span></div>
上面例子可以用来根据s_list地址来取得sb1这个super_block结构体变量的地址。
<img src ="http://www.cppblog.com/terrycpp/aggbug/132978.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/terrycpp/" target="_blank">terrycpp</a> 2010-11-08 11:23 <a href="http://www.cppblog.com/terrycpp/archive/2010/11/08/132978.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[导入]linux下解压xz文件</title><link>http://www.cppblog.com/terrycpp/archive/2010/11/04/132491.html</link><dc:creator>terrycpp</dc:creator><author>terrycpp</author><pubDate>Thu, 04 Nov 2010 14:21:00 GMT</pubDate><guid>http://www.cppblog.com/terrycpp/archive/2010/11/04/132491.html</guid><wfw:comment>http://www.cppblog.com/terrycpp/comments/132491.html</wfw:comment><comments>http://www.cppblog.com/terrycpp/archive/2010/11/04/132491.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/terrycpp/comments/commentRss/132491.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/terrycpp/services/trackbacks/132491.html</trackback:ping><description><![CDATA[在做防火墙项目的时候，老出现不可理喻的问题，怒了，换换新的开发包版本吧，然后down下来一个xz文件纠结了我半天。解决方法如下：<a href="http://ftp.osuosl.org/pub/haiku/releases/r1alpha2/sources/libpcre-8.02_haiku-2010-04-29.tar.xz"><strong></strong></a><br>先在下面这个站点下载解压工具<br><a href="http://tukaani.org/xz/xz-4.999.9beta.tar.bz2">http://tukaani.org/xz/xz-4.999.9beta.tar.bz2</a>
<p>$tar -jxvf xz-4.999.9beta.tar.bz2<br>$./configure --prefix=/opt/gnu/xz</p>
<p>$make</p>
<p>$sudo make install</p>
<p>$ln -s /opt/gnu/xz/bin/xz /bin/xz&nbsp; （前面那个路径可能有差异，自己进去看看）<br></p>
<p>$xz -d ***.<strong>tar.xz</strong></p>
<p>$tar -xvf&nbsp; ***.tar</p>
<p>ok！<br></p>
<br><br><img height=1 src="http://www.cppblog.com/vc-zs/aggbug/130485.html" width=1><br><br>
<div align=right><a style="TEXT-DECORATION: none" href="http://www.cppblog.com/vc-zs/" target=_blank>vc-zs</a> 2010-10-19 19:31 <a style="TEXT-DECORATION: none" href="http://www.cppblog.com/vc-zs/archive/2010/10/19/130485.html#Feedback" target=_blank>发表评论</a></div>
<br>文章来源:<a href="http://www.cppblog.com/vc-zs/archive/2010/10/19/130485.html">http://www.cppblog.com/vc-zs/archive/2010/10/19/130485.html</a> 
<img src ="http://www.cppblog.com/terrycpp/aggbug/132491.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/terrycpp/" target="_blank">terrycpp</a> 2010-11-04 22:21 <a href="http://www.cppblog.com/terrycpp/archive/2010/11/04/132491.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>