易截截图软件、单文件、免安装、纯绿色、仅160KB

程序的链接和装入及Linux下动态链接的实现 收藏

  级别: 初级 王勇 (yongwang@buaa.edu.cn), 北京航空航天大学计算机学院系统软件实验室 2003 年 8 月 10 日 程序的链接和装入存在着多种方法,而如今最为流行的当属动态链接、动态装入方法。本文首先回顾了链接器和装入器的基本工作原理及这一技术的发展历史,然后通过实际的例子剖析了Linux系统下动态链接的实现。了解底层关键技术的实现细节对系统分析和设计人员无疑是必须的,尤其当我们在面对实时系统,需要对程序执行时的时空效率有着精确的度量和把握时,这种知识更显重要。 链接器和装入器的基本工作原理 一个程序要想在内存中运行,除了编译之外还要经过链接和装入这两个步骤。从程序员的角度来看,引入这两个步骤带来的好处就是可以直接在程序中使用printf和errno这种有意义的函数名和变量名,而不用明确指明printf和errno在标准C库中的地址。当然,为了将程序员从早期直接使用地址编程的梦魇中解救出来,编译器和汇编器在这当中做出了革命性的贡献。编译器和汇编器的出现使得程序员可以在程序中使用更具意义的符号来为函数和变量命名,这样使得程序在正确性和可读性等方面都得到了极大的提高。但是随着C语言这种支持分别编译的程序设计语言的流行,一个完整的程序往往被分割为若干个独立的部分并行开发,而各个模块间通过函数接口或全局变量进行通讯。这就带来了一个问题,编译器只能在一个模块内部完成符号名到地址的转换工作,不同模块间的符号解析由谁来做呢?比如前面所举的例子,调用printf的用户程序和实现了printf的标准C库显然就是两个不同的模块。实际上,这个工作是由链接器来完成的。 为了解决不同模块间的链接问题,链接器主要有两个工作要做――符号解析和重定位: 符号解析:当一个模块使用了在该模块中没有定义过的函数或全局变量时,编译器生成的符号表会标记出所有这样的函数或全局变量,而链接器的责任就是要到别的模块中去查找它们的定义,如果没有找到合适的定义或者找到的合适的定义不唯一,符号解析都无法正常完成。 重定位:编译器在编译生成目标文件时,通常都使用从零开始的相对地址。然而,在链接过程中,链接器将从一个指定的地址开始,根据输入的目标文件的顺序以段为单位将它们一个接一个的拼装起来。除了目标文件的拼装之外,在重定位的过程中还完成了两个任务:一是生成最终的符号表;二是对代码段中的某些位置进行修改,所有需要修改的位置都由编译器生成的重定位表指出。 举个简单的


相关文档:

实战Linux Bluetooth编程 (七) SDP协议

Service Discovery Protocol(SDP)提供一种能力,让应用程序有方法发现哪种服务可用以及这种服务的特性。
服务发现协议(SDP或Bluetooth SDP)在蓝牙协议栈中对蓝牙环境中的应用程序有特殊的含意,发现哪个服务是可用的和确定这些可用服务的特征。SDP定义了bluetooth client发现可用bluetooth server服务和它们的特征的方法。 ......

linux装JDK和eclipse问题解决

 我用的UBUNTU9.04 。
装JDK时出现了Deleting temporary files...
屏幕持续十几分钟都还是Deleting temporary files...看来是装不了了。重新开始装一次
sudo chmod a+x ./jre-6u16-linux-i586.bin
sudo ./jre-6u16-linux-i586.bin
然后在终端配置环境变量:
export JAVA_HOME=/usr/java/jdk1.6.0_16
 &n ......

Linux学习笔记

第四讲 目录 (video07,08,09,10) 强制位与冒险位:针对u,g,o分别有set uid,set gid,及sticky。
set uid: chmod u+s DirName 
set gid: chmod g+s DirName 
sticky:   chmod o+t DirName
例如:ls –l /bin/ping 使用了set uid,保证任何用户执行ping命令时都是以root用户身份. ......

linux下gdb单步调试

 
用 GDB 调试程序
GDB 概述
————
GDB 是 GNU 开源组织发布的一个强大的 UNIX 下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像 VC 、 BCB 等 IDE 的调试,但如果你是在 UNIX 平台下做软件,你会发现 GDB 这个调试工具有比 VC 、 BCB 的图形化调试器更强大的功能。所谓 “ ......

Linux 下关掉某个端口

 在配置Apache James Mail Server 的时候,Linux 默认占用了25号端口,需要把它关掉才能运行James Mail Server。
nmap localhost : 查看占用的端口。
由于服务是由守护进程维护,所以 找到该服务的PID,然后kill掉就OK了。
netstat -anep | grep 25
tcp        0  & ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号