时令

导航

 

 

linux下使用gcc -fPIC作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code).

如果不加-fPIC,则加载.so文件的代码段时,代码段引用的数据对象需要重定位, 重定位会修改代码段的内容,这就造成每个使用这个.so文件代码段的进程在内核里都会生成这个.so文件代码段的copy。每个copy都不一样,取决于这个.so文件代码段和数据段内存映射的位置。不加fPIC编译出来的so,是要再加载时根据加载到的位置再次重定位的.(因为它里面的代码并不是位置无关代码) 如果被多个应用程序共同使用,那么它们必须每个程序维护一份so的代码副本了.(因为so被每个程序加载的位置都不同,显然这些重定位后的代码也不同,当然不能共享)

我们总是用fPIC来生成so,也从来不用fPIC来生成a。

fPIC与动态链接可以说基本没有关系,libc.so一样可以不用fPIC编译,只是这样的so必须要在加载到用户程序的地址空间时重定向所有表目. 因此,不用fPIC编译so并不总是不好。

如果你满足以下4个需求/条件时,可以不使用-fPIC选项。

1.该库可能需要经常更新

2.该库需要非常高的效率(尤其是有很多全局量的使用时)

3.该库并不很大.

4.该库基本不需要被多个应用程序共享

------------------------------------------------------------------------------------

链接有两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。

建立硬链接时,链接文件和被链接文件必须位于同一个文件系统中,并且不能建立指向目录的硬链接。而对符号链接,则不存在这个问题。默认情况下,ln产生硬链接。

ln -s /tmp/toc toc 这会在当前的目录中创建符号链接 toc。toc 文件指向 /tmp/toc 文件

将某个文件链接到一个文件上:

ln [ -f | -n] [ -s ] SourceFile [ TargetFile ]

将一个或多个文件链接到一个目录上: ln [ -f | -n] [ -s ] SourceFile ... TargetDirectory

ln 命令将在 SourceFile 参数中指定的文件链接到在 TargetFile 参数中指定的文件,或将其链接到在 TargetDirectory 参数中指定的另一个目录中的文件。

在缺省情况下,ln 命令会创建硬链接。如果需要使用 ln 命令来创建符号链接,请指明 -s 标志。

----------------------------------------------------------------------------------------------------------------

判定规则如下: – 如果库目录中存在两种版本,gcc优先使用动态链接库;

– 如果目录只有静态版本,则采用静态链接库;

– 带有-static 参数时,gcc 将使用静态链接库,例如:gcc foo.c -static -lpthread -o foo

[1] http://www.cnblogs.com/leo0000/p/5691483.html

原文:https://www.douban.com/note/592651532/

posted on 2017-12-15 14:12  时令  阅读(591)  评论(0编辑  收藏  举报