<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.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://www.jackxiang.com/post//</link>
<title><![CDATA[ [实践OK]入门教学之Linux如何解决动态库的版本控制, Linux如何解决动态库的版本控制，C语言HelloWorld示例，readelf -d libhello.so.0.0.0 grep SONAME,以及动态链接的进程映射之/proc/pid/maps。 分析/proc/[pid]/maps中的各个内存区域的大小。]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[Unix/LinuxC技术]]></category>
<pubDate>Wed, 31 Dec 2014 08:21:27 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	核心中的核心：<br/>gcc -shared -Wl,-soname,libhello.so.0 -o libhello.so.0.0.0 hello.o&nbsp;&nbsp; #在生成可执行文件时就得有：libhello.so.0文件，即使是软链接也成，得有。动态链接版本库的标准用法，不标准用libhello.so 也成：gcc -shared -Wl,-soname,libhello.so -o libhello.so.0.0.0 hello.o<br/><br/>背景：共享库，主版本升级，即接口发生变化。<br/>Linux 系统提供一个命令 ldconifg 专门为生成共享库的soname 文件，以便程序在加载时后通过soname 找到共享库。<br/>1)real name:<br/>咱生成的实体文件是：real name ==&gt;libhello.so.0.0.0 <br/>readelf -d libhello.so.0.0.0 &#124;grep SONAME<br/> 0x000000000000000e (SONAME)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Library soname: [libhello.so.0]<br/>1.1.1234的是共享库的版本号，其主版本号+小版本号+build号。主板号，代表当前动态库的版本，如果动态库的接口有变化，那么这个版本号就要加1；后面的两个版本号（小版本号 和 build 号）是告诉你详细的信息，比如为一个hot-fix 而生成的一个版本，其小版本号加1，build号也应有变化。 这个文件名包含共享库的代码。<br/><br/>2)soname:<br/>动态库的soname（ Short for shared object name），其是应用程序加载dll 时候，其寻找共享库用的文件名。ldconfig会自动生成，格式为前面的realname：<br/>&nbsp;&nbsp; lib + math+.so + ( major version number)<br/><br/>3)link name:<br/>共享库的连接名（link name），是专门为build 阶段连接而用的名字。这个名字就是lib + math +.so ,比如libmath.so。其是不带任何版本信息的。<br/>例子，在编译时需要link name ,专门为build 阶段连接而用的名字，否者报错/usr/bin/ld: cannot find -lhello：(共享库的连接名（link name），是专门为build 阶段连接而用的名字。例子叫： libhello.so)<br/>gcc&nbsp;&nbsp;-o main main.o -lhello -L.<br/>/usr/bin/ld: cannot find -lhello<br/>解决办法：<br/>ln -sf libhello.so.0 libhello.so<br/><br/>4)ldconfig自动找SONAME，生成SONAME名的共享库，如下：<br/>最后，ldconfig时，是找那个SONAME，然后自动生成对应的共享库：<br/>inux 系统提供一个命令 ldconifg 专门为生成共享库的soname 文件，以便程序在加载时后通过soname 找到共享库。<br/>实践并证明如下（生成SONAME名：gcc -shared -Wl,-soname,libhello.so.0 -o libhello.so.0.0.0 hello.o ，名字叫：libhello.so.0 ,这块即使-L. 引用了，非软链接是libhello.so.0.0.0， 它会提示：/bin/ld: cannot find -lhello，这个：-soname指定名字后，-L会找它，无论是实体的libhello.so.0还是软链接都得有，否则会提示cannot find -lhello,当然，你可以直接写成：gcc -shared -Wl,-soname,libhello.so -o libhello.so.0.0.0 libhello.o ，gcc&nbsp;&nbsp;-o main main.o -lhello -L.&nbsp;&nbsp;，它会找libhello.so文件是否存在，当然可以软链接：mv libhello.so libhello.so.0.0.0 ，ln -s libhello.so.0.0.0 libhello.so，再编译就能通过：gcc&nbsp;&nbsp;-o main main.o -lhello -L.&nbsp;&nbsp;，至于运行还是得找：LD_LIBRARY_PATH和ldconfig进行帮忙。）：<br/>readelf -d /home/xiangdong/test/c/libhello.so.0.0.0&#124;grep SONAME<br/> 0x000000000000000e (SONAME)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Library soname: [libhello.so.0]<br/>cp /home/xiangdong/test/c/libhello.so.0.0.0 /usr/lib64/.<br/>ldconfig -p&#124;grep hello<br/>ldconfig<br/>ldconfig -p&#124;grep hello<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libhello.so.0 (libc6,x86-64) =&gt; /usr/lib64/libhello.so.0&nbsp;&nbsp;(这个自动由chkconfig生成的so就是前面生成的SONAME名，这一句：gcc -shared -Wl,-soname,libhello.so.0 -o libhello.so.0.0.0 hello.o)<br/><br/><br/>升级问题：<br/>1）共享库，小版本升级，即接口不变.<br/>当升级小版本时，共享库的soname 是不变的，所以需要重新把soname 的那个连接文件指定新版本就可以。 调用ldconfig命令，系统会帮你做修改那个soname link文件，并把它指向新的版本呢。这时候你的应用程序就自动升级了。<br/>2）共享库，主版本升级，即接口发生变化。<br/>共享库，主版本升级，即接口发生变化。<br/><br/>&nbsp;&nbsp;当升级主版本时，共享库的soname 就会加1.比如libhello.so.0.0.0 变为 libhello.so.1.0.0. 这时候再运行ldconfig 文件，就会发现生成两个连接 文件。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;ln -s libhello.so.0----&gt;libhello.so.0.0.0<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;ln -s libhello.so.1-----&gt;libhello.so.1.0.0<br/><br/>尽管共享库升级，但是你的程序依旧用的是旧的共享库，并且两个之间不会相互影响。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;问题是如果更新的共享库只是增加一些接口，并没有修改已有的接口，也就是向前兼容。但是这时候它的主版本号却增加1. 如果你的应用程序想调用新的共享库，该怎么办？ 简单，只要手工把soname 文件修改，使其指向新的版本就可以。（这时候ldconfig 文件不会帮你做这样的事，因为这时候soname 和real name 的版本号主板本号不一致，只能手动修改）。<br/><br/>&nbsp;&nbsp;比如： ln -s libhello.so.0 ---&gt; libhello.so.1.0.0<br/><br/>&nbsp;&nbsp;但是有时候，主版本号增加，接口发生变化，可能向前不兼容。这时候再这样子修改，就会报错，“xx”方法找不到之类的错误。<br/><br/>总结一下，Linux 系统是通过共享库的三个不同名字，来管理共享库的多个版本。 real name 就是共享库的实际文件名字，soname 就是共享库加载时的用的文件名。在生成共享库的时候，编译器将soname 绑定到共享库的文件头里，二者关联起来。 在应用程序引用共享库时，其通过link name 来完成，link时将按照系统指定的目录去搜索link名字找到共享库，并将共享库的soname写在应用程序的头文件里。当应用程序加载共享库时，就会通过soname在系统指定的目录（path or LD_LIBRARY)去寻找共享库。<br/><br/>当共享库升级时，分为两种。一种是主板本不变，升级小版本和build 号。在这种情况下，系统会通过更新soname（ ldconfig 来维护），来使用新的版本号。这中情况下，旧版本就没有用，可以删掉。<br/><br/>另外一种是主版本升级，其意味着库的接口发生变化，当然，这时候不能覆盖已有的soname。系统通过增加一个soname（ldconfig -p 里面增加一项），使得新旧版本同时存在。原有的应用程序在加载时,还是根据自己头文件的旧soname 去寻找老的库文件。<br/><br/>5.如果编译的时候没有指定，共享库的soname，会怎么样？<br/><br/>&nbsp;&nbsp;这是一个trick 的地方。第一系统将会在生成库的时候，就没有soname放到库的头里面。从而应用程序连接时候，就把linkname 放到应用程序依赖库里面。或者换句话说就是，soname这时候不带版本号。 有时候有人直接利用这点来升级应用程序，比如，新版本的库，直接拷贝到系统目录下，就会覆盖掉已经存在的旧的库文件，直接升级。 这个给程序员很大程度的便利性，如果一步小心，就会调到类似windows的Dll hell 陷阱里面。建议不要这样做。<br/>=================================================================================================<br/><br/>Makefile有一句:<br/>DYLIB_MAKE_CMD=$(CC) -shared -Wl,-soname,$(DYLIB_MINOR_NAME) -o $(DYLIBNAME) $(LDFLAGS)<br/>编译下看看输出：<br/>[hiredis]# make clean <br/>rm -rf libhiredis.so libhiredis.a hiredis-test examples/hiredis-example* *.o *.gcda *.gcno *.gcov<br/>[hiredis]# make<br/>cc -std=c99 -pedantic -c -O3 -fPIC&nbsp;&nbsp;-Wall -W -Wstrict-prototypes -Wwrite-strings -g -ggdb&nbsp;&nbsp;net.c<br/>cc -std=c99 -pedantic -c -O3 -fPIC&nbsp;&nbsp;-Wall -W -Wstrict-prototypes -Wwrite-strings -g -ggdb&nbsp;&nbsp;hiredis.c<br/>cc -std=c99 -pedantic -c -O3 -fPIC&nbsp;&nbsp;-Wall -W -Wstrict-prototypes -Wwrite-strings -g -ggdb&nbsp;&nbsp;sds.c<br/>cc -std=c99 -pedantic -c -O3 -fPIC&nbsp;&nbsp;-Wall -W -Wstrict-prototypes -Wwrite-strings -g -ggdb&nbsp;&nbsp;async.c<br/>cc -shared -Wl,-soname,libhiredis.so.0.11 -o libhiredis.so&nbsp;&nbsp;net.o hiredis.o sds.o async.o<br/>静态编译：<br/>ar rcs libhiredis.a net.o hiredis.o sds.o async.o<br/>一）这个/home/test/rpmbuild/BUILD/ngx_http_monitor_module-2.2.0/hiredis 目录下面也并没有：<br/>ls libhiredis.so.0.11 <br/>ls: cannot access libhiredis.so.0.11: No such file or directory<br/>readelf -d libhiredis.so <br/>静态就是纯静态的：<br/>ldd libhiredis.a<br/>ldd: warning: you do not have execution permission for `./libhiredis.a&#039;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;not a dynamic executable<br/><br/>Dynamic section at offset 0xa7f0 contains 21 entries:<br/>&nbsp;&nbsp;Tag&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Name/Value<br/> 0x0000000000000001 (NEEDED)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Shared library: [libc.so.6]<br/> 0x000000000000000e (SONAME)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Library soname: [libhiredis.so.0.11]&nbsp;&nbsp; &lt;===就是这个就是-soname,libhiredis.so.0.11编译进去的。<br/><br/>二）Nginx启动后，并找不到这个:<br/> ldd /usr/local/nginx/sbin/nginx <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libhiredis.so.0.11 =&gt; not found<br/>Starting nginx: /usr/local/nginx/sbin/nginx: error while loading shared libraries: libhiredis.so.0.11: cannot open shared object file: No such file or directory<br/><br/>=============================================================================================<br/><br/><br/>怎么样实现把共享库的soname 提取出来，写在自己的共享库的头文件里面？<br/>第二个是动态库的soname（ Short for shared object name），依赖该shared library的应用程序中记录了它的soname，所以应用程序加载该shared library的时候，其寻找共享库用的soname文件名。其格式为<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lib + math+.so + ( major version number)<br/><br/>它是一个指向名字为real name的shared library的软链接。<br/><br/>&nbsp;&nbsp;当升级主版本时，共享库的soname 就会加1.比如libhello.so.0.0.0 变为 libhello.so.1.0.0. 这时候再运行ldconfig 文件，就会发现生成两个连接 文件。<br/>&nbsp;&nbsp;&nbsp;&nbsp;ln -s libhello.so.0----&gt;libhello.so.0.0.0<br/>&nbsp;&nbsp;&nbsp;&nbsp;ln -s libhello.so.1-----&gt;libhello.so.1.0.0<br/>尽管共享库升级，但是你的程序依旧用的是旧的共享库，并且两个之间不会相互影响。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;问题是如果更新的共享库只是增加一些接口，并没有修改已有的接口，也就是向前兼容。但是这时候它的主版本号却增加1. 如果你的应用程序想调用新的共享库，该怎么办？ 简单，只要手工把soname 文件修改，使其指向新的版本就可以。（这时候ldconfig 文件不会帮你做这样的事，因为这时候soname 和real name 的版本号主板本号不一致，只能手动修改）。<br/>&nbsp;&nbsp;比如： ln -s libhello.so.0 ---&gt; libhello.so.1.0.0<br/>&nbsp;&nbsp;但是有时候，主版本号增加，接口发生变化，可能向前不兼容。这时候再这样子修改，就会报错，“xx”方法找不到之类的错误。<br/><br/>这就是接下来要介绍的第三个共享库的名字，link name，顾名思义，就是在编译过程，link 阶段用的文件名。 其将soname 和real name 关联起来。<br/>第三个名字，共享库的连接名（link name），是专门为build 阶段连接而用的名字。这个名字就是lib + math +.so ,比如libmath.so。其是不带任何版本信息的。在共享库编译过程中，连接（link） 阶段，编译器将生成一个共享库及real name，同时将共享库的soname，写在共享库文件里的文件头里面。可以用命令 readelf -d sharelibrary 去查看。<br/><br/>在应用程序引用共享库时，其会用到共享库的link name。在应用程序的link阶段，其通过link名字找到动态库，并且把共享库的soname 提取出来，写在自己的共享库的头文件里面。当应用程序加载时就会通过soname 去给定的路径下寻找该共享库。<br/>参考：<br/>http://blog.163.com/kefeng_1984/blog/static/166615272014714114141296/<br/>http://blog.chinaunix.net/uid-23592843-id-223539.html<br/><br/><br/>代码文件如下结构：<br/><textarea name="code" class="php" rows="15" cols="100">
tree -L 1 /usr/local/src/dll/libhello
/usr/local/src/dll/libhello
├── hello.o
├── libhello.c
├── libhello.h
└── main.c

cat /usr/local/src/dll/libhello/libhello.c
/* hello.c - demonstrate library use. */
#include &lt;stdio.h&gt;
void hello(void) 
&#123;&nbsp;&nbsp;printf(&quot;Hello, library world./n&quot;);&#125;

cat /usr/local/src/dll/libhello/libhello.h
/* libhello.h - demonstrate library use. */
void hello(void);

cat /home/xiangdong/test/c/main.c
#include &quot;libhello.h&quot;&nbsp;&nbsp;
int main(void)&nbsp;&nbsp; 
&#123;&nbsp;&nbsp;
&nbsp;&nbsp; hello();&nbsp;&nbsp; 
&nbsp;&nbsp; return 0;&nbsp;&nbsp;
&#125;
</textarea><br/><br/>1.生成共享库，关联real name 和soname 。<br/>[root@test libhelo]#gcc -shared -W,soname,-libhello.so.0 -o libhello.so.0.0.0 hello.o&nbsp;&nbsp;#这句不行因为写错了，在soname前面得有一个小横杠，在libhello.so.0前面没有小横杠，得用下一句能正常产生带SONAME的动态链接库，互联网害人，这篇文章也是这么写的@ https://www.xuebuyuan.com/501443.html ，正确来自@http://emb.hqyj.com/Column/Column277.htm ，gcc -shared -Wl,-soname,libmylib.so.1 -o libmylib.so.1 *.o ，参考后如下:<br/><textarea name="code" class="php" rows="15" cols="100">
gcc -g -Wall -fPIC -c libhello.c -o libhello.o
gcc -shared -Wl,-soname,libhello.so.0 -o libhello.so.0.0.0 libhello.o&nbsp;&nbsp; #关键核心1：生成了libhello.so.0.0.0，共享库libhello.so.0.0.0为何三位，是因为方便迭代版本如：1.4.1，而1就是大版本，里面的函数名和接口参数不变，要作大改动则会升级到2，于是就形成0.01,0.10,0.11 大版本后到 2.00,2,01,2.10,2.11 这样的，正如前面所说的大版本不变于是在最终编译出来和main是一个二进制且引用了动态可执行文件，它里面用的是libhello.so.0,也就是0这个大版本号，0.01,0.10,0.11都是属于0这个大版本号下面的。
</textarea><br/><br/>将会生成共享库libhello.so.0.0.0,可以用系统提供的工具查看共享库的头：<br/><textarea name="code" class="php" rows="15" cols="100">
readelf -d libhello.so.0.0.0 &#124;grep SONAME
0x000000000000000e (SONAME)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Library soname: [libhello.so.0]
</textarea><br/>tree -L 1 /usr/local/src/dll/libhello<br/>/usr/local/src/dll/libhello<br/>├── libhello.c<br/>├── libhello.h<br/>├── libhello.o<br/>├── libhello.so.0.0.0<br/>└── main.c <br/>查看共享库的头：<br/>[root@test libhelo]# readelf -d libhello.so.0.0.0 &#124;grep Shared<br/> 0x0000000000000001 (NEEDED)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Shared library: [libc.so.6]<br/> <br/>2.应用程序，引用共享库。<br/>ln -s libhello.so.0.0.0 libhello.so.0<br/>/usr/local/src/dll/libhello/libhello.so.0 -&gt; libhello.so.0.0.0<br/><br/>ls /usr/local/src/dll/libhello<br/>libhello.c&nbsp;&nbsp;libhello.h&nbsp;&nbsp;libhello.o&nbsp;&nbsp;libhello.so.0&nbsp;&nbsp;libhello.so.0.0.0&nbsp;&nbsp;main.c<br/><br/><textarea name="code" class="php" rows="15" cols="100">
gcc -g -Wall -c main.c -o main.o -I.&nbsp;&nbsp;&nbsp;&nbsp;#关键核心2：生成main.o,这儿gcc里后面没有加上-I和libhello.h，当前目录的.h找不到后会报错：main.c:1:21: fatal error: hello.h: No such file or directory

gcc&nbsp;&nbsp;-o main main.o -lhello -L.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #关键核心3：引用共享库，-L表示库的路径查找位置在当前目录,生成main可执行文件,能通，但是在成功编译且生成二进制后无法运行，找不到libhello.so.0，需要lddconfig作一下下面的链接操作。【/bin/ld: cannot find -lhello&nbsp;&nbsp;，经实践做这个操作编译执行成功，就能好了：ln -s libhello.so.0.0.0 libhello.so.0，但是执行会报错是另一回事：./main: error while loading shared libraries: libhello.so.0: cannot open shared object file: No such file or directory，readelf -d libhello.so.0 &#124;grep SONAME 显示： 0x000000000000000e (SONAME)&nbsp;&nbsp;Library soname: [libhello.so.0]，LD_LIBRARY_PATH或者ldconfig正式方式解决。&nbsp;&nbsp; export LD_LIBRARY_PATH=`pwd` ./main成功运行！AddTime:2022-07-13 】
详细解决办法及原因如下所述：
ln -sf libhello.so.0 libhello.so&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #引用共享库编译时找的是libhello.so,并不是前面生成的libhello.so.0.0.0,也不是它的软链接libhello.so.0，需要做软链接。否则出现/bin/ld: cannot find -lhello。
/bin/ld: cannot find -lhello
collect2: error: ld returned 1 exit status
/usr/bin/ld: cannot find -lhello
解决办法：
ln -sf libhello.so.0 libhello.so&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#编译时找的是libhello.so,并不是libhello.so.0.0.0,也不是它的软链接libhello.so.0
libhello.so.0.0.0
libhello.so.0 -&gt; libhello.so.0.0.0
libhello.so -&gt; libhello.so.0

readelf -d main &#124; grep libhello&nbsp;&nbsp;#但里面其实找的是libhello.so.0,也并不是编译时的libhello.so和libhello.so.0.0.0。
 0x0000000000000001 (NEEDED)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Shared library: [libhello.so.0]
</textarea><br/>新加动态链接库的Path，文件内容如下：<br/>cat /etc/ld.so.conf.d/libhello.conf <br/>/usr/local/hello/lib<br/><br/>由于动态链接库的编译能过，但是运行不行，找不到SO文件也就是缺SO，过一下ldconfig,ldconfig <br/>ldconfig: /usr/local/hello/lib/libhello.so.0 is not a symbolic link<br/>因为libxerces-c-3.0.so正常情况下应该是一个符号链接,而不是实体文集件,修改其为符号链接即可<br/>原因是全拷贝过/usr/local/hello/lib后，软链接变成实体文件了，重新拷贝后正常：<br/>cp -rf libhello.so* /usr/local/hello/lib/.<br/>总之不能是实体文件，解决方法就是软链接,形成如下软链接：<br/>libhello.so.0.0.0<br/>libhello.so.0 -&gt; libhello.so.0.0.0<br/>libhello.so -&gt; libhello.so.0<br/>这样就ok了，<br/>ldconfig&nbsp;&nbsp;-p&#124;grep hello <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libhello.so.0 (libc6,x86-64) =&gt; /usr/local/hello/lib/libhello.so.0<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libhello.so (libc6,x86-64) =&gt; /usr/local/hello/lib/libhello.so<br/>./main <br/>Hello, library world./n<br/><br/>ldd main&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;linux-vdso.so.1 =&gt;&nbsp;&nbsp;(0x00007ffc659a7000)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libhello.so.0 =&gt; /usr/local/hello/lib/libhello.so.0 (0x00007f740d43d000)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libc.so.6 =&gt; /lib64/libc.so.6 (0x00007f740d070000)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/lib64/ld-linux-x86-64.so.2 (0x00007f740d64a000)<br/><br/><br/>汇总编译的步骤，如下：<br/>cat make.sh&nbsp;&nbsp; <br/>gcc -g -Wall -fPIC -c libhello.c -o libhello.o<br/>gcc -shared -Wl,-soname,libhello.so.0 -o libhello.so.0.0.0 libhello.o<br/>gcc -g -Wall -c main.c -o main.o -I.<br/>gcc&nbsp;&nbsp;-o main main.o -lhello -L. <br/>ln -sf libhello.so.0.0.0 libhello.so.0<br/>ln -sf libhello.so.0 libhello.so&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/><br/>软链接是左边是存在待被指向的实体文件，右边是软链接的软链接文件（仅仅是一个链接文件）。<br/><br/>完成。想继续探讨引入了动态链接库在RSS,VSZ上的一个系统不一致研究并查看：<br/><a href="https://jackxiang.com/post/842/" target="_blank">https://jackxiang.com/post/842/</a><br/><br/><br/><br/>查看编译出来的最终程序里面的soname:<br/>readelf -d main &#124; grep libhello<br/><br/>[root@test libhelo]#&nbsp;&nbsp;&nbsp;&nbsp;readelf -d main &#124; grep libhello<br/> 0x0000000000000001 (NEEDED)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Shared library: [libhello.so]<br/>ldd libhello.so.0<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;linux-vdso.so.1 =&gt;&nbsp;&nbsp;(0x00007ffeb05dd000)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libc.so.6 =&gt; /lib64/libc.so.6 (0x00007fb1f5628000)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/lib64/ld-linux-x86-64.so.2 (0x0000003771000000)<br/><br/>运行程序：<br/>[root@test libhelo]# ./hello <br/>./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory<br/>[root@test libhelo]# vi /etc/ld.so.conf<br/>/tmp/libhelo&nbsp;&nbsp; <br/>[root@test libhelo]# ldconfig <br/>[root@test libhelo]# ./hello&nbsp;&nbsp;<br/>Hello, library world./n<br/><br/><br/>通常在软件编译时出现的usr/bin/ld: cannot find -lxxx的错误，主要的原因是库文件并没有导入的ld检索目录中。<br/>gcc&nbsp;&nbsp;-o main main.o -lhello -L.<br/>/usr/bin/ld: cannot find -lhello<br/>collect2: ld returned 1 exit status<br/><br/>成功解决办法：<br/>ln -sf libhello.so.0 libhello.so&nbsp;&nbsp;&nbsp;&nbsp;# 来自：https://www.cnblogs.com/timeisbiggestboss/articles/7044947.html<br/>1。确认库文件是否存在，比如-l123, 在/usr/lib, /usr/local/lib,或者其他自定义的lib下有无lib123.so, 如果只是存在lib123.so.1,那么可以通过ln -sv lib123.so.1&nbsp;&nbsp; lib123.so，建立一个连接重建lib123.so.<br/><br/><br/><br/><br/>临时解决方案采用变量：<br/>命令行：export LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH<br/>或者&nbsp;&nbsp;&nbsp;&nbsp;export LD_LIBRARY_PATH=/home/other/test/lib:$LD_LIBRARY_PATH&nbsp;&nbsp;&nbsp;&nbsp;<br/>配置之后最好运行一下：# ldconfig<br/>临时设置变量 LD_LIBRARY_PATH ，下次开机，一切设置将不复存在；如何把这个值持续写到 LD_LIBRARY_PATH 里呢？<br/>我们可以在 ~/.bashrc 或者 ~/.bash_profile 中加入 export 语句，前者在每次登陆和每次打开 shell 都读取一次，后者只在登陆时读取一次。<br/>我的习惯是加到 ~/.bashrc 中，在该文件的未尾，可采用如下语句来使设置生效：<br/>export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib<br/>修改完后，记得关掉当前终端并重新打开一个新的终端，从而使上面的配置生效。<br/><textarea name="code" class="php" rows="15" cols="100">
export LD_LIBRARY_PATH=/home/xiangdong/test/c:$LD_LIBRARY_PATH
ldconfig
</textarea><br/>来自：https://www.cnblogs.com/wainiwann/p/4210343.html<br/><br/>彻底解决方式：（cat /etc/ld.so.conf.d/libiconv.conf <br/>/usr/local/libiconv/lib64 ldconfig -p&#124;grep iconf）<br/>1。确认库文件是否存在，比如-l123, 在/usr/lib, /usr/local/lib,或者其他自定义的lib下有无lib123.so, 如果只是存在lib123.so.1,<br/>那么可以通过ln -sv lib123.so.1&nbsp;&nbsp; lib123.so，建立一个连接重建lib123.so.<br/>2。检查/etc/ld.so.conf中的库文件路径是否正确，如果库文件不是使用系统路径，/usr/lib, /usr/local/lib, 那么必须在文件中加入。<br/>3。ldconfig 重建ld.so.cache文件，ld的库文件检索目录存放文件。尤其刚刚编译安装的软件，必须运行ldconfig，才能将新安装的<br/>库文件导入ld.so.cache.<br/>4。测试，gcc -l123 --verbose. <br/>5.写入系统的动态链接库目录(依然不行，最后还得这行才生效： ln -sf libhello.so.0 libhello.so )：<br/>cat /etc/ld.so.conf.d/hello.conf<br/>/home/xiangdong/test/c<br/>ldconfig<br/>ldconfig&nbsp;&nbsp;-p&#124;grep xiangdong<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libhello.so.0 (libc6,x86-64) =&gt; /home/xiangdong/test/c/libhello.so.0<br/><br/>ldconfig -p&#124;grep conf <br/>libfontconfig.so.1 (libc6,x86-64) =&gt; /usr/lib64/libfontconfig.so.1<br/>libfontconfig.so (libc6,x86-64) =&gt; /usr/lib64/libfontconfig.so<br/>依然出现找不到动态链接，看来是编辑步骤有问题，反查一下：<br/>gcc&nbsp;&nbsp;-o main main.o -lhello -L.<br/>/usr/bin/ld: cannot find -lhello<br/>collect2: ld returned 1 exit status<br/><br/>ln -sf libhello.so.0 libhello.so&nbsp;&nbsp;#就好了，来处：https://www.cnblogs.com/timeisbiggestboss/articles/7044947.html<br/>readelf -d main &#124; grep libhello<br/> 0x0000000000000001 (NEEDED)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Shared library: [libhello.so.0]<br/><br/> ./main <br/>./main: error while loading shared libraries: libhello.so.0: cannot open shared object file: No such file or directory<br/><br/>运行该程序，需要指定共享库的路径。 有两种办法，第一种使用环境变量“LD_LIBRARY_PATH”. 两外一种办法就是将共享库拷贝到系统目录（path 环境变量指定的其中一个目录）。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;暂停！ 我们还没有解决一个问题是，程序只知道soname,怎么从soname 找到共享库，即real name 文件呢？ 这需要我们定义一个link文件，连接到共享库本身。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ln -s libhello.so.0.0.0 libhello.so.0<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当然这个路径需要放到LD_LIBRARY_PATH环境变量中。<br/><br/><br/>核对前面的知识，也就是ldconfig会找soname进行链接，如下的libhello.so.0：<br/><textarea name="code" class="php" rows="15" cols="100">
# ldconfig&nbsp;&nbsp;-p&#124;grep xiangdong
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libhello.so.0 (libc6,x86-64) =&gt; /home/xiangdong/test/c/libhello.so.0
#&nbsp;&nbsp;readelf -d libhello.so.0.0.0 &#124; grep libhello
 0x000000000000000e (SONAME)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Library soname: [libhello.so.0]
</textarea><br/><br/>gcc -lmyhello --verbose<br/>Using built-in specs.<br/>Target: x86_64-redhat-linux<br/>Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --enable-plugin --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --with-cpu=generic --host=x86_64-redhat-linux<br/>Thread model: posix<br/>gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)<br/> /usr/libexec/gcc/x86_64-redhat-linux/4.1.2/collect2 --eh-frame-hdr -m elf_x86_64 --hash-style=gnu -dynamic-linker /lib64/ld-linux-x86-64.so.2 /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.1.2/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.1.2 -L/usr/lib/gcc/x86_64-redhat-linux/4.1.2 -L/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -lmyhello -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-redhat-linux/4.1.2/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crtn.o<br/>/usr/bin/ld: cannot find -lmyhello<br/>collect2: ld returned 1 exit status<br/><br/><br/>命令行标记告诉GCC产生的代码不要包含对函数和变量具体内存位置的引用，这是因为现在还无法知道使用该消息代码的应用程序会将它连接到哪一段内存地址空间。这样编译出的hello.o可以被用于建立共享链接库。建立共享链接库只需要用GCC的”-shared”标记即可。<br/> gcc -o hello main.c -L. -lmyhello<br/>gcc -shared -fPIC -o libmyhello.so hello.o<br/> gcc -o hello main.c -L. -lmyhello<br/><br/> <br/><br/>反之，去掉这个参数会出现打不到这个libmyhello.so。<br/><br/><br/><br/>===========================最终实践成功代码备查===================================<br/>动态链接的实现方法：<br/>root@yum_rpmbuild7_yz_bj_yz_10_73_234_251 libhello]# tree&nbsp;&nbsp;-L 1<br/>.<br/>├── hello<br/>├── hello.c<br/>├── hello.o<br/>├── libhello.c<br/>├── libhello.h<br/>├── libhello.o<br/>├── libhello.so -&gt; libhello.so.0<br/>├── libhello.so.0 -&gt; libhello.so.0.0.0<br/>├── libhello.so.0.0.0<br/>└── make.sh<br/><br/><br/>cat hello.c<br/>#include &lt;stdlib.h&gt;<br/>#include &lt;stdio.h&gt;<br/>#include &lt;unistd.h&gt;<br/>#include &lt;sys/types.h&gt;<br/>#include &lt;sys/wait.h&gt;<br/>#include &quot;libhello.h&quot;<br/><br/>int main() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;int i,j;<br/>&nbsp;&nbsp;&nbsp;&nbsp;pid_t pid;<br/>&nbsp;&nbsp;&nbsp;&nbsp;pid_t pid_c;<br/>&nbsp;&nbsp;&nbsp;&nbsp;int status;<br/>&nbsp;&nbsp;&nbsp;&nbsp;int *p[300];<br/>&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt;300;i++)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p[i]=(int *)malloc(262013*sizeof(int));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j=0;j&lt;262013;j++)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*(p[i]+j)=1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;hello();<br/>&nbsp;&nbsp;&nbsp;&nbsp;pid = fork();<br/>&nbsp;&nbsp;&nbsp;&nbsp;if(pid&nbsp;&nbsp;== 0) //返回子进程<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;child pid: %d&#92;n&quot;, getpid());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt;200;i++)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(j=0;j&lt;262013;j++)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*(p[i]+j)=7;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt;2;i++)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(j=0;j&lt;20;j++)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;p=%d&#92;n&quot;,*(p[i]+j));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=200;i&lt;202;i++)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(j=0;j&lt;20;j++)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;p=%d&#92;n&quot;,*(p[i]+j));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(30);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125; else &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;pid: %d&#92;n&quot;, pid);//父进程中返回子进程的pid<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;father pid: %d&#92;n&quot;, getpid());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pid_c=waitpid(pid,&amp;status,WNOHANG);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(pid_c==0)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;NO child process exit&#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(1);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;while(pid_c==0);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(WIFEXITED(status))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;child process %d will exit normally&#92;n&quot;,pid_c);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;return code is %d&#92;n&quot;,WEXITSTATUS(status));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;child process %d will exit normally&#92;n&quot;,pid_c);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br/>&#125;<br/><br/><br/>cat libhello.c<br/>#include &lt;stdlib.h&gt;<br/>#include &lt;unistd.h&gt;<br/>#include &lt;stdio.h&gt;<br/>void hello(void)<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;libhello begin&#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;int i,j;<br/>&nbsp;&nbsp;&nbsp;&nbsp;int *p[300];<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt;300;i++)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p[i]=(int *)malloc(42816*sizeof(int));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(j=0;j&lt;42816;j++)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*(p[i]+j)=1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Hello, library world.&#92;n&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;libhello end&#92;n&quot;);<br/>&#125;<br/><br/>cat libhello.h <br/>/* libhello.h - demonstrate library use. */&nbsp;&nbsp;<br/>void hello(void); <br/><br/><br/>cat make.sh <br/>gcc -g -Wall -fPIC -c libhello.c -o libhello.o<br/>gcc -shared -Wl,-soname,libhello.so.0 -o libhello.so.0.0.0 libhello.o<br/>gcc -g -Wall -c hello.c -o hello.o -I.<br/>ln -sf libhello.so.0 libhello.so&nbsp;&nbsp;#注意顺序，下面这行要用<br/>gcc&nbsp;&nbsp;-o hello hello.o -lhello -L. <br/>ln -sf libhello.so.0.0.0 libhello.so.0<br/>cp -rf libhello.so* /usr/local/hello/lib/.<br/>ldconfig<br/>ldconfig -p&#124;grep hello<br/><br/><br/>cat /etc/ld.so.conf.d/hello.conf<br/>/usr/local/hello/lib<br/><br/> cat makeclean.sh <br/>rm -rf *.o<br/>rm -rf *.so.*<br/><br/>rm -rf libhello.so<br/>rm -rf hello<br/><br/>查看rss,vsz:<br/>watch -n 1 ps -o&quot;ppid,pid,rss,vsz,comm&quot; -C fork<br/><br/>用Top查看共享内存RES就是RSS,SHR就是共享内存：<br/>top<br/><br/>&nbsp;&nbsp;PID USER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PR&nbsp;&nbsp;NI&nbsp;&nbsp;&nbsp;&nbsp;VIRT&nbsp;&nbsp;&nbsp;&nbsp;RES&nbsp;&nbsp;&nbsp;&nbsp;SHR S&nbsp;&nbsp;%CPU %MEM&nbsp;&nbsp;&nbsp;&nbsp; TIME+ COMMAND&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>34920 root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;20&nbsp;&nbsp; 0&nbsp;&nbsp;365916 358072&nbsp;&nbsp;&nbsp;&nbsp;376 S&nbsp;&nbsp; 0.0&nbsp;&nbsp;9.2&nbsp;&nbsp; 0:00.48 hello&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>34922 root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;20&nbsp;&nbsp; 0&nbsp;&nbsp;365916 357812&nbsp;&nbsp;&nbsp;&nbsp;116 S&nbsp;&nbsp; 0.0&nbsp;&nbsp;9.2&nbsp;&nbsp; 0:00.30 hello&nbsp;&nbsp;<br/><br/><br/>cat /proc/35753/maps<br/>7fbfa3483000-7fbfa3484000 rw-p 00001000 fd:01 1855296&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/usr/local/hello/lib/libhello.so.0.0.0<br/><br/>分析/proc/[pid]/maps中的各个内存区域的大小：<br/>cat maps &#124; sed -e &quot;s/&#92;([0-9a-f]&#92;&#123;8&#92;&#125;&#92;)-&#92;([0-9a-f]&#92;&#123;8&#92;&#125;&#92;)/0x&#92;1 0x&#92;2/&quot; &#124; awk &#039;&#123;printf(&quot;&#92;033[0;33m[%8d Page]&#92;033[0m &#92;033[0;35m[%8d KB]&#92;033[0m %s&#92;n&quot;, (strtonum($2) - strtonum($1))/4096, (strtonum($2) - strtonum($1))/1024, $0)&#125;&#039;<br/><textarea name="code" class="php" rows="15" cols="100">
cat /proc/36499/maps &#124; sed -e &quot;s/&#92;([0-9a-f]&#92;&#123;8&#92;&#125;&#92;)-&#92;([0-9a-f]&#92;&#123;8&#92;&#125;&#92;)/0x&#92;1 0x&#92;2/&quot; &#124; awk &#039;&#123;printf(&quot;&#92;033[0;33m[%8d Page]&#92;033[0m &#92;033[0;35m[%8d KB]&#92;033[0m %s&#92;n&quot;, (strtonum($2) - strtonum($1))/4096, (strtonum($2) - strtonum($1))/1024, $0)&#125;&#039;&nbsp;&nbsp;&nbsp;&nbsp; 
[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 Page] [&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 KB] 0x00400000 0x00401000 r-xp 00000000 fd:01 1855288&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/usr/local/src/dll/libhello/hello
[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 Page] [&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 KB] 0x00600000 0x00601000 r--p 00000000 fd:01 1855288&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/usr/local/src/dll/libhello/hello
[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 Page] [&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 KB] 0x00601000 0x00602000 rw-p 00001000 fd:01 1855288&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/usr/local/src/dll/libhello/hello
[34276959928 Page] [137107839715 KB] 7fb00xf8b53000 0x7fb10e6b9000 rw-p 00000000 00:00 0 
[34276960379 Page] [137107841519 KB] 7fb10x0e6b9000 0x7fb10e87c000 r-xp 00000000 fd:01 1836244&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/usr/lib64/libc-2.17.so
[34276960890 Page] [137107843563 KB] 7fb10x0e87c000 0x7fb10ea7b000 ---p 001c3000 fd:01 1836244&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/usr/lib64/libc-2.17.so
[34276960894 Page] [137107843579 KB] 7fb10x0ea7b000 0x7fb10ea7f000 r--p 001c2000 fd:01 1836244&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/usr/lib64/libc-2.17.so
[34276960896 Page] [137107843587 KB] 7fb10x0ea7f000 0x7fb10ea81000 rw-p 001c6000 fd:01 1836244&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/usr/lib64/libc-2.17.so
[34276960901 Page] [137107843607 KB] 7fb10x0ea81000 0x7fb10ea86000 rw-p 00000000 00:00 0 
[34276960902 Page] [137107843611 KB] 7fb10x0ea86000 0x7fb10ea87000 r-xp 00000000 fd:01 1855296&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/usr/local/hello/lib/libhello.so.0.0.0
[34276961413 Page] [137107845655 KB] 7fb10x0ea87000 0x7fb10ec86000 ---p 00001000 fd:01 1855296&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/usr/local/hello/lib/libhello.so.0.0.0
[34276961414 Page] [137107845659 KB] 7fb10x0ec86000 0x7fb10ec87000 r--p 00000000 fd:01 1855296&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/usr/local/hello/lib/libhello.so.0.0.0
[34276961415 Page] [137107845663 KB] 7fb10x0ec87000 0x7fb10ec88000 rw-p 00001000 fd:01 1855296&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/usr/local/hello/lib/libhello.so.0.0.0
[34276961449 Page] [137107845799 KB] 7fb10x0ec88000 0x7fb10ecaa000 r-xp 00000000 fd:01 1843207&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/usr/lib64/ld-2.17.so
[34276961949 Page] [137107847799 KB] 7fb10x0ecc9000 0x7fb10ee9e000 rw-p 00000000 00:00 0 
[34276961960 Page] [137107847843 KB] 7fb10x0eea7000 0x7fb10eea9000 rw-p 00000000 00:00 0 
[34276961961 Page] [137107847847 KB] 7fb10x0eea9000 0x7fb10eeaa000 r--p 00021000 fd:01 1843207&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/usr/lib64/ld-2.17.so
[34276961962 Page] [137107847851 KB] 7fb10x0eeaa000 0x7fb10eeab000 rw-p 00022000 fd:01 1843207&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/usr/lib64/ld-2.17.so
[34276961963 Page] [137107847855 KB] 7fb10x0eeab000 0x7fb10eeac000 rw-p 00000000 00:00 0 
[34356101953 Page] [137424407815 KB] 7ffc0x88221000 0x7ffc88342000 rw-p 00000000 00:00 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[stack]
[34356102006 Page] [137424408027 KB] 7ffc0x88375000 0x7ffc88377000 r-xp 00000000 00:00 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[vdso]
[4503599627367937 Page] [18014398509471748 KB] ffffffff0xff600000 0xffffffffff601000 r-xp 00000000 00:00 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[vsyscall]
</textarea><br/>PHP的一个页情况：<br/><textarea name="code" class="php" rows="15" cols="100">
cat /proc/59379/maps &#124; sed -e &quot;s/&#92;([0-9a-f]&#92;&#123;8&#92;&#125;&#92;)-&#92;([0-9a-f]&#92;&#123;8&#92;&#125;&#92;)/0x&#92;1 0x&#92;2/&quot; &#124; awk &#039;&#123;printf(&quot;&#92;033[0;33m[%8d Page]&#92;033[0m &#92;033[0;35m[%8d KB]&#92;033[0m %s&#92;n&quot;, (strtonum($2) - strtonum($1))/4096, (strtonum($2) - strtonum($1))/1024, $0)&#125;&#039;
[&nbsp;&nbsp;&nbsp;&nbsp;2026 Page] [&nbsp;&nbsp;&nbsp;&nbsp;8104 KB] 0x00400000 0x00bea000 r-xp 00000000 08:03 787778&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /usr/local/php/sbin/php-fpm
[&nbsp;&nbsp;&nbsp;&nbsp; 193 Page] [&nbsp;&nbsp;&nbsp;&nbsp; 772 KB] 0x00de9000 0x00eaa000 rw-p 007e9000 08:03 787778&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /usr/local/php/sbin/php-fpm
[&nbsp;&nbsp;&nbsp;&nbsp; 518 Page] [&nbsp;&nbsp;&nbsp;&nbsp;2072 KB] 0x00eaa000 0x010b0000 rw-p 00000000 00:00 0 
[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;66 Page] [&nbsp;&nbsp;&nbsp;&nbsp; 264 KB] 0x010b0000 0x010f2000 rw-p 00000000 00:00 0 
[34242655169 Page] [136970620679 KB] 7f900x573b6000 0x7f90573c2000 r-xp 00000000 08:02 653188&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /lib64/libnss_files-2.12.so
[34242770473 Page] [136971081895 KB] 7f900x735c4000 0x7f907362a000 r-xp 00000000 08:03 671978&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /usr/local/php/ext/redis.so
[34242770985 Page] [136971083943 KB] 7f900x7362a000 0x7f907382a000 ---p 00066000 08:03 671978&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /usr/local/php/ext/redis.so
[34242771524 Page] [136971086099 KB] 7f900x73a44000 0x7f9073a45000 rw-p 00015000 08:02 652808&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /lib64/libgcc_s-4.4.7-20120601.so.1
[34242771756 Page] [136971087027 KB] 7f900x73a45000 0x7f9073b2d000 r-xp 00000000 08:03 914203&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /usr/lib64/libstdc++.so.6.0.13
[34242773375 Page] [136971093503 KB] 7f900x7417f000 0x7f9074180000 rw-p 00030000 08:03 787148&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /usr/local/libmemcached/lib/libmemcached.so.11.0.0
[34242773908 Page] [136971095635 KB] 7f900x74196000 0x7f9074395000 ---p 00016000 08:03 671976&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /usr/local/php/ext/memcached.so
[34242774518 Page] [136971098075 KB] 7f900x745f0000 0x7f90745f7000 rw-p 00058000 08:03 671973&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /usr/local/php/ext/opcache.so

