找工作前学习网上流行的《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:
不知道大家明白了不。 |