免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1501 | 回复: 0
打印 上一主题 下一主题

GNU as和ld [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-22 14:52 |只看该作者 |倒序浏览
as基本命令格式
as [选项] [-o objfile] [srcfile.s ...]
objfile是as编译输出目标文件名,srcfile.s是as的输入汇编语言程序名。如果没有使用输出文件名,那么as会默认输出a.out的目标文件。具体的as选项信息可参考man as。终端的标准输入也可以做为as输入文件,想在命令行上明确指明把标准输入作为输入文件需要使用参数‘——’,使用ctrl+D组合来告知as汇编器输入结束。

目标文件主要用于作为链接器ld的输入文件,目标文件中包含已经汇编过的程序代码、协助ld产生可执行程序的信息、以及可能还包含调试符号信息

as汇编器具有对汇编语言程序内置的简单预处理功能。该预处理功能会调整并删除多余的空格字符和制表符;删除注释语句并用空格或者换行符替换他们;把字符常数转换成对应的数值。但是该预处理功能不会对宏定义进行处理,也没有处理包含文件的功能。如果需要这方面的功能,那么可以让汇编程序使用大写的后缀“.S”让as使用gcc的CPP预处理功能。

链接器ld会把输入的目标文件的内容按照一定的规律组合成可执行程序。当as汇编器输出一个目标文件时,该目标文件中的代码默认设置是地址从0开始。此后ld将会在链接过程中为不同的目标文件中的各个部分分配不同的最终地址位置,ld会把程序中的字节块移动到程序运行时的地址处。(Q1:这个过程应该就是链接和装载程序的过程),这些块是作为固定单元进行移动的。他们的长度以及字节次序不会被改变。这样的固定单元被称作是区(或段、部分)。而为区分配运行时刻的地址的操作就被称为重定位操作(Relocation)(Q2:对于普通的程序,是在运行时装载还是已经装载入内存,当我们使用时直接跳转访问?),其中包括调整目标文件中记录的地址,从而让他们对应到恰当的运行时刻地址上。

Q3:gcc编译过程应该用到了as和ld具体的编译过程,之后补充。)

as汇编器输出产生的目标文件中至少具有3个区,分别称为正文(text)、数据(data)和bss区。每个区都有可能是空的。如果没有使用汇编命令把输出放置在‘.text'或者'.data'区中,这些区会仍然存在,但是内容是空的。在一个目标文件中,其text区从地址0开始,之后是data区,在后面是bss区
除此之外,还有绝对地址区(absolute 区),当链接器把各个目标文件组合在一起时,absolute区中的地址始终不变。因此其他区在多个文件链接是不会发生区重叠覆盖的情况,但是absolute区若是多个文件相同则一定会重叠而覆盖。
另外还有一个名为“未定义的”区(Undefined section)。在汇编时,不能确定所在去的任何地址都被设置成{undefined U},U在以后会被填上(不懂??)。因为数值总是有定义的,所以出现未定义地址的唯一途径仅仅涉及未定义的符号。对于一个称为公共块(common block)的引用就是这样一种符合:在汇编时她的值未知,因此它在undefined区中。

A2:动态装入的思想。其想法是非常简单的,即一个函数只有当它被调用时,其所在的模块才会被装入内存。所有的模块都以一种可重定位的装入格式存放在磁盘上。首先,主程序被装入内存并开始运行。当一个模块需要调用另一个模块中的函数时,首先要检查含有被调用函数的模块是否已装入内存。如果该模块尚未被装入内存,那么将由负责重定位的链接装入器将该模块装入内存,同时更新此程序的地址表以反应这一变化。之后,控制便转移到了新装入的模块中被调用的函数那里。
http://www.ibm.com/developerworks/cn/linux/l-dynlink/index.html
(程序的链接和装入及Linux下动态链接的实现,讲的很详细啊!)

注:汇编是指,汇编器将汇编程序生成目标文件的过程。

链接器ld会把程序所有的目标文件中的text区放在相邻的地址处。我们习惯上所有的text区实际就是指其所有目标文件text区组合构成的整个地址区域,对data和bss去的理解也同样。

bss区用于存储局部公共变量,你可以在bss区中分配空间,但是在程序运行之前不能在其中放置数据,因为当程序刚开始运行时,bss区中所有字节内容将被清零。’.lcomm'汇编命令用户在bss区中定义一个符号;'.comm'可用于在bss区中声明一个公共符号。

对于每个区都可以有编号0-8192的子区存在,编址在同一子区的对象会在目标文件中放置在一起,若没有指定子区号则直接默认放置在0号子区,子区存放的位置按照编号从小到大排放。例,.text 1
Q4:是所有目标文件的0子区放一起然后是所有目标文件的1子区放一起,还是只是每个目标文件按0子区1子区组织???)
(A4:按书上的理解应该是前者整体的排列顺序是text data bss 然后text可以分为0、1、2等等)

(A3:.c源文件->cpp(预处理)->.c(纯C文件)->cc(编译器)->汇编程序(.s)->as(汇编器)->.o(目标文件)->ld(链接器)(链接.a库文件)->可执行文件
在前处理阶段中,gcc会把C程序传递给c前处理器CPP,对C语言程序中指示符和宏进行替换处理,输出纯C语言代码:在编译阶段,gcc把C语言程序编译生成对应的与机器相关的as汇编语言代码:在汇编阶段,as汇编器会把汇编代码转换成机器指令,并以特定二进制格式输出保存在目标文件中;最后GNU ld链接器把程序的相关目标文件组合链接在一起,生成可执行映像文件。)

gcc [选项] [-o outfile] infile ...

其中infile是输入的C语言文件;outfile是编译产生的输出文件。对于某次编译过程,并非一定要全部执行这四个步骤,使用命令行选项可以令gcc编译过程在某个处理阶段后就停止执行。例如,使用'-S'选项可以让gcc在输出C程序对应的汇编程序之后就停止运行;使用‘-c'选项可以让gcc只生成目标文件而不执行链接处理(???不执行链接是什么意思)。






虽说简单,但是看起来好累啊,主要是自己底子差了吧,自学果然不如跟老师来的轻松。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/110573/showart_2157763.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP