1.1. 从源码到可执行程序(主要有三个步骤:预编译、编译、链接)

    1.1.1. 预编译

      a. 预编译器执行。譬如C中的宏定义就是由预编译器处理,注释等也是由预编译器处理的。

    1.1.2. 编译

      a. 由编译器来执行。把源码.c .S编程机器码.o文件。所以可以看到每个源码.s .c文件编译后都有相对应的.o文件

    1.1.3. 链接

      a. 由链接器来执行。把.o文件中的各函数(段)按照一定规则(链接脚本来指定)累积在一起,

形成可执行文件。

  1.2. 链接脚本究竟要做什么?

    1.2.1. 链接脚本其实是个规则文件,

      a. 他是程序员用来指挥链接器工作的。链接器会参考链接脚本,并且使用其中规定的规则来处理.o文件中那些段,将其链接成一个可执行程序。

    1.2.2. 常见链接脚本命令

      1.2.2.1 ENTRY(SYMBOL)

        a. 将SYMBOL的值设置成入口地址。一般设置为_start

      1.2.2.2. OUTPUT(FILENAME)

        a. 定义输出文件的名字。可以用它来指定默认的输出文件名称。当然我们一般都用手动-o进行指定,如果我们没有进行手动指定的话,输出文件名称就以这个FILENAME为输出文件名。

      1.2.2.3. OUTPUT_FORMAT(default, big, little)

        a. 定义3种输出文件的格式。若有命令行选项-EB(大端),则使用第二个输出格式,有命令行指定-EL(小端),则使用第三个格式。否则使用默认的default输出格式。

      1.2.2.4. OUT_ARCH(arch)

        a. 设置输出文件的体系架构

      1.2.2.5. SECTIONS命令

        a. 最重要的,最基本的,也是最主要的命令,它告诉链接器如何把输入文件的各个section输出到目标文件中的各个section中去

        b. 'SECTIONS'是一个功能很强大的命令. 这里这们会描述一个很简单的使用。让我们假设你的程序只有代码段,初始化过的数据段, 和未初始化过的数据段. 这些会存在于'.text','.data'和'.bss'段

SECTIONS命令的格式如下:

  SECTIONS 

        {

                一条或者多条section-command

                或者符号赋值语句

        }

        section-command的常见格式如下:

        secname [address] : [AT(LMA)] 

        { contents } 


PS :首先中括号的选项是可选的,可以不写
View Code

相关文章: