`
jubincn
  • 浏览: 242716 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
文章分类
社区版块
存档分类
最新评论

函数链接库的5个特殊秘密

 
阅读更多

转自:《C专家编程》


1. 动态链接库的扩展名是“.so”,而静态链接库的扩展名是“.a”


2. 例如,你通过-lthread选项,告诉编译链接到libthread.so

换句话说,lib前缀和.so后缀都被省略了


3. 编译器期望在确定的目录找到库

一帮在环境变量LD_LIBRARY_PATH和LD_RUN_PATH中设置,也可以使用-Lpathname这个编译器选项来指定。出于安全性、性能和创建、运行独立性方面的考虑,使用环境变量的做法现在已经不提倡。一般还是在链接时使用-Lpathname和-Rpathname来指定。


4. 观查头文件,确认所使用的函数库。

怎样在函数库中观察一个符号:

如果在链接过程中遇到下面这个错误:

ld: undefined symbol

_xdr_reference

*** Error code 2

make: Fatal error: Command failed for target 'prog'

它提示找不到符号xdr_reference的定义。这里有一种方法,可以通过它找到需要链接的库。基本的想法是使用nm命令在/usr/lib的每个函数库中浏览所有的符号,从中寻找所丢失的符号。在缺省情况下,链接器会在/usr/lib和/usr/ccs/lib中查找,你也应该从这两个地方着手。

% cd /usr/lib

% foreach i (lib?*)

? echo $i

? nm $i | grep xdr_reference | grep -v UNDEF

? end


这会在/usr/lib目录中的所有函数库上运行"nm"程序,它显示函数库中已知的符号列表。通过grep设定需要搜索的符号,并过滤掉标记为“UNDEF”的符号(在该函数库中有引用,但不是在此处定义)。


5. 与提取动态库中的符号相比,静态库中的符号提取方法限制更严。

在动态链接和镜头链接的语义上有一个巨大差别,archive(静态库)与共享对象(动态库)的动作不同。在动态链接中,所有的库符号进入输出文件的虚拟地址空间中,所有的符号对于链接在一起的所有文件都是可见的。相反,对于静态链接,在处理archive时,它只是在archive中查找载入器当时所知道的未定义符号。因此,使用静态链接的过程中,引入静态链接库的顺序是很重要的。如果相同的符号在两个不同的静态链接库中都有定义,那么静态库出现的顺序不同,编译的结果就可能不同。

如果在自己的代码之前引入静态库,又会带来一个问题。因为此时尚未出现未定义的符号,所以它不会从库中提取任何符号。接着,当用户程序生成的目标文件被链接时,它的所有对函数库的引用都将是未实现的!因此,在进行编译时,始终将-l函数库选项放在编译命令选项的最右边。

分享到:
评论

相关推荐

    Win XP中的28个秘密武器

    - **功能**:用于执行动态链接库(DLL)文件中的函数。 - **使用方法**:运行`rundll32.exe`加上相应的参数来调用指定DLL中的函数。 以上只是Windows XP系统中众多隐藏功能的一部分。通过对这些工具的了解和掌握,...

    隐藏在Windows的28个秘密武器

    ### 隐藏在Windows XP中的28个秘密武器 随着科技的发展与计算机的普及,Windows XP作为一款经典的桌面操作系统,在其内部隐藏着许多鲜为人知的功能与工具,这些功能不仅实用,而且对于提升用户的工作效率有着重要...

    隐藏在Windows XP中的28个秘密武器.txt

    Rundll32.exe是一个动态链接库执行器,用于执行DLL文件中的函数。通过特定的命令行参数,它可以启动DLL中的特定功能或界面,是Windows XP中不可或缺的一部分。 以上列举的28个隐藏功能只是冰山一角,实际上Windows ...

    隐藏在XP中的28个秘密武器

    Rundll32.exe 是一个动态链接库加载器,可以调用DLL文件中的函数。它广泛应用于启动系统服务、执行特定任务等方面,是Windows系统中不可或缺的组件之一。 以上列出的是Windows XP系统中一些鲜为人知但非常实用的...

    API_Native.pdf

    ntdll.dll是Windows NT、2000和XP等操作系统中的一个关键动态链接库(Dynamic Link Library)。这个库负责处理操作系统的核心服务,如线程管理、进程控制、内存分配以及安全功能等。尽管它是如此重要,但微软在其...

    隐藏、更改窗口图标;更改窗口透明度

    在压缩包文件中,`key.dll`可能是包含上述功能实现的动态链接库文件,而`eyes.exe`可能是主程序执行文件,它加载并调用了`key.dll`中的功能,实现了窗口图标和透明度的修改。 总的来说,这个程序提供了用户界面的...

    鼠标键盘钩子例子 后门F2键

    文件"Hook.dll"很可能包含了实现钩子功能的动态链接库(Dynamic Link Library)代码,这些代码可能包含安装和卸载钩子的函数,以及处理捕获到的键盘和鼠标事件的逻辑。而"guiyi.exe"可能是主程序,负责加载Hook.dll...

    迅雷、快车、旋风URL加/解密工具 v1.0.rar

    《迅雷、快车、旋风URL加/解密工具 v1.0——揭秘网络下载链接的秘密》 在互联网世界中,我们常常会遇到各种各样的下载方式,其中迅雷、快车、旋风等下载工具因其高速稳定的特点深受用户喜爱。然而,这些工具所使用...

    前端项目-cheet.js.zip

    Cheat.js是一个轻量级的JavaScript库,它的主要功能是让开发者能够快速地实现各种类型的隐藏功能或彩蛋,比如著名的Konami代码。Konami代码,源自于1986年日本游戏公司Konami的一款游戏,输入特定的按键序列(↑↑↓...

    mod_perl

    **第一个秘密:为什么脚本运行的计数器超过5?** - 脚本运行计数器可能超过5是因为Apache服务器在处理请求时可能会创建多个子进程。每个子进程都可能运行同一个Perl脚本,导致脚本的执行次数看起来超过了预期。 ...

    地震正演程序cpml

    6. **依赖库**:程序可能依赖于一些外部库,如线性代数库(如LAPACK、BLAS)、并行计算库(如OpenMP、MPI)等,这些库的说明或链接可能也在压缩包中。 利用这个地震正演程序cpml,研究者可以对地质模型进行地震波...

Global site tag (gtag.js) - Google Analytics