软件开发--链接器

一.链接器上

链接器的意义--链接器的主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确的衔接
A.目标文件的秘密
1.各个段没有具体的起始地址,只有段大小信息
2.各个标识符没有实际地址,只有段中的相对地址
3.段和标识符的实际地址需要链接器具体确定
链接器的工作内容--将目标文件和库文件合为最终的可执行程序
1.合并各个目标文件中的段(.text .data .bss)
2.确定各个段和段中标识符的最终地址(重定位)
运行的示例

根据之前一篇博客中的开发中的工具可以知道,同时使用nm命令可以看到标出红线的都处在段标识U(未定义的标识中)

而在对test.out文件进行nm命令后 可以看到之前未被定义的标识都处在相对于的标识段
Q:main()函数是第一个被调用执行的函数吗?
默认情况下(gcc)
1.程序加载后,_start()是第一个被调用执行的函数
2._start()函数准备好参数后立即调用_libc_start_main()函数
3._libc_start_main()初始化运行环境后调用main()函数执行
示例及说明

该示例就是通过简单的一段程序来对main函数是否是第一个被调用执行的函数,通过上篇博客中的反编译命令objdump使其生成result.txt文件来对汇编语言进行查看
可以看出对main进行查找时找到其地址值,然后将其地址值进行查找,发现在_start()函数中,此时进行的操作时将其地址值压入堆空间中,可以看到在之后对_libc_start_main()函数进行了调用
_libc_start_main()函数的作用
1.调用_libc_csu_init()函数(完成必要的初始化操作)
2.启动程序的第一个线程(主线程),main()为线程入口
3.注册_libc_csu_fini()函数(程序运行终止时被调用)

Q:链接器根据什么原则完成具体工作?
链接脚本的概念和意义
1.链接脚本用于描述链接器处理目标文件和库文件的方式‘
a.合并各个目标文件
b.重定位各个段的起始地址
c.重定位各个符号的最终地址

示例

上面的两段程序分别为简单的输出程序和脚本程序,运行的结果如图所示

发现在脚本语言中,出现了段错误的问题
注意事项:
1.各个段的链接地址必须符合具体平台的规范
2.链接脚本中能够直接定义标识符并指定存储地址
3.链接脚本中能够指定源代码中标识符的存储地址

运行objdump -h命令查看目标文件中的详细段信息

由该结果可以看出,出现段错误的原因,对其进行修改即可

**二.C语言在的内嵌汇编

A.内嵌汇编的语法格式


简单示例:


在运行了反编译objdump -S 命令后可以看到红线标出的寄存器的关联和动作**

编译器的动作:
1.将result关联到某个适合的寄存器
2.将input关联到另一个适合的寄存器
3.通过寄存器间接操作变量

常用的限制符的说明

三 链接器下

课程实验
1.编写一个体积受限的可执行程序
2.通过makefile完成代码编译
3.运行后在屏幕打印数据
解决方案设计
1.通过内嵌汇编定义打印函数和退出函数(INT 80H)
2.通过链接脚本自定义入口函数(不依赖任何库和GCC内置功能)
3.删除可执行程序中的无用信息(无用段信息,调试信息,等)
工具
1.ld命令
a.GNU的链接器,将目标文件链接为可执行程序
b.GCC编译器集中的一员,重要的幕后工作者
2.ld -static
a.-static表示ld使用静态链接的方式来产生最终程序,而不是默认的动态链接方式
3.gcc -fno-builtin
-fno-builtin参数用于关闭GCC内置函数的功能
示例及运行结果


运行的结果如图所示

小结:
1.链接器根据链接脚本中的描述完成具体的工作
2.链接脚本用于指定各个段的地址和标识符的地址
3.SECTIONS命令确定可执行程序中的段信息
4.MEMORY命令对存储区域进行重定义
5.ENTRY命令指定可执行程序的入口函数
6.C语言中支持直接嵌入汇编语言进行编程
7.通过寄存器到变量的关联完成汇编到c语言的交互
8.内嵌汇编代码时,通过占位符指定交互的变量
9.限制符指示编译器将适合的寄存器关联到变量
10.通过内嵌汇编能够直接使用系统服务
11.对于资源受限的嵌入式设备,需要考虑可执行程序的大小
12.通过内嵌汇编直接使用系统服务能够避开相关库的使用

