打印

ld之解『原』

[复制链接]
107|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
第三章|  楼主 | 2018-10-5 17:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
找工作前学习网上流行的《S3C2410完全开发流程》时,碰到这么一个 问题,就是Makfile中有一个出现了ld,当时我不知道为什么要这句,试着把ld那句注释掉,结果死活不能make通过;当时查了N多资料,就是没找 到。今天下午上自习时,仔细看了下昨天借的Richard Blum著《Assembly Language》『中文版』;呵呵,仔细看了两个小时,没白看,无意中把前面的问题给解决了,呵呵。

        因为汇编程序被转化成可执行文件时,连接器必须知道指令码中的起始地址。为了解决这个问题,GUN汇编器声明一个默认标签,或者说是标志符,它就是_start。如果连接器找不到_start,就会生成错误信息;错误信息我就不贴出来了。当然也可以使用_start以为的标签作为起始地点;但是必须通过-e来说明。

        比如有一个汇编文件cpuid.s;它转化成可执行的文件cpuid。是通过:

          as -o cpuid.o cpuid.s     #起始标签为_start

          ld -o cpuid cpuid.o

或:

         as -o cpuid.o cpuid.s     #起始标签为_start1

           ld -e _start1 -o cpuid cpuid.o

          我们知道GCC它不仅能编译汇编语言,还能编译高级语言如C语言。那么GCC它又是以什么标签来作为起始地址?我们知道C语言中至少有main函数;所以main便是gcc要找的标签。如果要用gcc来编译上面的cpuid.s,必须把源文件中的

          .globl _start

         _start:   

改为.globl main

         main:

         不知道大家明白了不。

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

380

主题

380

帖子

0

粉丝