目录
链接阶段1.重定位2.解析引用3.链接示例程序构建过程的第二个阶段就是链接,链接过程输入的是目标文件的集合。每个目标文件可以被看作单个源代码文件的二进制存储版本,需要为程序内存映射提供各种各样的节(代码.text 初始化数据.data 未初始化数据.bss 和只读数据.rdata),链接器的最终任务是将独立的节组合成最终的程序内存映射节,与此同时解析所有的引用。
链接阶段
链接过程包括一系列阶段(重定位、解析引用),接下来我们介绍这些阶段。
1.重定位
链接过程的第一个阶段仅仅进行拼接,其过程是将分散在单独目标文件中不同类型的节拼接到程序内存映射节中。
(资料图片)
如图,为了完成任务,需要将之前预留的空间,也就是节中从0开始的地址范围转换成最终程序内存映射中更具体的地址范围。
2.解析引用
现在我们来看链接过程中最难的部分,将节的地址范围线性地转换成程序内存映射地址范围。相比来说,更艰巨的任务在于为不同的部分的代码建立关联,使得程序成为一个整体。
function.h代码:
#pragma once #define FIRST_OPTION #ifdef FIRST_OPTION #define MULTIPLIER (3.0) #else #define MULTIPLIER (2.0)#endif float add_and_multiply(float x,float y);
function.c
//#include "function.h" int nCompletionStatus = 0; float add(float x,float y) { float z = x + y; return z; } float add_and_multiply(float x,float y) { float z = add(x,y); z *= 3; return z; }
main.c
#include "function.h" extern int nCompletionStatus; int main(int argc,char* argv[]) { float x = 1.0; float y = 5.0; float z; z= add_and_multiply(x,y); nCompletionStatus =1; return 0; }
在上例代码中
add_and_multiply 函数调用add函数,这两个函数在同一个源代码文件中,这种情况下,函数add的内存映射地址是一个已知量,会被扩展成其对与function.o中代码节起始地址的相对偏移。main函数会调用add_and_multiply函数,并同时引用外部变量nCompletionStatus,这个时候问题就出现了--我们不知道它们的实际程序内存地址,实际上编译器会假定这些符号未来会在进程内存映射中存在,但是,直到生成完整内存映射之前,这两个引用会一直被当成未解析引用。该问题如图描述:
function.o
main.o
为了解决这类问题,我们需要在链接阶段就对这些引用进行解析,此时链接器需要:
检查拼接到程序内存映射中的节找出那些部分代码产生了外部调用计算该引用的精确地址(在内存映射中的地址)最后,将机器指令中的伪地址替换成程序内存映射的实际地址,这样就完成了引用的解析。3.链接示例
程序内存映射图
gcc -c function.c main.c
gcc function.o main.o -o demoApp
反汇编main.o文件
objdump -D -M intel main.o
划红线的是跳转自身,是因为链接器不知道函数的地址。先用伪地址代替。
反汇编demoApp
objdump -D -M intel demoApp
画红线的位置分别是add_and_multiply 地址为11aa 和nCompletionStatus的地址。
执行下面命令查看,看到nCompletionStatus地址为4014.
objdump -x -j .bss demoapp
到此这篇关于C/C++程序链接与反汇编工具objdump的使用介绍的文章就介绍到这了,更多相关C++程序链接内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
关键词:
X 关闭
X 关闭
- 15G资费不大降!三大运营商谁提供的5G网速最快?中国信通院给出答案
- 2联想拯救者Y70发布最新预告:售价2970元起 迄今最便宜的骁龙8+旗舰
- 3亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 4现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 5如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 6AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 7转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 8充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 9好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 10名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?