原文地址:https://blog.51cto.com/13475106/2366229

时间: 2025-01-11 06:41:34

软件开发--链接器的相关文章

软件开发--调试器GDB

一.GDB介绍 A.GDB1.GNU项目中的调试器2.能够追踪程序的执行,也能够恢复程序崩溃前的状态B.GDB的重要性1.软件不是一次性开发完成的(是软件就有bug,是程序就有问题)2.调试时软件开发过程中不可或缺的技术C.GDB的常规应用1.自定义程序的启动方式(指定影响程序运行的参数)2.设置条件断点(在条件满足时暂停程序的执行)3.回溯检查导致程序异常结束的原因4.动态改变程序执行流(定位问题的辅助方式)D.GDB的启动方式1.直接启动--gdb ,gdb test.out ,gdb te

【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)

作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42239705  参考博客 : [嵌入式开发]嵌入式 开发环境 (远程登录 | 文件共享 | NFS TFTP 服务器 | 串口连接 | Win8.1 + RedHat Enterprise 6.3 + Vmware11) 开发环境 : -- 操作系统 : Vmware11 + RedHat6.3 企业版 + Win8.1; -- 硬件 : OK-6410-A 开发

谈谈编程器软件开发与设计

*************************************************************************************************************************** 作者:EasyWave                                                   时间:2014.05.24 类别:协议标准-编程器简介                                  声明:

Day4 - Python基础4 迭代器、装饰器、软件开发规范

Python之路,Day4 - Python基础4 (new版) 本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需求,看列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],我要求你把列表里的每个值加1,你怎么实现?你可能会想到2种方式 >>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>

Python_Day5_迭代器、装饰器、软件开发规范

本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 1.列表生成式,迭代器&生成器 列表生成 >>> a = [i+1 for i in range(10)] >>> a [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 生成器 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访

生成器 迭代器,装饰器 ,软件开发规范

一.生成器 1.列表生成式 有列表data=[1,2,3,4],要求将列表data里面的数据均加1:  除了循环,可以用列表生成式一行写出替代多行的循环 1 data=[1,2,3,4] 2 data=[i+1 for i in data] 3 print(data) 生成式中也可以写三元运算 #需求:列表中小于3的都*2,大于等于3的+1 data=[i*2 if i<3 else i+1 for i in data] 列表生成式,是python内置的一种直接生成list的表达式,可以直接生成

《开源框架那点事儿11》:软件开发杂谈

杂谈之中的一个:技术仅仅是成功的一点点基础条件.真正还是得靠做人 话说,有位lianzi同学.水平不错.思想超前,签约阿里如今在百度实习,曾经由于喷我的贴又没有啥理由,因此告诉他离我远一点.可是近期他又回到我群里了.一直伸个大拇指,我说啥他都是大拇指,认为怪怪的.总不是那么个感觉,最终憋了一段时间,又恢复了正常的沟通方式,聊天实录: [传说]杭州-悠然 18:31:13 lianzi本色最终出来了. [传说]杭州-悠然 18:31:30 我学得这样才是你自己.你天天伸个大拇指.我都认为不像你了.

什么是链接器脚本?

链接器脚本 链接定位是系统级软件开发过程中必不可少的一部分,嵌入式软件开发均属于系统级开发,绝大部分嵌入式软件都涉及到链接定位脚本文件;链接定位脚本使得我们的目标代码组织更加灵活. 脚本的构成: 1.      段 一个可执行程序通常包括:代码段:存放代码的地方 数据段:存放初始化之后的全局变量 Bss段:存放未初始化的全局变量 同样,在用于链接这个程序的链接器脚本中,就会反应这几个段的信息. 2.      起始链接地址 3.      对齐 4.      变量 5.      代码段首文件

学习软件开发应该看的书

学习软件开发应该看的书 来源: 李越甲的日志 1. C语言提升 <c和指针> <c缺陷和陷阱> <c专家编程> 这三本书是一个初级C程序员必看的三本书,同时也是应届新员工必须好好学习的教材,非常适合刚毕业的大学生学习 2.  C++语言提升 <Effective C++:改善程序与设计的55个具体做法> <More Effective C++:35个改善编程与设计的有效方法(中文版)> <C++沉思录> <C++Template