</textarea><br/><br/>来自：https://www.cnblogs.com/long123king/p/3770156.html　　<br/><br/><br/>lsof -nPp 35781<br/>COMMAND&nbsp;&nbsp; PID USER&nbsp;&nbsp; FD&nbsp;&nbsp; TYPE DEVICE SIZE/OFF&nbsp;&nbsp;&nbsp;&nbsp;NODE NAME<br/>hello&nbsp;&nbsp; 35781 root&nbsp;&nbsp;cwd&nbsp;&nbsp;&nbsp;&nbsp;DIR&nbsp;&nbsp;253,1&nbsp;&nbsp;&nbsp;&nbsp; 4096 1855279 /usr/local/src/dll/libhello<br/>hello&nbsp;&nbsp; 35781 root&nbsp;&nbsp;rtd&nbsp;&nbsp;&nbsp;&nbsp;DIR&nbsp;&nbsp;253,1&nbsp;&nbsp;&nbsp;&nbsp; 4096&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 /<br/>hello&nbsp;&nbsp; 35781 root&nbsp;&nbsp;txt&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;253,1&nbsp;&nbsp;&nbsp;&nbsp;10408 1855288 /usr/local/src/dll/libhello/hello<br/>hello&nbsp;&nbsp; 35781 root&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;253,1&nbsp;&nbsp;2173512 1836244 /usr/lib64/libc-2.17.so<br/>hello&nbsp;&nbsp; 35781 root&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;253,1&nbsp;&nbsp;&nbsp;&nbsp; 9240 1855296 /usr/local/hello/lib/libhello.so.0.0.0<br/>hello&nbsp;&nbsp; 35781 root&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;253,1&nbsp;&nbsp; 164240 1843207 /usr/lib64/ld-2.17.so<br/><br/>RES：resident memory usage 常驻内存<br/>1、进程当前使用的内存大小，但不包括swap out<br/>2、包含其他进程的共享<br/>3、如果申请100m的内存，实际使用10m，它只增长10m，与VIRT相反<br/>4、关于库占用内存的情况，它只统计加载的库文件所占内存大小<br/><br/>SHR：shared memory 共享内存<br/>1、除了自身进程的共享内存，也包括其他进程的共享内存<br/>2、虽然进程只使用了几个共享库的函数，但它包含了整个共享库的大小<br/>3、计算某个进程所占的物理内存大小公式：RES – SHR<br/>4、swap out后，它将会降下来<br/><br/><br/>使用cat /proc/进程ID/maps 查看其进程映射：PHP-FPM<br/>cat /proc/59379/maps<br/>f90571b0000-7f90571b5000 r-xp 00000000 08:02 652827&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /lib64/libnss_dns-2.12.so<br/>7f90573b5000-7f90573b6000 rw-p 00005000 08:02 652827&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /lib64/libnss_dns-2.12.so<br/>7f90575c3000-7f90575c4000 rw-p 0000d000 08:02 653188&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /lib64/libnss_files-2.12.so<br/>7f907382a000-7f907382f000 rw-p 00066000 08:03 671978&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /usr/local/php/ext/redis.so<br/>7f9073a44000-7f9073a45000 rw-p 00015000 08:02 652808&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /lib64/libgcc_s-4.4.7-20120601.so.1<br/>7f9073d34000-7f9073d36000 rw-p 000ef000 08:03 914203&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /usr/lib64/libstdc++.so.6.0.13<br/>7f907417f000-7f9074180000 rw-p 00030000 08:03 787148&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /usr/local/libmemcached/lib/libmemcached.so.11.0.0<br/>7f9074395000-7f9074398000 rw-p 00015000 08:03 671976&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /usr/local/php/ext/memcached.so<br/>7f90745f0000-7f90745f7000 rw-p 00058000 08:03 671973&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /usr/local/php/ext/opcache.so<br/>556217d91000-556217dcd000 ：虚拟地址空间的起始地址和结束地址<br/><br/>r-xp ：此段地址空间的属性，r表示可读，x表示可执行,p表示私有段(s表示共享段)<br/>00000000 ：针对有名映射，指本段映射地址在文件中的偏移；对匿名映射，为vm_area_struct-&gt;vm_start<br/>fd:00 ：所映射的文件所属设备的设备号，其中fd为主设备号，00为次设备号<br/>559540  ：文件的索引节点号<br/>/usr/sbin/chronyd ：所映射的文件名。有有名映射而言，是映射的文件名。对匿名映射来说，是此段内存在进程中的作用<br/><br/>原文链接：https://blog.csdn.net/ma2595162349/article/details/88540326<br/><br/><br/>lsof -nPp 59379&nbsp;&nbsp; #https://jackxiang.com/post/9701/<br/>COMMAND&nbsp;&nbsp; PID USER&nbsp;&nbsp; FD&nbsp;&nbsp; TYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DEVICE SIZE/OFF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NODE NAME<br/>php-fpm 59379&nbsp;&nbsp;www&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8,3&nbsp;&nbsp;1322021&nbsp;&nbsp;&nbsp;&nbsp; 787148 /usr/local/libmemcached/lib/libmemcached.so.11.0.0<br/>php-fpm 59379&nbsp;&nbsp;www&nbsp;&nbsp;mem&nbsp;&nbsp;&nbsp;&nbsp;REG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8,3&nbsp;&nbsp;1563318&nbsp;&nbsp;&nbsp;&nbsp; 671978 /usr/local/php/ext/redis.so<br/><br/><br/><br/>pid的值为什么在父子进程中不同。“其实就相当于链表，进程形成了链表，父进程的pid(p 意味point)指向子进程的进程id, 因为子进程没有子进程，所以其fpid为0.<br/>
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论]  [实践OK]入门教学之Linux如何解决动态库的版本控制, Linux如何解决动态库的版本控制，C语言HelloWorld示例，readelf -d libhello.so.0.0.0 grep SONAME,以及动态链接的进程映射之/proc/pid/maps。 分析/proc/[pid]/maps中的各个内存区域的大小。]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>