gcc连接非缺省目录的情况

1310阅读 0评论2013-03-10 nanye1984
分类:C/C++

一下内容抄自ld手册:

`-R FILENAME' `--just-symbols=FILENAME'
从FILENAME中读取符号名跟它们的值,但不重位这个文件,或者根本不把它包含在输出文件中.
这就允许你的输出文件引用其它程序中定义的绝对内存地址.你可以多次使用这个选项.
为了跟其他ELF连接器兼容,如果'-R'选项后面跟有一个目录名,而不是一个文件名,它会被处理成'-rpath'选项.

`-rpath DIR'
指定一个运行期库搜索路径.'-rpath'的所有参数会被连接起来传递给运行时连接器(/lib/ld-linux.so.2),运行时连接器在运行时用它们定位共享对象.
如果在连接不使用'-rpath',那么就使用环境变量'LD_RUN_PATH'.
'-rptah'也可以使用在SunOS上.在SunOS上连接器默认的会从所有的'-L'选项中形成一个运行时搜索路径.
如果使用了'-rpath'选项,那运行时搜索路径就只从'-rpath'选项中得到,忽略'-L'选项.这在使用GCC时非常有用,它会用上很多的'-L'选项,而这些路径很可能就是NFS挂上去的文件系统中.
为了同ELF的连接器兼容,如果'-R'选面后面跟有一个目录名,而不是一个文件名,那它也会被处理成'-rpath'选项.

`-rpath-link DIR'
当在SunOS上使用ELF时,一个共享库可能会用到另一个共享库.
当'ld -share'把一个共享库作为一个输入文件连接时就有可能发生这种情况.
当一个连接器在作非共享,不可重定位连接时,如果遇上这种依赖情况,它会自动定位需要的共享库,然后把它包含在连接中,如果在这种情况中,它没有被显式包含,那'-rpath-link'选项指定优先搜索的一组路径名.
这个选项必须小心使用,因为它会覆盖那些可能已经被编译进共享库中的搜索路径.在这种情况下,它就有可能使用一个非内部的不同的搜索路径.

连接器使用下面的搜索路径来定位需要的共享库:
1).所有由'-rpath-link'选项指定的搜索路径.
2).所有由'-rpath'指定的搜索路径.
'-rpath'跟'-rpath_link'的不同,由'-rpath'指定的路径被包含在可执行文件中,并在运行时使用,而
'-rpath-link'选项仅仅在连接时起作用.它只用于本地连接器.
3).在一个ELF系统中,如果'-rpath'和'rpath-link'选项没有被使用,会搜索环境变量'LD_RUN_PATH'的
内容.它也只对本地连接器起作用.
4).在SunOS上,'-rpath'选项不使用,只搜索所有由'-L'指定的目录.
5).对于一个本地连接器,环境变量'LD_LIBRARY_PATH'的内容被搜索.
6).对于一个本地ELF连接器,共享库中的`DT_RUNPATH'和`DT_RPATH'操作符会被需要它的共享库搜索.
如果'DT_RUNPATH'存在了,那'DT_RPATH'就会被忽略.
7).缺省目录,常规的,如'/lib'和'/usr/lib'.
8).对于ELF系统上的本地连接器,如果文件'/etc/ld.so.conf'存在,这个文件中有的目录会被搜索.如果需
要的共享库没有被找到,那连接器会发出一条警告信息,并继续执行连接.
上一篇:高并发高流量网站架构设计(参考)--转
下一篇:再论逻辑地址,线性地址和物理地址