码迷,mamicode.com
首页 > 其他好文 > 详细

揭开链接器的面纱(中)

时间:2018-10-21 21:46:20      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:使用   生成   代码段   bubuko   png   9.png   src   play   表示   

 

思考:

链接器根据什么原则完成具体的链接工作?

入口函数是可配置的?那么其他的原则是不是也可以配置呢?

假设是可以配置的,那么必然的存在一个配置文件,在这个文件中可以配置各种各样的原则。这个配置文件就是链接脚本。

 

技术分享图片

链接脚本里面就写了链接原则(如何链接各个段,如何重定位)。

技术分享图片

 

 

技术分享图片

 

上图指定了代码段的起始地址为0x20000000。这就是重定位。

“.”代表当前位置指针。

S=. 表示重定位S这个标识符,让S这个标识符位于当前位置指针指代的地址处。(这就是C语言中变量的本质,一段内存的别名,这里S就是一段内存的别名,将这段内存重定位到了0x80000000的地方)

将.data代码段重定位到0x30000000。

.bss段没有指明地址,链接器会默认给定一个合法的地址(和平台和链接器有关)。

 

技术分享图片

 

实验:

程序如下:

技术分享图片

 

链接脚本如下:

技术分享图片

 

 编译运行:

技术分享图片

程序链接成功,但是运行时产生了段错误。因为链接脚本中的text的起始地址不符合linux平台的规范。

使用objdump -h查看可执行文件信息:

首先查看没有链接脚本下的情况:

技术分享图片

查看有链接脚本时生成的可执行文件:

技术分享图片

data和text段的起始地址正是我们链接脚本中指定的地址。

 

将链接脚本的地址改成符合规范的地址:

技术分享图片

技术分享图片

 

 正常运行了。

修改链接脚本:

技术分享图片

重定位s1这个变量,重新编译:

技术分享图片

 

 

继续修改链接脚本:

技术分享图片

 

技术分享图片

 

s2并没有在源文件中定义,而是在链接脚本中定义的,我们在源文件中直接使用这个变量。

再次编译运行:

技术分享图片

可以看到正确运行了。链接脚本中定义的变量在源文件中可以使用。

 

揭开链接器的面纱(中)

标签:使用   生成   代码段   bubuko   png   9.png   src   play   表示   

原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9826608.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!